mirror of https://github.com/raysan5/raylib
Review contributed examples
This commit is contained in:
parent
5f79ad9765
commit
8e15dae5ed
|
@ -2,29 +2,21 @@
|
|||
*
|
||||
* 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 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)
|
||||
* 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)
|
||||
*
|
||||
* 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 "raymath.h"
|
||||
|
||||
#ifndef PI2
|
||||
#define PI2 PI*2
|
||||
#endif
|
||||
#include "raymath.h"
|
||||
|
||||
int main(void)
|
||||
{
|
||||
|
@ -48,23 +40,25 @@ int main(void)
|
|||
SetTargetFPS(60); // Set our game to run at 60 frames-per-second
|
||||
//--------------------------------------------------------------------------------------
|
||||
|
||||
Quaternion q1;
|
||||
Matrix m1,m2,m3,m4;
|
||||
Vector3 v1,v2;
|
||||
Quaternion q1;
|
||||
Matrix m1,m2,m3,m4;
|
||||
Vector3 v1,v2;
|
||||
|
||||
// Main game loop
|
||||
while (!WindowShouldClose()) // Detect window close button or ESC key
|
||||
{
|
||||
// Update
|
||||
if (!IsKeyDown(KEY_SPACE)) {
|
||||
//--------------------------------------------------------------------------------------
|
||||
if (!IsKeyDown(KEY_SPACE))
|
||||
{
|
||||
v1.x += 0.01;
|
||||
v1.y += 0.03;
|
||||
v1.z += 0.05;
|
||||
}
|
||||
|
||||
if (v1.x > PI2) v1.x-=PI2;
|
||||
if (v1.y > PI2) v1.y-=PI2;
|
||||
if (v1.z > PI2) v1.z-=PI2;
|
||||
if (v1.x > PI*2) v1.x -= PI*2;
|
||||
if (v1.y > PI*2) v1.y -= PI*2;
|
||||
if (v1.z > PI*2) v1.z -= PI*2;
|
||||
|
||||
q1 = QuaternionFromEuler(v1.x, v1.y, v1.z);
|
||||
m1 = MatrixRotateZYX(v1);
|
||||
|
@ -74,9 +68,12 @@ int main(void)
|
|||
m3 = QuaternionToMatrix(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);
|
||||
//--------------------------------------------------------------------------------------
|
||||
|
||||
// Draw
|
||||
//----------------------------------------------------------------------------------
|
||||
|
@ -94,17 +91,16 @@ int main(void)
|
|||
mod.transform = m4;
|
||||
DrawModel(mod, (Vector3){0,0,-1},1.0,RED);
|
||||
|
||||
|
||||
DrawGrid(10, 1.0f);
|
||||
|
||||
EndMode3D();
|
||||
|
||||
if (v2.x<0) v2.x+=PI2;
|
||||
if (v2.y<0) v2.y+=PI2;
|
||||
if (v2.z<0) v2.z+=PI2;
|
||||
if (v2.x < 0) v2.x += PI*2;
|
||||
if (v2.y < 0) v2.y += PI*2;
|
||||
if (v2.z < 0) v2.z += PI*2;
|
||||
|
||||
Color cx,cy,cz;
|
||||
cx=cy=cz=BLACK;
|
||||
cx = cy = cz = BLACK;
|
||||
if (v1.x == v2.x) cx = GREEN;
|
||||
if (v1.y == v2.y) cy = 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.z),20,60,20,cz);
|
||||
|
||||
|
||||
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.z),200,60,20,cz);
|
||||
|
|
Binary file not shown.
After Width: | Height: | Size: 16 KiB |
|
@ -17,5 +17,8 @@ void main()
|
|||
vec4 texelColor0 = texture2D(texture0, 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 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);
|
||||
}
|
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 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)
|
||||
*
|
||||
* 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 "raymath.h"
|
||||
#include "rlgl.h"
|
||||
|
@ -22,6 +21,10 @@
|
|||
#define RLIGHTS_IMPLEMENTATION
|
||||
#include "rlights.h"
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
#define GLSL_VERSION 330
|
||||
|
||||
//------------------------------------------------------------------------------------
|
||||
// Program main entry point
|
||||
//------------------------------------------------------------------------------------
|
||||
|
@ -29,11 +32,11 @@ int main(void)
|
|||
{
|
||||
// Initialization
|
||||
//--------------------------------------------------------------------------------------
|
||||
const int screenWidth = 1024;
|
||||
const int screenHeight = 768;
|
||||
const int screenWidth = 800;
|
||||
const int screenHeight = 450;
|
||||
|
||||
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
|
||||
Camera camera = { 0 };
|
||||
|
@ -43,14 +46,12 @@ int main(void)
|
|||
camera.fovy = 45.0f;
|
||||
camera.type = CAMERA_PERSPECTIVE;
|
||||
|
||||
SetCameraMode(camera, CAMERA_FREE);
|
||||
|
||||
const int count = 10000; // Number of instances to display
|
||||
Mesh cube = GenMeshCube(1.0f, 1.0f, 1.0f);
|
||||
|
||||
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* translations = RL_MALLOC(count * sizeof(Matrix)); // Locations 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 *translations = RL_MALLOC(count*sizeof(Matrix)); // Locations of instances
|
||||
|
||||
// Scatter random cubes around
|
||||
for (int i = 0; i < count; i++)
|
||||
|
@ -67,11 +68,10 @@ int main(void)
|
|||
float angle = (float)GetRandomValue(0, 10) * DEG2RAD;
|
||||
|
||||
rotationsInc[i] = MatrixRotate(axis, angle);
|
||||
|
||||
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),
|
||||
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_MATRIX_MODEL] = GetShaderLocationAttrib(shader, "instance");
|
||||
|
||||
// ambient light level
|
||||
// Ambient light level
|
||||
int ambientLoc = GetShaderLocation(shader, "ambient");
|
||||
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.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
|
||||
//--------------------------------------------------------------------------------------
|
||||
|
||||
|
@ -111,7 +113,6 @@ int main(void)
|
|||
rotations[i] = MatrixMultiply(rotations[i], rotationsInc[i]);
|
||||
transforms[i] = MatrixMultiply(rotations[i], translations[i]);
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------------
|
||||
|
||||
// Draw
|
||||
|
@ -124,7 +125,8 @@ int main(void)
|
|||
rlDrawMeshInstanced(cube, material, transforms, count);
|
||||
EndMode3D();
|
||||
|
||||
DrawText("A CUBE OF DANCING CUBES!", 400, 10, 20, MAROON);
|
||||
DrawText("A CUBE OF DANCING CUBES!", 490, 10, 20, MAROON);
|
||||
|
||||
DrawFPS(10, 10);
|
||||
|
||||
EndDrawing();
|
||||
|
|
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)
|
||||
*
|
||||
* 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)
|
||||
*
|
||||
* Example contributed by Karlo Licudine (@accidentalrebel) and reviewed by Ramon Santamaria (@raysan5)
|
||||
*
|
||||
* Copyright (c) 2020 Karlo Licudine (@accidentalrebel)
|
||||
*
|
||||
********************************************************************************************/
|
||||
|
@ -15,86 +17,77 @@
|
|||
|
||||
int main(void)
|
||||
{
|
||||
// Initialization
|
||||
//--------------------------------------------------------------------------------------
|
||||
const int screenWidth = 800;
|
||||
const int screenHeight = 450;
|
||||
// Initialization
|
||||
//--------------------------------------------------------------------------------------
|
||||
const int screenWidth = 800;
|
||||
const int screenHeight = 450;
|
||||
|
||||
InitWindow(screenWidth, screenHeight, "raylib [textures] example - blend modes");
|
||||
InitWindow(screenWidth, screenHeight, "raylib [textures] example - blend modes");
|
||||
|
||||
// NOTE: Textures MUST be loaded after Window initialization (OpenGL context is required)
|
||||
Image bgImage = LoadImage("resources/cyberpunk_street_background.png"); // Loaded in CPU memory (RAM)
|
||||
Texture2D bgTexture = LoadTextureFromImage(bgImage); // Image converted to texture, GPU memory (VRAM)
|
||||
// NOTE: Textures MUST be loaded after Window initialization (OpenGL context is required)
|
||||
Image bgImage = LoadImage("resources/cyberpunk_street_background.png"); // Loaded in CPU memory (RAM)
|
||||
Texture2D bgTexture = LoadTextureFromImage(bgImage); // Image converted to texture, GPU memory (VRAM)
|
||||
|
||||
Image fgImage = LoadImage("resources/cyberpunk_street_foreground.png"); // Loaded in CPU memory (RAM)
|
||||
Texture2D fgTexture = LoadTextureFromImage(fgImage); // Image converted to texture, GPU memory (VRAM)
|
||||
Image fgImage = LoadImage("resources/cyberpunk_street_foreground.png"); // Loaded in CPU memory (RAM)
|
||||
Texture2D fgTexture = LoadTextureFromImage(fgImage); // Image converted to texture, GPU memory (VRAM)
|
||||
|
||||
// Once image has been converted to texture and uploaded to VRAM, it can be unloaded from RAM
|
||||
UnloadImage(bgImage);
|
||||
UnloadImage(fgImage);
|
||||
// Once image has been converted to texture and uploaded to VRAM, it can be unloaded from RAM
|
||||
UnloadImage(bgImage);
|
||||
UnloadImage(fgImage);
|
||||
|
||||
const int blendCountMax = 4;
|
||||
BlendMode blendMode = 0;
|
||||
const int blendCountMax = 4;
|
||||
BlendMode blendMode = 0;
|
||||
|
||||
// Main game loop
|
||||
while (!WindowShouldClose()) // Detect window close button or ESC key
|
||||
{
|
||||
// Update
|
||||
//----------------------------------------------------------------------------------
|
||||
int key = GetKeyPressed();
|
||||
if ((key >= 32) && (key <= 126))
|
||||
{
|
||||
if ( blendMode >= blendCountMax - 1 )
|
||||
blendMode = 0;
|
||||
else
|
||||
blendMode++;
|
||||
}
|
||||
// Main game loop
|
||||
while (!WindowShouldClose()) // Detect window close button or ESC key
|
||||
{
|
||||
// Update
|
||||
//----------------------------------------------------------------------------------
|
||||
if (IsKeyPressed(KEY_SPACE))
|
||||
{
|
||||
if (blendMode >= (blendCountMax - 1)) blendMode = 0;
|
||||
else blendMode++;
|
||||
}
|
||||
//----------------------------------------------------------------------------------
|
||||
|
||||
// Draw
|
||||
//----------------------------------------------------------------------------------
|
||||
BeginDrawing();
|
||||
// Draw
|
||||
//----------------------------------------------------------------------------------
|
||||
BeginDrawing();
|
||||
|
||||
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
|
||||
BeginBlendMode(blendMode);
|
||||
DrawTexture(fgTexture, screenWidth/2 - fgTexture.width/2, screenHeight/2 - fgTexture.height/2, WHITE);
|
||||
// Apply the blend mode and then draw the foreground texture
|
||||
BeginBlendMode(blendMode);
|
||||
DrawTexture(fgTexture, screenWidth/2 - fgTexture.width/2, screenHeight/2 - fgTexture.height/2, WHITE);
|
||||
EndBlendMode();
|
||||
|
||||
EndBlendMode();
|
||||
// Draw the texts
|
||||
DrawText("Press SPACE to change blend modes.", 310, 350, 10, GRAY);
|
||||
|
||||
// Draw the texts
|
||||
DrawText("Press any key to change blend modes.", 310, 350, 10, GRAY);
|
||||
switch ( blendMode )
|
||||
{
|
||||
case BLEND_ALPHA:
|
||||
DrawText("Current: BLEND_ALPHA", (screenWidth / 2) - 60, 370, 10, GRAY);
|
||||
break;
|
||||
case BLEND_ADDITIVE:
|
||||
DrawText("Current: BLEND_ADDITIVE", (screenWidth / 2) - 60, 370, 10, GRAY);
|
||||
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);
|
||||
switch (blendMode)
|
||||
{
|
||||
case BLEND_ALPHA: DrawText("Current: BLEND_ALPHA", (screenWidth / 2) - 60, 370, 10, GRAY); break;
|
||||
case BLEND_ADDITIVE: DrawText("Current: BLEND_ADDITIVE", (screenWidth / 2) - 60, 370, 10, GRAY); 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;
|
||||
default: break;
|
||||
}
|
||||
|
||||
EndDrawing();
|
||||
//----------------------------------------------------------------------------------
|
||||
}
|
||||
DrawText("(c) Cyberpunk Street Environment by Luis Zuno (@ansimuz)", screenWidth - 330, screenHeight - 20, 10, GRAY);
|
||||
|
||||
// De-Initialization
|
||||
//--------------------------------------------------------------------------------------
|
||||
UnloadTexture(fgTexture); // Unload foreground texture
|
||||
UnloadTexture(bgTexture); // Unload background texture
|
||||
EndDrawing();
|
||||
//----------------------------------------------------------------------------------
|
||||
}
|
||||
|
||||
CloseWindow(); // Close window and OpenGL context
|
||||
//--------------------------------------------------------------------------------------
|
||||
// De-Initialization
|
||||
//--------------------------------------------------------------------------------------
|
||||
UnloadTexture(fgTexture); // Unload foreground texture
|
||||
UnloadTexture(bgTexture); // Unload background texture
|
||||
|
||||
return 0;
|
||||
CloseWindow(); // Close window and OpenGL context
|
||||
//--------------------------------------------------------------------------------------
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
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)
|
||||
{
|
||||
#if defined(GRAPHICS_API_OPENGL_33)
|
||||
|
||||
if (!RLGL.ExtSupported.vao) {
|
||||
TRACELOG(LOG_ERROR, "VAO: Instanced rendering requires VAO support");
|
||||
return;
|
||||
}
|
||||
|
||||
// Bind shader program
|
||||
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)
|
||||
// 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(
|
||||
MatrixMultiply(MatrixMultiply(RLGL.State.transform, RLGL.State.modelview), RLGL.State.projection)
|
||||
));
|
||||
glUniformMatrix4fv(material.shader.locs[LOC_MATRIX_MVP], 1, false,
|
||||
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++)
|
||||
instances[i] = MatrixToFloatV(transforms[i]);
|
||||
for (int i = 0; i < count; i++) instances[i] = MatrixToFloatV(transforms[i]);
|
||||
|
||||
// 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
|
||||
// anecdotally glMapBuffer seems very slow (syncs) while glBufferSubData seems no faster
|
||||
// since we're transferring all the transform matrices anyway.
|
||||
unsigned int instancesB;
|
||||
unsigned int instancesB = 0;
|
||||
glGenBuffers(1, &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:
|
||||
// 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++)
|
||||
{
|
||||
glEnableVertexAttribArray(instanceA+i);
|
||||
glVertexAttribPointer(instanceA+i, 4, GL_FLOAT, GL_FALSE, sizeof(Matrix), (void*)(i * sizeof(Vector4)));
|
||||
glVertexAttribDivisor(instanceA+i, 1);
|
||||
glVertexAttribPointer(instanceA + i, 4, GL_FLOAT, GL_FALSE, sizeof(Matrix), (void *)(i*sizeof(Vector4)));
|
||||
glVertexAttribDivisor(instanceA + i, 1);
|
||||
}
|
||||
|
||||
glBindBuffer(GL_ARRAY_BUFFER, 0);
|
||||
|
||||
// Draw call!
|
||||
if (mesh.indices != NULL) {
|
||||
// Indexed vertices draw
|
||||
glDrawElementsInstanced(GL_TRIANGLES, mesh.triangleCount*3, GL_UNSIGNED_SHORT, 0, count);
|
||||
} else {
|
||||
glDrawArraysInstanced(GL_TRIANGLES, 0, mesh.vertexCount, count);
|
||||
}
|
||||
if (mesh.indices != NULL) glDrawElementsInstanced(GL_TRIANGLES, mesh.triangleCount*3, GL_UNSIGNED_SHORT, 0, count);
|
||||
else glDrawArraysInstanced(GL_TRIANGLES, 0, mesh.vertexCount, count);
|
||||
|
||||
glDeleteBuffers(1, &instancesB);
|
||||
RL_FREE(instances);
|
||||
|
|
Loading…
Reference in New Issue