Review contributed examples
This commit is contained in:
parent
5f79ad9765
commit
8e15dae5ed
9 changed files with 129 additions and 145 deletions
|
@ -2,29 +2,21 @@
|
||||||
*
|
*
|
||||||
* raylib [core] example - quat conversions
|
* raylib [core] example - quat conversions
|
||||||
*
|
*
|
||||||
* Welcome to raylib!
|
* Generally you should really stick to eulers OR quats...
|
||||||
|
* This tests that various conversions are equivalent.
|
||||||
*
|
*
|
||||||
* generally you should really stick to eulers OR quats...
|
* This example has been created using raylib 3.5 (www.raylib.com)
|
||||||
* This tests that various conversions are equivilant.
|
|
||||||
*
|
|
||||||
* You can find all basic examples on [C:\raylib\raylib\examples] directory and
|
|
||||||
* raylib official webpage: [www.raylib.com]
|
|
||||||
*
|
|
||||||
* Enjoy using raylib. :)
|
|
||||||
*
|
|
||||||
* This example has been created using raylib 1.0 (www.raylib.com)
|
|
||||||
* raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details)
|
* raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details)
|
||||||
*
|
*
|
||||||
* Copyright (c) 2013-2020 Ramon Santamaria (@raysan5)
|
* Example contributed by @chriscamacho and @codifies, reviewed by Ramon Santamaria (@raysan5)
|
||||||
|
*
|
||||||
|
* Copyright (c) 2020 @chriscamacho and @codifies
|
||||||
*
|
*
|
||||||
********************************************************************************************/
|
********************************************************************************************/
|
||||||
|
|
||||||
#include "raylib.h"
|
#include "raylib.h"
|
||||||
#include "raymath.h"
|
|
||||||
|
|
||||||
#ifndef PI2
|
#include "raymath.h"
|
||||||
#define PI2 PI*2
|
|
||||||
#endif
|
|
||||||
|
|
||||||
int main(void)
|
int main(void)
|
||||||
{
|
{
|
||||||
|
@ -56,15 +48,17 @@ int main(void)
|
||||||
while (!WindowShouldClose()) // Detect window close button or ESC key
|
while (!WindowShouldClose()) // Detect window close button or ESC key
|
||||||
{
|
{
|
||||||
// Update
|
// Update
|
||||||
if (!IsKeyDown(KEY_SPACE)) {
|
//--------------------------------------------------------------------------------------
|
||||||
|
if (!IsKeyDown(KEY_SPACE))
|
||||||
|
{
|
||||||
v1.x += 0.01;
|
v1.x += 0.01;
|
||||||
v1.y += 0.03;
|
v1.y += 0.03;
|
||||||
v1.z += 0.05;
|
v1.z += 0.05;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (v1.x > PI2) v1.x-=PI2;
|
if (v1.x > PI*2) v1.x -= PI*2;
|
||||||
if (v1.y > PI2) v1.y-=PI2;
|
if (v1.y > PI*2) v1.y -= PI*2;
|
||||||
if (v1.z > PI2) v1.z-=PI2;
|
if (v1.z > PI*2) v1.z -= PI*2;
|
||||||
|
|
||||||
q1 = QuaternionFromEuler(v1.x, v1.y, v1.z);
|
q1 = QuaternionFromEuler(v1.x, v1.y, v1.z);
|
||||||
m1 = MatrixRotateZYX(v1);
|
m1 = MatrixRotateZYX(v1);
|
||||||
|
@ -74,9 +68,12 @@ int main(void)
|
||||||
m3 = QuaternionToMatrix(q1);
|
m3 = QuaternionToMatrix(q1);
|
||||||
|
|
||||||
v2 = QuaternionToEuler(q1);
|
v2 = QuaternionToEuler(q1);
|
||||||
v2.x*=DEG2RAD; v2.y*=DEG2RAD; v2.z*=DEG2RAD;
|
v2.x *= DEG2RAD;
|
||||||
|
v2.y *= DEG2RAD;
|
||||||
|
v2.z *=DEG2RAD;
|
||||||
|
|
||||||
m4 = MatrixRotateZYX(v2);
|
m4 = MatrixRotateZYX(v2);
|
||||||
|
//--------------------------------------------------------------------------------------
|
||||||
|
|
||||||
// Draw
|
// Draw
|
||||||
//----------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------
|
||||||
|
@ -94,17 +91,16 @@ int main(void)
|
||||||
mod.transform = m4;
|
mod.transform = m4;
|
||||||
DrawModel(mod, (Vector3){0,0,-1},1.0,RED);
|
DrawModel(mod, (Vector3){0,0,-1},1.0,RED);
|
||||||
|
|
||||||
|
|
||||||
DrawGrid(10, 1.0f);
|
DrawGrid(10, 1.0f);
|
||||||
|
|
||||||
EndMode3D();
|
EndMode3D();
|
||||||
|
|
||||||
if (v2.x<0) v2.x+=PI2;
|
if (v2.x < 0) v2.x += PI*2;
|
||||||
if (v2.y<0) v2.y+=PI2;
|
if (v2.y < 0) v2.y += PI*2;
|
||||||
if (v2.z<0) v2.z+=PI2;
|
if (v2.z < 0) v2.z += PI*2;
|
||||||
|
|
||||||
Color cx,cy,cz;
|
Color cx,cy,cz;
|
||||||
cx=cy=cz=BLACK;
|
cx = cy = cz = BLACK;
|
||||||
if (v1.x == v2.x) cx = GREEN;
|
if (v1.x == v2.x) cx = GREEN;
|
||||||
if (v1.y == v2.y) cy = GREEN;
|
if (v1.y == v2.y) cy = GREEN;
|
||||||
if (v1.z == v2.z) cz = GREEN;
|
if (v1.z == v2.z) cz = GREEN;
|
||||||
|
@ -113,7 +109,6 @@ int main(void)
|
||||||
DrawText(TextFormat("%2.3f",v1.y),20,40,20,cy);
|
DrawText(TextFormat("%2.3f",v1.y),20,40,20,cy);
|
||||||
DrawText(TextFormat("%2.3f",v1.z),20,60,20,cz);
|
DrawText(TextFormat("%2.3f",v1.z),20,60,20,cz);
|
||||||
|
|
||||||
|
|
||||||
DrawText(TextFormat("%2.3f",v2.x),200,20,20,cx);
|
DrawText(TextFormat("%2.3f",v2.x),200,20,20,cx);
|
||||||
DrawText(TextFormat("%2.3f",v2.y),200,40,20,cy);
|
DrawText(TextFormat("%2.3f",v2.y),200,40,20,cy);
|
||||||
DrawText(TextFormat("%2.3f",v2.z),200,60,20,cz);
|
DrawText(TextFormat("%2.3f",v2.z),200,60,20,cz);
|
||||||
|
|
BIN
examples/core/core_quat_conversion.png
Normal file
BIN
examples/core/core_quat_conversion.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 16 KiB |
|
@ -17,5 +17,8 @@ void main()
|
||||||
vec4 texelColor0 = texture2D(texture0, fragTexCoord);
|
vec4 texelColor0 = texture2D(texture0, fragTexCoord);
|
||||||
vec4 texelColor1 = texture2D(texture1, fragTexCoord);
|
vec4 texelColor1 = texture2D(texture1, fragTexCoord);
|
||||||
|
|
||||||
gl_FragColor = (texelColor0 + texelColor1)*0.5f;
|
float x = fract(fragTexCoord.s);
|
||||||
|
float out = smoothstep(0.4, 0.6, x);
|
||||||
|
|
||||||
|
gl_FragColor = mix(texelColor0, texelColor1, out);
|
||||||
}
|
}
|
|
@ -18,5 +18,8 @@ void main()
|
||||||
vec4 texelColor0 = texture(texture0, fragTexCoord);
|
vec4 texelColor0 = texture(texture0, fragTexCoord);
|
||||||
vec4 texelColor1 = texture(texture1, fragTexCoord);
|
vec4 texelColor1 = texture(texture1, fragTexCoord);
|
||||||
|
|
||||||
finalColor = (texelColor0 + texelColor1)*0.5f;
|
float x = fract(fragTexCoord.s);
|
||||||
|
float out = smoothstep(0.4, 0.6, x);
|
||||||
|
|
||||||
|
finalColor = mix(texelColor0, texelColor1, out);
|
||||||
}
|
}
|
BIN
examples/shaders/shaders_multi_sample2d.png
Normal file
BIN
examples/shaders/shaders_multi_sample2d.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 14 KiB |
|
@ -4,17 +4,16 @@
|
||||||
*
|
*
|
||||||
* This example uses [rlgl] module funtionality (pseudo-OpenGL 1.1 style coding)
|
* This example uses [rlgl] module funtionality (pseudo-OpenGL 1.1 style coding)
|
||||||
*
|
*
|
||||||
* This example has been created using raylib 3.0 (www.raylib.com)
|
* This example has been created using raylib 3.5 (www.raylib.com)
|
||||||
* raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details)
|
* raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details)
|
||||||
*
|
*
|
||||||
* Copyright (c) 2018 Ramon Santamaria (@raysan5)
|
* Example contributed by @seanpringle and reviewed by Ramon Santamaria (@raysan5)
|
||||||
|
*
|
||||||
|
* Copyright (c) 2020 @seanpringle
|
||||||
*
|
*
|
||||||
********************************************************************************************/
|
********************************************************************************************/
|
||||||
|
|
||||||
#define GRAPHICS_API_OPENGL_33
|
|
||||||
#define GLSL_VERSION 330
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include "raylib.h"
|
#include "raylib.h"
|
||||||
#include "raymath.h"
|
#include "raymath.h"
|
||||||
#include "rlgl.h"
|
#include "rlgl.h"
|
||||||
|
@ -22,6 +21,10 @@
|
||||||
#define RLIGHTS_IMPLEMENTATION
|
#define RLIGHTS_IMPLEMENTATION
|
||||||
#include "rlights.h"
|
#include "rlights.h"
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#define GLSL_VERSION 330
|
||||||
|
|
||||||
//------------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------------
|
||||||
// Program main entry point
|
// Program main entry point
|
||||||
//------------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------------
|
||||||
|
@ -29,11 +32,11 @@ int main(void)
|
||||||
{
|
{
|
||||||
// Initialization
|
// Initialization
|
||||||
//--------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------
|
||||||
const int screenWidth = 1024;
|
const int screenWidth = 800;
|
||||||
const int screenHeight = 768;
|
const int screenHeight = 450;
|
||||||
|
|
||||||
SetConfigFlags(FLAG_MSAA_4X_HINT); // Enable Multi Sampling Anti Aliasing 4x (if available)
|
SetConfigFlags(FLAG_MSAA_4X_HINT); // Enable Multi Sampling Anti Aliasing 4x (if available)
|
||||||
InitWindow(screenWidth, screenHeight, "raylib [shaders] example - rlgl module usage for instanced meshes");
|
InitWindow(screenWidth, screenHeight, "raylib [shaders] example - rlgl mesh instanced");
|
||||||
|
|
||||||
// Define the camera to look into our 3d world
|
// Define the camera to look into our 3d world
|
||||||
Camera camera = { 0 };
|
Camera camera = { 0 };
|
||||||
|
@ -43,14 +46,12 @@ int main(void)
|
||||||
camera.fovy = 45.0f;
|
camera.fovy = 45.0f;
|
||||||
camera.type = CAMERA_PERSPECTIVE;
|
camera.type = CAMERA_PERSPECTIVE;
|
||||||
|
|
||||||
SetCameraMode(camera, CAMERA_FREE);
|
|
||||||
|
|
||||||
const int count = 10000; // Number of instances to display
|
const int count = 10000; // Number of instances to display
|
||||||
Mesh cube = GenMeshCube(1.0f, 1.0f, 1.0f);
|
Mesh cube = GenMeshCube(1.0f, 1.0f, 1.0f);
|
||||||
|
|
||||||
Matrix* rotations = RL_MALLOC(count * sizeof(Matrix)); // Rotation state of instances
|
Matrix *rotations = RL_MALLOC(count*sizeof(Matrix)); // Rotation state of instances
|
||||||
Matrix* rotationsInc = RL_MALLOC(count * sizeof(Matrix)); // Per-frame rotation animation of instances
|
Matrix *rotationsInc = RL_MALLOC(count*sizeof(Matrix)); // Per-frame rotation animation of instances
|
||||||
Matrix* translations = RL_MALLOC(count * sizeof(Matrix)); // Locations of instances
|
Matrix *translations = RL_MALLOC(count*sizeof(Matrix)); // Locations of instances
|
||||||
|
|
||||||
// Scatter random cubes around
|
// Scatter random cubes around
|
||||||
for (int i = 0; i < count; i++)
|
for (int i = 0; i < count; i++)
|
||||||
|
@ -67,11 +68,10 @@ int main(void)
|
||||||
float angle = (float)GetRandomValue(0, 10) * DEG2RAD;
|
float angle = (float)GetRandomValue(0, 10) * DEG2RAD;
|
||||||
|
|
||||||
rotationsInc[i] = MatrixRotate(axis, angle);
|
rotationsInc[i] = MatrixRotate(axis, angle);
|
||||||
|
|
||||||
rotations[i] = MatrixIdentity();
|
rotations[i] = MatrixIdentity();
|
||||||
}
|
}
|
||||||
|
|
||||||
Matrix* transforms = RL_MALLOC(count * sizeof(Matrix)); // Pre-multiplied transformations passed to rlgl
|
Matrix *transforms = RL_MALLOC(count*sizeof(Matrix)); // Pre-multiplied transformations passed to rlgl
|
||||||
|
|
||||||
Shader shader = LoadShader(FormatText("resources/shaders/glsl%i/base_lighting_instanced.vs", GLSL_VERSION),
|
Shader shader = LoadShader(FormatText("resources/shaders/glsl%i/base_lighting_instanced.vs", GLSL_VERSION),
|
||||||
FormatText("resources/shaders/glsl%i/lighting.fs", GLSL_VERSION));
|
FormatText("resources/shaders/glsl%i/lighting.fs", GLSL_VERSION));
|
||||||
|
@ -81,7 +81,7 @@ int main(void)
|
||||||
shader.locs[LOC_VECTOR_VIEW] = GetShaderLocation(shader, "viewPos");
|
shader.locs[LOC_VECTOR_VIEW] = GetShaderLocation(shader, "viewPos");
|
||||||
shader.locs[LOC_MATRIX_MODEL] = GetShaderLocationAttrib(shader, "instance");
|
shader.locs[LOC_MATRIX_MODEL] = GetShaderLocationAttrib(shader, "instance");
|
||||||
|
|
||||||
// ambient light level
|
// Ambient light level
|
||||||
int ambientLoc = GetShaderLocation(shader, "ambient");
|
int ambientLoc = GetShaderLocation(shader, "ambient");
|
||||||
SetShaderValue(shader, ambientLoc, (float[4]){ 0.2f, 0.2f, 0.2f, 1.0f }, UNIFORM_VEC4);
|
SetShaderValue(shader, ambientLoc, (float[4]){ 0.2f, 0.2f, 0.2f, 1.0f }, UNIFORM_VEC4);
|
||||||
|
|
||||||
|
@ -91,6 +91,8 @@ int main(void)
|
||||||
material.shader = shader;
|
material.shader = shader;
|
||||||
material.maps[MAP_DIFFUSE].color = RED;
|
material.maps[MAP_DIFFUSE].color = RED;
|
||||||
|
|
||||||
|
SetCameraMode(camera, CAMERA_FREE); // Set a free camera mode
|
||||||
|
|
||||||
SetTargetFPS(60); // Set our game to run at 60 frames-per-second
|
SetTargetFPS(60); // Set our game to run at 60 frames-per-second
|
||||||
//--------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
@ -111,7 +113,6 @@ int main(void)
|
||||||
rotations[i] = MatrixMultiply(rotations[i], rotationsInc[i]);
|
rotations[i] = MatrixMultiply(rotations[i], rotationsInc[i]);
|
||||||
transforms[i] = MatrixMultiply(rotations[i], translations[i]);
|
transforms[i] = MatrixMultiply(rotations[i], translations[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------
|
||||||
|
|
||||||
// Draw
|
// Draw
|
||||||
|
@ -124,7 +125,8 @@ int main(void)
|
||||||
rlDrawMeshInstanced(cube, material, transforms, count);
|
rlDrawMeshInstanced(cube, material, transforms, count);
|
||||||
EndMode3D();
|
EndMode3D();
|
||||||
|
|
||||||
DrawText("A CUBE OF DANCING CUBES!", 400, 10, 20, MAROON);
|
DrawText("A CUBE OF DANCING CUBES!", 490, 10, 20, MAROON);
|
||||||
|
|
||||||
DrawFPS(10, 10);
|
DrawFPS(10, 10);
|
||||||
|
|
||||||
EndDrawing();
|
EndDrawing();
|
||||||
|
|
BIN
examples/shaders/shaders_rlgl_mesh_instanced.png
Normal file
BIN
examples/shaders/shaders_rlgl_mesh_instanced.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 401 KiB |
|
@ -4,9 +4,11 @@
|
||||||
*
|
*
|
||||||
* NOTE: Images are loaded in CPU memory (RAM); textures are loaded in GPU memory (VRAM)
|
* NOTE: Images are loaded in CPU memory (RAM); textures are loaded in GPU memory (VRAM)
|
||||||
*
|
*
|
||||||
* This example has been created using raylib 3.0 (www.raylib.com)
|
* This example has been created using raylib 3.5 (www.raylib.com)
|
||||||
* raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details)
|
* raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details)
|
||||||
*
|
*
|
||||||
|
* Example contributed by Karlo Licudine (@accidentalrebel) and reviewed by Ramon Santamaria (@raysan5)
|
||||||
|
*
|
||||||
* Copyright (c) 2020 Karlo Licudine (@accidentalrebel)
|
* Copyright (c) 2020 Karlo Licudine (@accidentalrebel)
|
||||||
*
|
*
|
||||||
********************************************************************************************/
|
********************************************************************************************/
|
||||||
|
@ -41,14 +43,12 @@ int main(void)
|
||||||
{
|
{
|
||||||
// Update
|
// Update
|
||||||
//----------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------
|
||||||
int key = GetKeyPressed();
|
if (IsKeyPressed(KEY_SPACE))
|
||||||
if ((key >= 32) && (key <= 126))
|
|
||||||
{
|
{
|
||||||
if ( blendMode >= blendCountMax - 1 )
|
if (blendMode >= (blendCountMax - 1)) blendMode = 0;
|
||||||
blendMode = 0;
|
else blendMode++;
|
||||||
else
|
|
||||||
blendMode++;
|
|
||||||
}
|
}
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
|
||||||
// Draw
|
// Draw
|
||||||
//----------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------
|
||||||
|
@ -56,32 +56,25 @@ int main(void)
|
||||||
|
|
||||||
ClearBackground(RAYWHITE);
|
ClearBackground(RAYWHITE);
|
||||||
|
|
||||||
BeginBlendMode(BLEND_ALPHA);
|
|
||||||
DrawTexture(bgTexture, screenWidth/2 - bgTexture.width/2, screenHeight/2 - bgTexture.height/2, WHITE);
|
DrawTexture(bgTexture, screenWidth/2 - bgTexture.width/2, screenHeight/2 - bgTexture.height/2, WHITE);
|
||||||
|
|
||||||
// Apply the blend mode and then draw the foreground texture
|
// Apply the blend mode and then draw the foreground texture
|
||||||
BeginBlendMode(blendMode);
|
BeginBlendMode(blendMode);
|
||||||
DrawTexture(fgTexture, screenWidth/2 - fgTexture.width/2, screenHeight/2 - fgTexture.height/2, WHITE);
|
DrawTexture(fgTexture, screenWidth/2 - fgTexture.width/2, screenHeight/2 - fgTexture.height/2, WHITE);
|
||||||
|
|
||||||
EndBlendMode();
|
EndBlendMode();
|
||||||
|
|
||||||
// Draw the texts
|
// Draw the texts
|
||||||
DrawText("Press any key to change blend modes.", 310, 350, 10, GRAY);
|
DrawText("Press SPACE to change blend modes.", 310, 350, 10, GRAY);
|
||||||
switch ( blendMode )
|
|
||||||
|
switch (blendMode)
|
||||||
{
|
{
|
||||||
case BLEND_ALPHA:
|
case BLEND_ALPHA: DrawText("Current: BLEND_ALPHA", (screenWidth / 2) - 60, 370, 10, GRAY); break;
|
||||||
DrawText("Current: BLEND_ALPHA", (screenWidth / 2) - 60, 370, 10, GRAY);
|
case BLEND_ADDITIVE: DrawText("Current: BLEND_ADDITIVE", (screenWidth / 2) - 60, 370, 10, GRAY); break;
|
||||||
break;
|
case BLEND_MULTIPLIED: DrawText("Current: BLEND_MULTIPLIED", (screenWidth / 2) - 60, 370, 10, GRAY); break;
|
||||||
case BLEND_ADDITIVE:
|
case BLEND_ADD_COLORS: DrawText("Current: BLEND_ADD_COLORS", (screenWidth / 2) - 60, 370, 10, GRAY); break;
|
||||||
DrawText("Current: BLEND_ADDITIVE", (screenWidth / 2) - 60, 370, 10, GRAY);
|
default: break;
|
||||||
break;
|
|
||||||
case BLEND_MULTIPLIED:
|
|
||||||
DrawText("Current: BLEND_MULTIPLIED", (screenWidth / 2) - 60, 370, 10, GRAY);
|
|
||||||
break;
|
|
||||||
case BLEND_ADD_COLORS:
|
|
||||||
DrawText("Current: BLEND_ADD_COLORS", (screenWidth / 2) - 60, 370, 10, GRAY);
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
DrawText("(c) Cyberpunk Street Environment by Luis Zuno (@ansimuz)", screenWidth - 330, screenHeight - 20, 10, GRAY);
|
DrawText("(c) Cyberpunk Street Environment by Luis Zuno (@ansimuz)", screenWidth - 330, screenHeight - 20, 10, GRAY);
|
||||||
|
|
||||||
EndDrawing();
|
EndDrawing();
|
||||||
|
|
32
src/rlgl.h
32
src/rlgl.h
|
@ -2870,12 +2870,6 @@ void rlDrawMesh(Mesh mesh, Material material, Matrix transform)
|
||||||
void rlDrawMeshInstanced(Mesh mesh, Material material, Matrix *transforms, int count)
|
void rlDrawMeshInstanced(Mesh mesh, Material material, Matrix *transforms, int count)
|
||||||
{
|
{
|
||||||
#if defined(GRAPHICS_API_OPENGL_33)
|
#if defined(GRAPHICS_API_OPENGL_33)
|
||||||
|
|
||||||
if (!RLGL.ExtSupported.vao) {
|
|
||||||
TRACELOG(LOG_ERROR, "VAO: Instanced rendering requires VAO support");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Bind shader program
|
// Bind shader program
|
||||||
glUseProgram(material.shader.id);
|
glUseProgram(material.shader.id);
|
||||||
|
|
||||||
|
@ -2912,23 +2906,21 @@ void rlDrawMeshInstanced(Mesh mesh, Material material, Matrix *transforms, int c
|
||||||
|
|
||||||
// At this point the modelview matrix just contains the view matrix (camera)
|
// At this point the modelview matrix just contains the view matrix (camera)
|
||||||
// For instanced shaders "mvp" is not premultiplied by any instance transform, only RLGL.State.transform
|
// For instanced shaders "mvp" is not premultiplied by any instance transform, only RLGL.State.transform
|
||||||
glUniformMatrix4fv(material.shader.locs[LOC_MATRIX_MVP], 1, false, MatrixToFloat(
|
glUniformMatrix4fv(material.shader.locs[LOC_MATRIX_MVP], 1, false,
|
||||||
MatrixMultiply(MatrixMultiply(RLGL.State.transform, RLGL.State.modelview), RLGL.State.projection)
|
MatrixToFloat(MatrixMultiply(MatrixMultiply(RLGL.State.transform, RLGL.State.modelview), RLGL.State.projection)));
|
||||||
));
|
|
||||||
|
|
||||||
float16* instances = RL_MALLOC(count * sizeof(float16));
|
float16* instances = RL_MALLOC(count*sizeof(float16));
|
||||||
|
|
||||||
for (int i = 0; i < count; i++)
|
for (int i = 0; i < count; i++) instances[i] = MatrixToFloatV(transforms[i]);
|
||||||
instances[i] = MatrixToFloatV(transforms[i]);
|
|
||||||
|
|
||||||
// This could alternatively use a static VBO and either glMapBuffer or glBufferSubData.
|
// This could alternatively use a static VBO and either glMapBuffer or glBufferSubData.
|
||||||
// It isn't clear which would be reliably faster in all cases and on all platforms, and
|
// It isn't clear which would be reliably faster in all cases and on all platforms, and
|
||||||
// anecdotally glMapBuffer seems very slow (syncs) while glBufferSubData seems no faster
|
// anecdotally glMapBuffer seems very slow (syncs) while glBufferSubData seems no faster
|
||||||
// since we're transferring all the transform matrices anyway.
|
// since we're transferring all the transform matrices anyway.
|
||||||
unsigned int instancesB;
|
unsigned int instancesB = 0;
|
||||||
glGenBuffers(1, &instancesB);
|
glGenBuffers(1, &instancesB);
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, instancesB);
|
glBindBuffer(GL_ARRAY_BUFFER, instancesB);
|
||||||
glBufferData(GL_ARRAY_BUFFER, count * sizeof(float16), instances, GL_STATIC_DRAW);
|
glBufferData(GL_ARRAY_BUFFER, count*sizeof(float16), instances, GL_STATIC_DRAW);
|
||||||
|
|
||||||
// Instances are put in LOC_MATRIX_MODEL attribute location with space for 4x Vector4, eg:
|
// Instances are put in LOC_MATRIX_MODEL attribute location with space for 4x Vector4, eg:
|
||||||
// layout (location = 12) in mat4 instance;
|
// layout (location = 12) in mat4 instance;
|
||||||
|
@ -2937,19 +2929,15 @@ void rlDrawMeshInstanced(Mesh mesh, Material material, Matrix *transforms, int c
|
||||||
for (unsigned int i = 0; i < 4; i++)
|
for (unsigned int i = 0; i < 4; i++)
|
||||||
{
|
{
|
||||||
glEnableVertexAttribArray(instanceA+i);
|
glEnableVertexAttribArray(instanceA+i);
|
||||||
glVertexAttribPointer(instanceA+i, 4, GL_FLOAT, GL_FALSE, sizeof(Matrix), (void*)(i * sizeof(Vector4)));
|
glVertexAttribPointer(instanceA + i, 4, GL_FLOAT, GL_FALSE, sizeof(Matrix), (void *)(i*sizeof(Vector4)));
|
||||||
glVertexAttribDivisor(instanceA+i, 1);
|
glVertexAttribDivisor(instanceA + i, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, 0);
|
glBindBuffer(GL_ARRAY_BUFFER, 0);
|
||||||
|
|
||||||
// Draw call!
|
// Draw call!
|
||||||
if (mesh.indices != NULL) {
|
if (mesh.indices != NULL) glDrawElementsInstanced(GL_TRIANGLES, mesh.triangleCount*3, GL_UNSIGNED_SHORT, 0, count);
|
||||||
// Indexed vertices draw
|
else glDrawArraysInstanced(GL_TRIANGLES, 0, mesh.vertexCount, count);
|
||||||
glDrawElementsInstanced(GL_TRIANGLES, mesh.triangleCount*3, GL_UNSIGNED_SHORT, 0, count);
|
|
||||||
} else {
|
|
||||||
glDrawArraysInstanced(GL_TRIANGLES, 0, mesh.vertexCount, count);
|
|
||||||
}
|
|
||||||
|
|
||||||
glDeleteBuffers(1, &instancesB);
|
glDeleteBuffers(1, &instancesB);
|
||||||
RL_FREE(instances);
|
RL_FREE(instances);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue