From ae4d9aba93ed7a86c0a67fc49980b80349206f24 Mon Sep 17 00:00:00 2001 From: fincs Date: Sat, 28 Nov 2015 16:25:23 +0100 Subject: [PATCH] Generalize C3D_FVUnifMtx to support 2x4, 3x4 and 4x4 matrices --- examples/fragment_light/source/main.c | 4 ++-- examples/immediate/source/main.c | 2 +- examples/simple_tri/source/main.c | 2 +- examples/textured_cube/source/main.c | 6 +++--- include/c3d/uniforms.h | 23 +++++++++++++++++++---- source/mtxstack.c | 5 +---- 6 files changed, 27 insertions(+), 15 deletions(-) diff --git a/examples/fragment_light/source/main.c b/examples/fragment_light/source/main.c index 086c3c1..be14f15 100644 --- a/examples/fragment_light/source/main.c +++ b/examples/fragment_light/source/main.c @@ -168,8 +168,8 @@ static void sceneRender(float iod) } // Update the uniforms - C3D_FVUnifMtx(GPU_VERTEX_SHADER, uLoc_projection, &projection); - C3D_FVUnifMtx(GPU_VERTEX_SHADER, uLoc_modelView, &modelView); + C3D_FVUnifMtx4x4(GPU_VERTEX_SHADER, uLoc_projection, &projection); + C3D_FVUnifMtx4x4(GPU_VERTEX_SHADER, uLoc_modelView, &modelView); // Draw the VBO C3D_DrawArrays(GPU_TRIANGLES, 0, vertex_list_count); diff --git a/examples/immediate/source/main.c b/examples/immediate/source/main.c index 9853b13..2183475 100644 --- a/examples/immediate/source/main.c +++ b/examples/immediate/source/main.c @@ -47,7 +47,7 @@ static void sceneInit(void) static void sceneRender(void) { // Update the uniforms - C3D_FVUnifMtx(GPU_VERTEX_SHADER, uLoc_projection, &projection); + C3D_FVUnifMtx4x4(GPU_VERTEX_SHADER, uLoc_projection, &projection); // Draw the triangle directly C3D_ImmDrawBegin(GPU_TRIANGLES); diff --git a/examples/simple_tri/source/main.c b/examples/simple_tri/source/main.c index 7cc6b2c..081857d 100644 --- a/examples/simple_tri/source/main.c +++ b/examples/simple_tri/source/main.c @@ -71,7 +71,7 @@ static void sceneInit(void) static void sceneRender(void) { // Update the uniforms - C3D_FVUnifMtx(GPU_VERTEX_SHADER, uLoc_projection, &projection); + C3D_FVUnifMtx4x4(GPU_VERTEX_SHADER, uLoc_projection, &projection); // Draw the VBO C3D_DrawArrays(GPU_TRIANGLES, 0, vertex_list_count); diff --git a/examples/textured_cube/source/main.c b/examples/textured_cube/source/main.c index b9e6c75..ffa811e 100644 --- a/examples/textured_cube/source/main.c +++ b/examples/textured_cube/source/main.c @@ -161,9 +161,9 @@ static void sceneRender(void) angleY += M_PI / 360; // Update the uniforms - C3D_FVUnifMtx(GPU_VERTEX_SHADER, uLoc_projection, &projection); - C3D_FVUnifMtx(GPU_VERTEX_SHADER, uLoc_modelView, &modelView); - C3D_FVUnifMtx(GPU_VERTEX_SHADER, uLoc_material, &material); + C3D_FVUnifMtx4x4(GPU_VERTEX_SHADER, uLoc_projection, &projection); + C3D_FVUnifMtx4x4(GPU_VERTEX_SHADER, uLoc_modelView, &modelView); + C3D_FVUnifMtx4x4(GPU_VERTEX_SHADER, uLoc_material, &material); C3D_FVUnifSet(GPU_VERTEX_SHADER, uLoc_lightVec, 0.0f, 0.0f, -1.0f, 0.0f); C3D_FVUnifSet(GPU_VERTEX_SHADER, uLoc_lightHalfVec, 0.0f, 0.0f, -1.0f, 0.0f); C3D_FVUnifSet(GPU_VERTEX_SHADER, uLoc_lightClr, 1.0f, 1.0f, 1.0f, 1.0f); diff --git a/include/c3d/uniforms.h b/include/c3d/uniforms.h index 1dbd6a6..65499bd 100644 --- a/include/c3d/uniforms.h +++ b/include/c3d/uniforms.h @@ -25,12 +25,27 @@ static inline C3D_IVec* C3D_IVUnifWritePtr(GPU_SHADER_TYPE type, int id) return &C3D_IVUnif[type][id]; } -static inline void C3D_FVUnifMtx(GPU_SHADER_TYPE type, int id, C3D_Mtx* mtx) +static inline void C3D_FVUnifMtxNx4(GPU_SHADER_TYPE type, int id, C3D_Mtx* mtx, int num) { int i; - C3D_FVec* ptr = C3D_FVUnifWritePtr(type, id, 4); - for (i = 0; i < 4; i ++) - ptr[i] = mtx->r[i]; + C3D_FVec* ptr = C3D_FVUnifWritePtr(type, id, num); + for (i = 0; i < num; i ++) + ptr[i] = mtx->r[i]; // Struct copy. +} + +static inline void C3D_FVUnifMtx4x4(GPU_SHADER_TYPE type, int id, C3D_Mtx* mtx) +{ + C3D_FVUnifMtxNx4(type, id, mtx, 4); +} + +static inline void C3D_FVUnifMtx3x4(GPU_SHADER_TYPE type, int id, C3D_Mtx* mtx) +{ + C3D_FVUnifMtxNx4(type, id, mtx, 3); +} + +static inline void C3D_FVUnifMtx2x4(GPU_SHADER_TYPE type, int id, C3D_Mtx* mtx) +{ + C3D_FVUnifMtxNx4(type, id, mtx, 2); } static inline void C3D_FVUnifSet(GPU_SHADER_TYPE type, int id, float x, float y, float z, float w) diff --git a/source/mtxstack.c b/source/mtxstack.c index b4bc4a6..ff3fe06 100644 --- a/source/mtxstack.c +++ b/source/mtxstack.c @@ -36,10 +36,7 @@ void MtxStack_Update(C3D_MtxStack* stk) if (!stk->isDirty) return; if (stk->unifPos != 0xFF) - { - C3D_FVec* out = C3D_FVUnifWritePtr(stk->unifType, stk->unifPos, stk->unifLen); - memcpy(out, &stk->m[stk->pos], (u32)stk->unifLen * sizeof(C3D_FVec)); - } + C3D_FVUnifMtxNx4(stk->unifType, stk->unifPos, &stk->m[stk->pos], stk->unifLen); stk->isDirty = false; }