9db9df7380
The texture limit used to be 1000, but when materials with multiple textures were introduced in 3.2.0, the limit was reduced to 100. Since there are model out there that already have more than 100 and fewer than 1000 textures/materials, we should maintain backwards compat. Fixes #1877 PiperOrigin-RevId: 659901629 Change-Id: If0f6d0500d1d808bc3ec2d87d4a3faf24007da59
178 lines
7.9 KiB
C
178 lines
7.9 KiB
C
// Copyright 2021 DeepMind Technologies Limited
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
|
|
#ifndef MUJOCO_MJRENDER_H_
|
|
#define MUJOCO_MJRENDER_H_
|
|
|
|
#include <mujoco/mjmodel.h>
|
|
|
|
#if defined(__cplusplus)
|
|
extern "C" {
|
|
#endif
|
|
|
|
#define mjNAUX 10 // number of auxiliary buffers
|
|
#define mjMAXTEXTURE 1000 // maximum number of textures
|
|
#define mjMAXMATERIAL 1000 // maximum number of materials with textures
|
|
|
|
//---------------------------------- primitive types (mjt) -----------------------------------------
|
|
|
|
typedef enum mjtGridPos_ { // grid position for overlay
|
|
mjGRID_TOPLEFT = 0, // top left
|
|
mjGRID_TOPRIGHT, // top right
|
|
mjGRID_BOTTOMLEFT, // bottom left
|
|
mjGRID_BOTTOMRIGHT, // bottom right
|
|
mjGRID_TOP, // top center
|
|
mjGRID_BOTTOM, // bottom center
|
|
mjGRID_LEFT, // left center
|
|
mjGRID_RIGHT // right center
|
|
} mjtGridPos;
|
|
|
|
|
|
typedef enum mjtFramebuffer_ { // OpenGL framebuffer option
|
|
mjFB_WINDOW = 0, // default/window buffer
|
|
mjFB_OFFSCREEN // offscreen buffer
|
|
} mjtFramebuffer;
|
|
|
|
typedef enum mjtDepthMap_ { // depth mapping for `mjr_readPixels`
|
|
mjDEPTH_ZERONEAR = 0, // standard depth map; 0: znear, 1: zfar
|
|
mjDEPTH_ZEROFAR = 1 // reversed depth map; 1: znear, 0: zfar
|
|
} mjtDepthMap;
|
|
|
|
typedef enum mjtFontScale_ { // font scale, used at context creation
|
|
mjFONTSCALE_50 = 50, // 50% scale, suitable for low-res rendering
|
|
mjFONTSCALE_100 = 100, // normal scale, suitable in the absence of DPI scaling
|
|
mjFONTSCALE_150 = 150, // 150% scale
|
|
mjFONTSCALE_200 = 200, // 200% scale
|
|
mjFONTSCALE_250 = 250, // 250% scale
|
|
mjFONTSCALE_300 = 300 // 300% scale
|
|
} mjtFontScale;
|
|
|
|
|
|
typedef enum mjtFont_ { // font type, used at each text operation
|
|
mjFONT_NORMAL = 0, // normal font
|
|
mjFONT_SHADOW, // normal font with shadow (for higher contrast)
|
|
mjFONT_BIG // big font (for user alerts)
|
|
} mjtFont;
|
|
|
|
|
|
struct mjrRect_ { // OpenGL rectangle
|
|
int left; // left (usually 0)
|
|
int bottom; // bottom (usually 0)
|
|
int width; // width (usually buffer width)
|
|
int height; // height (usually buffer height)
|
|
};
|
|
typedef struct mjrRect_ mjrRect;
|
|
|
|
|
|
//---------------------------------- mjrContext ----------------------------------------------------
|
|
|
|
struct mjrContext_ { // custom OpenGL context
|
|
// parameters copied from mjVisual
|
|
float lineWidth; // line width for wireframe rendering
|
|
float shadowClip; // clipping radius for directional lights
|
|
float shadowScale; // fraction of light cutoff for spot lights
|
|
float fogStart; // fog start = stat.extent * vis.map.fogstart
|
|
float fogEnd; // fog end = stat.extent * vis.map.fogend
|
|
float fogRGBA[4]; // fog rgba
|
|
int shadowSize; // size of shadow map texture
|
|
int offWidth; // width of offscreen buffer
|
|
int offHeight; // height of offscreen buffer
|
|
int offSamples; // number of offscreen buffer multisamples
|
|
|
|
// parameters specified at creation
|
|
int fontScale; // font scale
|
|
int auxWidth[mjNAUX]; // auxiliary buffer width
|
|
int auxHeight[mjNAUX]; // auxiliary buffer height
|
|
int auxSamples[mjNAUX]; // auxiliary buffer multisamples
|
|
|
|
// offscreen rendering objects
|
|
unsigned int offFBO; // offscreen framebuffer object
|
|
unsigned int offFBO_r; // offscreen framebuffer for resolving multisamples
|
|
unsigned int offColor; // offscreen color buffer
|
|
unsigned int offColor_r; // offscreen color buffer for resolving multisamples
|
|
unsigned int offDepthStencil; // offscreen depth and stencil buffer
|
|
unsigned int offDepthStencil_r; // offscreen depth and stencil buffer for multisamples
|
|
|
|
// shadow rendering objects
|
|
unsigned int shadowFBO; // shadow map framebuffer object
|
|
unsigned int shadowTex; // shadow map texture
|
|
|
|
// auxiliary buffers
|
|
unsigned int auxFBO[mjNAUX]; // auxiliary framebuffer object
|
|
unsigned int auxFBO_r[mjNAUX]; // auxiliary framebuffer object for resolving
|
|
unsigned int auxColor[mjNAUX]; // auxiliary color buffer
|
|
unsigned int auxColor_r[mjNAUX]; // auxiliary color buffer for resolving
|
|
|
|
// materials with textures
|
|
int mat_texid[mjMAXMATERIAL*mjNTEXROLE]; // material texture ids (-1: no texture)
|
|
int mat_texuniform[mjMAXMATERIAL]; // texture repetition for 2d mapping
|
|
int mat_texrepeat[mjMAXMATERIAL*2]; // texture repetition for 2d mapping
|
|
|
|
// texture objects and info
|
|
int ntexture; // number of allocated textures
|
|
int textureType[mjMAXTEXTURE]; // type of texture (mjtTexture) (ntexture)
|
|
unsigned int texture[mjMAXTEXTURE]; // texture names
|
|
|
|
// displaylist starting positions
|
|
unsigned int basePlane; // all planes from model
|
|
unsigned int baseMesh; // all meshes from model
|
|
unsigned int baseHField; // all height fields from model
|
|
unsigned int baseBuiltin; // all builtin geoms, with quality from model
|
|
unsigned int baseFontNormal; // normal font
|
|
unsigned int baseFontShadow; // shadow font
|
|
unsigned int baseFontBig; // big font
|
|
|
|
// displaylist ranges
|
|
int rangePlane; // all planes from model
|
|
int rangeMesh; // all meshes from model
|
|
int rangeHField; // all hfields from model
|
|
int rangeBuiltin; // all builtin geoms, with quality from model
|
|
int rangeFont; // all characters in font
|
|
|
|
// skin VBOs
|
|
int nskin; // number of skins
|
|
unsigned int* skinvertVBO; // skin vertex position VBOs (nskin)
|
|
unsigned int* skinnormalVBO; // skin vertex normal VBOs (nskin)
|
|
unsigned int* skintexcoordVBO; // skin vertex texture coordinate VBOs (nskin)
|
|
unsigned int* skinfaceVBO; // skin face index VBOs (nskin)
|
|
|
|
// character info
|
|
int charWidth[127]; // character widths: normal and shadow
|
|
int charWidthBig[127]; // chacarter widths: big
|
|
int charHeight; // character heights: normal and shadow
|
|
int charHeightBig; // character heights: big
|
|
|
|
// capabilities
|
|
int glInitialized; // is OpenGL initialized
|
|
int windowAvailable; // is default/window framebuffer available
|
|
int windowSamples; // number of samples for default/window framebuffer
|
|
int windowStereo; // is stereo available for default/window framebuffer
|
|
int windowDoublebuffer; // is default/window framebuffer double buffered
|
|
|
|
// framebuffer
|
|
int currentBuffer; // currently active framebuffer: mjFB_WINDOW or mjFB_OFFSCREEN
|
|
|
|
// pixel output format
|
|
int readPixelFormat; // default color pixel format for mjr_readPixels
|
|
|
|
// depth output format
|
|
int readDepthMap; // depth mapping: mjDEPTH_ZERONEAR or mjDEPTH_ZEROFAR
|
|
};
|
|
typedef struct mjrContext_ mjrContext;
|
|
|
|
#if defined(__cplusplus)
|
|
}
|
|
#endif
|
|
#endif // MUJOCO_MJRENDER_H_
|