|
|
@ -152,7 +152,7 @@ void DrawLine3D(Vector3 startPos, Vector3 endPos, Color color) |
|
|
|
// WARNING: Be careful with internal buffer vertex alignment |
|
|
|
// when using RL_LINES or RL_TRIANGLES, data is aligned to fit |
|
|
|
// lines-triangles-quads in the same indexed buffers!!! |
|
|
|
rlCheckRenderBatchLimit(8); |
|
|
|
o">//rlCheckRenderBatchLimit(8); |
|
|
|
|
|
|
|
rlBegin(RL_LINES); |
|
|
|
rlColor4ub(color.r, color.g, color.b, color.a); |
|
|
@ -164,7 +164,7 @@ void DrawLine3D(Vector3 startPos, Vector3 endPos, Color color) |
|
|
|
// Draw a point in 3D space, actually a small line |
|
|
|
void DrawPoint3D(Vector3 position, Color color) |
|
|
|
{ |
|
|
|
rlCheckRenderBatchLimit(8); |
|
|
|
o">//rlCheckRenderBatchLimit(8); |
|
|
|
|
|
|
|
rlPushMatrix(); |
|
|
|
rlTranslatef(position.x, position.y, position.z); |
|
|
@ -179,7 +179,7 @@ void DrawPoint3D(Vector3 position, Color color) |
|
|
|
// Draw a circle in 3D world space |
|
|
|
void DrawCircle3D(Vector3 center, float radius, Vector3 rotationAxis, float rotationAngle, Color color) |
|
|
|
{ |
|
|
|
rlCheckRenderBatchLimit(2*36); |
|
|
|
o">//rlCheckRenderBatchLimit(2*36); |
|
|
|
|
|
|
|
rlPushMatrix(); |
|
|
|
rlTranslatef(center.x, center.y, center.z); |
|
|
@ -200,7 +200,7 @@ void DrawCircle3D(Vector3 center, float radius, Vector3 rotationAxis, float rota |
|
|
|
// Draw a color-filled triangle (vertex in counter-clockwise order!) |
|
|
|
void DrawTriangle3D(Vector3 v1, Vector3 v2, Vector3 v3, Color color) |
|
|
|
{ |
|
|
|
rlCheckRenderBatchLimit(8); |
|
|
|
o">//rlCheckRenderBatchLimit(8); |
|
|
|
|
|
|
|
rlBegin(RL_TRIANGLES); |
|
|
|
rlColor4ub(color.r, color.g, color.b, color.a); |
|
|
@ -215,7 +215,7 @@ void DrawTriangleStrip3D(Vector3 *points, int pointCount, Color color) |
|
|
|
{ |
|
|
|
if (pointCount >= 3) |
|
|
|
{ |
|
|
|
rlCheckRenderBatchLimit(3*(pointCount - 2)); |
|
|
|
o">//rlCheckRenderBatchLimit(3*(pointCount - 2)); |
|
|
|
|
|
|
|
rlBegin(RL_TRIANGLES); |
|
|
|
rlColor4ub(color.r, color.g, color.b, color.a); |
|
|
@ -247,7 +247,7 @@ void DrawCube(Vector3 position, float width, float height, float length, Color c |
|
|
|
float y = 0.0f; |
|
|
|
float z = 0.0f; |
|
|
|
|
|
|
|
rlCheckRenderBatchLimit(36); |
|
|
|
o">//rlCheckRenderBatchLimit(36); |
|
|
|
|
|
|
|
rlPushMatrix(); |
|
|
|
// NOTE: Transformation is applied in inverse order (scale -> rotate -> translate) |
|
|
@ -328,7 +328,7 @@ void DrawCubeWires(Vector3 position, float width, float height, float length, Co |
|
|
|
float y = 0.0f; |
|
|
|
float z = 0.0f; |
|
|
|
|
|
|
|
rlCheckRenderBatchLimit(36); |
|
|
|
o">//rlCheckRenderBatchLimit(36); |
|
|
|
|
|
|
|
rlPushMatrix(); |
|
|
|
rlTranslatef(position.x, position.y, position.z); |
|
|
@ -405,7 +405,7 @@ void DrawCubeTexture(Texture2D texture, Vector3 position, float width, float hei |
|
|
|
float y = position.y; |
|
|
|
float z = position.z; |
|
|
|
|
|
|
|
rlCheckRenderBatchLimit(36); |
|
|
|
o">//rlCheckRenderBatchLimit(36); |
|
|
|
|
|
|
|
rlSetTexture(texture.id); |
|
|
|
|
|
|
@ -468,7 +468,7 @@ void DrawCubeTextureRec(Texture2D texture, Rectangle source, Vector3 position, f |
|
|
|
float texWidth = (float)texture.width; |
|
|
|
float texHeight = (float)texture.height; |
|
|
|
|
|
|
|
rlCheckRenderBatchLimit(36); |
|
|
|
o">//rlCheckRenderBatchLimit(36); |
|
|
|
|
|
|
|
rlSetTexture(texture.id); |
|
|
|
|
|
|
@ -555,8 +555,8 @@ void DrawSphere(Vector3 centerPos, float radius, Color color) |
|
|
|
// Draw sphere with extended parameters |
|
|
|
void DrawSphereEx(Vector3 centerPos, float radius, int rings, int slices, Color color) |
|
|
|
{ |
|
|
|
int numVertex = (rings + 2)*slices*6; |
|
|
|
rlCheckRenderBatchLimit(numVertex); |
|
|
|
o">//int numVertex = (rings + 2)*slices*6; |
|
|
|
o">//rlCheckRenderBatchLimit(numVertex); |
|
|
|
|
|
|
|
rlPushMatrix(); |
|
|
|
// NOTE: Transformation is applied in inverse order (scale -> translate) |
|
|
@ -598,8 +598,8 @@ void DrawSphereEx(Vector3 centerPos, float radius, int rings, int slices, Color |
|
|
|
// Draw sphere wires |
|
|
|
void DrawSphereWires(Vector3 centerPos, float radius, int rings, int slices, Color color) |
|
|
|
{ |
|
|
|
int numVertex = (rings + 2)*slices*6; |
|
|
|
rlCheckRenderBatchLimit(numVertex); |
|
|
|
o">//int numVertex = (rings + 2)*slices*6; |
|
|
|
o">//rlCheckRenderBatchLimit(numVertex); |
|
|
|
|
|
|
|
rlPushMatrix(); |
|
|
|
// NOTE: Transformation is applied in inverse order (scale -> translate) |
|
|
@ -645,8 +645,8 @@ void DrawCylinder(Vector3 position, float radiusTop, float radiusBottom, float h |
|
|
|
{ |
|
|
|
if (sides < 3) sides = 3; |
|
|
|
|
|
|
|
int numVertex = sides*6; |
|
|
|
rlCheckRenderBatchLimit(numVertex); |
|
|
|
o">//int numVertex = sides*6; |
|
|
|
o">//rlCheckRenderBatchLimit(numVertex); |
|
|
|
|
|
|
|
rlPushMatrix(); |
|
|
|
rlTranslatef(position.x, position.y, position.z); |
|
|
@ -704,8 +704,8 @@ void DrawCylinderEx(Vector3 startPos, Vector3 endPos, float startRadius, float e |
|
|
|
{ |
|
|
|
if (sides < 3) sides = 3; |
|
|
|
|
|
|
|
int numVertex = sides*6; |
|
|
|
rlCheckRenderBatchLimit(numVertex); |
|
|
|
o">//int numVertex = sides*6; |
|
|
|
o">//rlCheckRenderBatchLimit(numVertex); |
|
|
|
|
|
|
|
Vector3 direction = { endPos.x - startPos.x, endPos.y - startPos.y, endPos.z - startPos.z }; |
|
|
|
if ((direction.x == 0) && (direction.y == 0) && (direction.z == 0)) return; |
|
|
@ -763,8 +763,8 @@ void DrawCylinderWires(Vector3 position, float radiusTop, float radiusBottom, fl |
|
|
|
{ |
|
|
|
if (sides < 3) sides = 3; |
|
|
|
|
|
|
|
int numVertex = sides*8; |
|
|
|
rlCheckRenderBatchLimit(numVertex); |
|
|
|
o">//int numVertex = sides*8; |
|
|
|
o">//rlCheckRenderBatchLimit(numVertex); |
|
|
|
|
|
|
|
rlPushMatrix(); |
|
|
|
rlTranslatef(position.x, position.y, position.z); |
|
|
@ -797,8 +797,8 @@ void DrawCylinderWiresEx(Vector3 startPos, Vector3 endPos, float startRadius, fl |
|
|
|
{ |
|
|
|
if (sides < 3) sides = 3; |
|
|
|
|
|
|
|
int numVertex = sides*6; |
|
|
|
rlCheckRenderBatchLimit(numVertex); |
|
|
|
o">//int numVertex = sides*6; |
|
|
|
o">//rlCheckRenderBatchLimit(numVertex); |
|
|
|
|
|
|
|
Vector3 direction = { endPos.x - startPos.x, endPos.y - startPos.y, endPos.z - startPos.z }; |
|
|
|
if ((direction.x == 0) && (direction.y == 0) && (direction.z == 0))return; |
|
|
@ -843,7 +843,7 @@ void DrawCylinderWiresEx(Vector3 startPos, Vector3 endPos, float startRadius, fl |
|
|
|
// Draw a plane |
|
|
|
void DrawPlane(Vector3 centerPos, Vector2 size, Color color) |
|
|
|
{ |
|
|
|
rlCheckRenderBatchLimit(4); |
|
|
|
o">//rlCheckRenderBatchLimit(4); |
|
|
|
|
|
|
|
// NOTE: Plane is always created on XZ ground |
|
|
|
rlPushMatrix(); |
|
|
@ -881,7 +881,7 @@ void DrawGrid(int slices, float spacing) |
|
|
|
{ |
|
|
|
int halfSlices = slices/2; |
|
|
|
|
|
|
|
rlCheckRenderBatchLimit((slices + 2)*4); |
|
|
|
o">//rlCheckRenderBatchLimit((slices + 2)*4); |
|
|
|
|
|
|
|
rlBegin(RL_LINES); |
|
|
|
for (int i = -halfSlices; i <= halfSlices; i++) |
|
|
@ -1087,7 +1087,7 @@ void UploadMesh(Mesh *mesh, bool dynamic) |
|
|
|
mesh->vaoId = rlLoadVertexArray(); |
|
|
|
rlEnableVertexArray(mesh->vaoId); |
|
|
|
|
|
|
|
// NOTE: Attributes must be uploaded considering default locations points |
|
|
|
// NOTE: Vertex attributes must be uploaded considering default locations points and available vertex data |
|
|
|
|
|
|
|
// Enable vertex attributes: position (shader-location = 0) |
|
|
|
void *vertices = mesh->animVertices != NULL ? mesh->animVertices : mesh->vertices; |
|
|
@ -1100,6 +1100,9 @@ void UploadMesh(Mesh *mesh, bool dynamic) |
|
|
|
rlSetVertexAttribute(1, 2, RL_FLOAT, 0, 0, 0); |
|
|
|
rlEnableVertexAttribute(1); |
|
|
|
|
|
|
|
// WARNING: When setting default vertex attribute values, the values for each generic vertex attribute |
|
|
|
// is part of current state and it is maintained even if a different program object is used |
|
|
|
|
|
|
|
if (mesh->normals != NULL) |
|
|
|
{ |
|
|
|
// Enable vertex attributes: normals (shader-location = 2) |
|
|
@ -1110,7 +1113,8 @@ void UploadMesh(Mesh *mesh, bool dynamic) |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
// Default color vertex attribute set to WHITE |
|
|
|
// Default vertex attribute: normal |
|
|
|
// WARNING: Default value provided to shader if location available |
|
|
|
float value[3] = { 1.0f, 1.0f, 1.0f }; |
|
|
|
rlSetVertexAttributeDefault(2, value, SHADER_ATTRIB_VEC3, 3); |
|
|
|
rlDisableVertexAttribute(2); |
|
|
@ -1125,8 +1129,9 @@ void UploadMesh(Mesh *mesh, bool dynamic) |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
// Default color vertex attribute set to WHITE |
|
|
|
float value[4] = { 1.0f, 1.0f, 1.0f, 1.0f }; |
|
|
|
// Default vertex attribute: color |
|
|
|
// WARNING: Default value provided to shader if location available |
|
|
|
float value[4] = { 1.0f, 1.0f, 1.0f, 1.0f }; // WHITE |
|
|
|
rlSetVertexAttributeDefault(3, value, SHADER_ATTRIB_VEC4, 4); |
|
|
|
rlDisableVertexAttribute(3); |
|
|
|
} |
|
|
@ -1140,7 +1145,8 @@ void UploadMesh(Mesh *mesh, bool dynamic) |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
// Default tangents vertex attribute |
|
|
|
// Default vertex attribute: tangent |
|
|
|
// WARNING: Default value provided to shader if location available |
|
|
|
float value[4] = { 0.0f, 0.0f, 0.0f, 0.0f }; |
|
|
|
rlSetVertexAttributeDefault(4, value, SHADER_ATTRIB_VEC4, 4); |
|
|
|
rlDisableVertexAttribute(4); |
|
|
@ -1155,7 +1161,8 @@ void UploadMesh(Mesh *mesh, bool dynamic) |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
// Default texcoord2 vertex attribute |
|
|
|
// Default vertex attribute: texcoord2 |
|
|
|
// WARNING: Default value provided to shader if location available |
|
|
|
float value[2] = { 0.0f, 0.0f }; |
|
|
|
rlSetVertexAttributeDefault(5, value, SHADER_ATTRIB_VEC2, 2); |
|
|
|
rlDisableVertexAttribute(5); |
|
|
@ -1293,8 +1300,10 @@ void DrawMesh(Mesh mesh, Material material, Matrix transform) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// Try binding vertex array objects (VAO) |
|
|
|
// or use VBOs if not possible |
|
|
|
// Try binding vertex array objects (VAO) or use VBOs if not possible |
|
|
|
// WARNING: UploadMesh() enables all vertex attributes available in mesh and sets default attribute values |
|
|
|
// for shader expected vertex attributes that are not provided by the mesh (i.e. colors) |
|
|
|
// This could be a dangerous approach because different meshes with different shaders can enable/disable some attributes |
|
|
|
if (!rlEnableVertexArray(mesh.vaoId)) |
|
|
|
{ |
|
|
|
// Bind mesh VBO data: vertex position (shader-location = 0) |
|
|
@ -1326,8 +1335,8 @@ void DrawMesh(Mesh mesh, Material material, Matrix transform) |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
// Set default value for unused attribute |
|
|
|
// NOTE: Required when using default shader and no VAO support |
|
|
|
// Set default value for defined vertex attribute in shader but not provided by mesh |
|
|
|
// WARNING: It could result in GPU undefined behaviour |
|
|
|
float value[4] = { 1.0f, 1.0f, 1.0f, 1.0f }; |
|
|
|
rlSetVertexAttributeDefault(material.shader.locs[SHADER_LOC_VERTEX_COLOR], value, SHADER_ATTRIB_VEC4, 4); |
|
|
|
rlDisableVertexAttribute(material.shader.locs[SHADER_LOC_VERTEX_COLOR]); |
|
|
@ -1353,6 +1362,9 @@ void DrawMesh(Mesh mesh, Material material, Matrix transform) |
|
|
|
if (mesh.indices != NULL) rlEnableVertexBufferElement(mesh.vboId[6]); |
|
|
|
} |
|
|
|
|
|
|
|
// WARNING: Disable vertex attribute color input if mesh can not provide that data (despite location being enabled in shader) |
|
|
|
if (mesh.vboId[3] == 0) rlDisableVertexAttribute(material.shader.locs[SHADER_LOC_VERTEX_COLOR]); |
|
|
|
|
|
|
|
int eyeCount = 1; |
|
|
|
if (rlIsStereoRenderEnabled()) eyeCount = 2; |
|
|
|
|
|
|
@ -1379,14 +1391,17 @@ void DrawMesh(Mesh mesh, Material material, Matrix transform) |
|
|
|
// Unbind all binded texture maps |
|
|
|
for (int i = 0; i < MAX_MATERIAL_MAPS; i++) |
|
|
|
{ |
|
|
|
// Select current shader texture slot |
|
|
|
rlActiveTextureSlot(i); |
|
|
|
|
|
|
|
// Disable texture for active slot |
|
|
|
if ((i == MATERIAL_MAP_IRRADIANCE) || |
|
|
|
(i == MATERIAL_MAP_PREFILTER) || |
|
|
|
(i == MATERIAL_MAP_CUBEMAP)) rlDisableTextureCubemap(); |
|
|
|
else rlDisableTexture(); |
|
|
|
if (material.maps[i].texture.id > 0) |
|
|
|
{ |
|
|
|
// Select current shader texture slot |
|
|
|
rlActiveTextureSlot(i); |
|
|
|
|
|
|
|
// Disable texture for active slot |
|
|
|
if ((i == MATERIAL_MAP_IRRADIANCE) || |
|
|
|
(i == MATERIAL_MAP_PREFILTER) || |
|
|
|
(i == MATERIAL_MAP_CUBEMAP)) rlDisableTextureCubemap(); |
|
|
|
else rlDisableTexture(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// Disable all possible vertex array objects (or VBOs) |
|
|
@ -1568,6 +1583,9 @@ void DrawMeshInstanced(Mesh mesh, Material material, const Matrix *transforms, i |
|
|
|
if (mesh.indices != NULL) rlEnableVertexBufferElement(mesh.vboId[6]); |
|
|
|
} |
|
|
|
|
|
|
|
// WARNING: Disable vertex attribute color input if mesh can not provide that data (despite location being enabled in shader) |
|
|
|
if (mesh.vboId[3] == 0) rlDisableVertexAttribute(material.shader.locs[SHADER_LOC_VERTEX_COLOR]); |
|
|
|
|
|
|
|
int eyeCount = 1; |
|
|
|
if (rlIsStereoRenderEnabled()) eyeCount = 2; |
|
|
|
|
|
|
@ -1594,14 +1612,17 @@ void DrawMeshInstanced(Mesh mesh, Material material, const Matrix *transforms, i |
|
|
|
// Unbind all binded texture maps |
|
|
|
for (int i = 0; i < MAX_MATERIAL_MAPS; i++) |
|
|
|
{ |
|
|
|
// Select current shader texture slot |
|
|
|
rlActiveTextureSlot(i); |
|
|
|
|
|
|
|
// Disable texture for active slot |
|
|
|
if ((i == MATERIAL_MAP_IRRADIANCE) || |
|
|
|
(i == MATERIAL_MAP_PREFILTER) || |
|
|
|
(i == MATERIAL_MAP_CUBEMAP)) rlDisableTextureCubemap(); |
|
|
|
else rlDisableTexture(); |
|
|
|
if (material.maps[i].texture.id > 0) |
|
|
|
{ |
|
|
|
// Select current shader texture slot |
|
|
|
rlActiveTextureSlot(i); |
|
|
|
|
|
|
|
// Disable texture for active slot |
|
|
|
if ((i == MATERIAL_MAP_IRRADIANCE) || |
|
|
|
(i == MATERIAL_MAP_PREFILTER) || |
|
|
|
(i == MATERIAL_MAP_CUBEMAP)) rlDisableTextureCubemap(); |
|
|
|
else rlDisableTexture(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// Disable all possible vertex array objects (or VBOs) |
|
|
|