Review contributed examples

This commit is contained in:
Ray 2020-11-01 13:39:48 +01:00
parent 5f79ad9765
commit 8e15dae5ed
9 changed files with 129 additions and 145 deletions

View File

@ -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)
{
@ -56,15 +48,17 @@ int main(void)
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

View File

@ -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);
}

View File

@ -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

View File

@ -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

View File

@ -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)
*
********************************************************************************************/
@ -41,14 +43,12 @@ int main(void)
{
// Update
//----------------------------------------------------------------------------------
int key = GetKeyPressed();
if ((key >= 32) && (key <= 126))
if (IsKeyPressed(KEY_SPACE))
{
if ( blendMode >= blendCountMax - 1 )
blendMode = 0;
else
blendMode++;
if (blendMode >= (blendCountMax - 1)) blendMode = 0;
else blendMode++;
}
//----------------------------------------------------------------------------------
// Draw
//----------------------------------------------------------------------------------
@ -56,32 +56,25 @@ int main(void)
ClearBackground(RAYWHITE);
BeginBlendMode(BLEND_ALPHA);
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);
EndBlendMode();
// Draw the texts
DrawText("Press any key to change blend modes.", 310, 350, 10, GRAY);
switch ( blendMode )
DrawText("Press SPACE 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;
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;
}
DrawText("(c) Cyberpunk Street Environment by Luis Zuno (@ansimuz)", screenWidth - 330, screenHeight - 20, 10, GRAY);
EndDrawing();

View File

@ -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);