diff options
author | WlodekM <[email protected]> | 2024-06-16 10:35:45 +0300 |
---|---|---|
committer | WlodekM <[email protected]> | 2024-06-16 10:35:45 +0300 |
commit | abef6da56913f1c55528103e60a50451a39628b1 (patch) | |
tree | b3c8092471ecbb73e568cd0d336efa0e7871ee8d /src/AxisLinesRenderer.c |
initial commit
Diffstat (limited to 'src/AxisLinesRenderer.c')
-rw-r--r-- | src/AxisLinesRenderer.c | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/src/AxisLinesRenderer.c b/src/AxisLinesRenderer.c new file mode 100644 index 0000000..81eebc2 --- /dev/null +++ b/src/AxisLinesRenderer.c @@ -0,0 +1,95 @@ +#include "AxisLinesRenderer.h" +#include "Graphics.h" +#include "Game.h" +#include "SelectionBox.h" +#include "PackedCol.h" +#include "Camera.h" +#include "Event.h" +#include "Entity.h" +#include "ExtMath.h" + +cc_bool AxisLinesRenderer_Enabled; +static GfxResourceID axisLines_vb; +#define AXISLINES_NUM_VERTICES 12 +#define AXISLINES_THICKNESS (1.0f / 32.0f) +#define AXISLINES_LENGTH 3.0f + +void AxisLinesRenderer_Render(void) { + static const cc_uint8 indices[36] = { + 2,2,1, 2,2,3, 4,2,3, 4,2,1, /* X arrow */ + 1,2,2, 1,2,4, 3,2,4, 3,2,2, /* Z arrow */ + 1,2,3, 1,4,3, 3,4,1, 3,2,1, /* Y arrow */ + }; + static const PackedCol colors[] = { + PackedCol_Make(255, 0, 0, 255), /* Red */ + PackedCol_Make( 0, 0, 255, 255), /* Blue */ + PackedCol_Make( 0, 255, 0, 255), /* Green */ + }; + + struct VertexColoured* v; + Vec3 coords[5], pos, dirVector; + int i, count; + float axisLengthScale, axisThicknessScale; + struct Entity* e; + + if (!AxisLinesRenderer_Enabled) return; + /* Don't do it in a ContextRecreated handler, because we only want VB recreated if ShowAxisLines in on. */ + if (!axisLines_vb) { + axisLines_vb = Gfx_CreateDynamicVb(VERTEX_FORMAT_COLOURED, AXISLINES_NUM_VERTICES); + } + e = &Entities.CurPlayer->Base; + + if (Camera.Active->isThirdPerson) { + pos = e->Position; + axisLengthScale = 1; + axisThicknessScale = 1; + pos.y += 0.05f; + } else { + pos = Camera.CurrentPos; + dirVector = Vec3_GetDirVector(e->Yaw * MATH_DEG2RAD, e->Pitch * MATH_DEG2RAD); + Vec3_Mul1(&dirVector, &dirVector, 0.5f); + Vec3_Add(&pos, &dirVector, &pos); + axisLengthScale = 1.0f / 32.0f; + axisThicknessScale = 1.0f / 8.0f; + } + count = 12; + + Vec3_Add1(&coords[0], &pos, -AXISLINES_LENGTH * axisLengthScale); + Vec3_Add1(&coords[1], &pos, -AXISLINES_THICKNESS * axisThicknessScale); + coords[2] = pos; + Vec3_Add1(&coords[3], &pos, AXISLINES_THICKNESS * axisThicknessScale); + Vec3_Add1(&coords[4], &pos, AXISLINES_LENGTH * axisLengthScale); + + v = (struct VertexColoured*)Gfx_LockDynamicVb(axisLines_vb, + VERTEX_FORMAT_COLOURED, AXISLINES_NUM_VERTICES); + for (i = 0; i < count; i++, v++) + { + v->x = coords[indices[i*3 + 0]].x; + v->y = coords[indices[i*3 + 1]].y; + v->z = coords[indices[i*3 + 2]].z; + v->Col = colors[i >> 2]; + } + + Gfx_SetVertexFormat(VERTEX_FORMAT_COLOURED); + Gfx_UnlockDynamicVb(axisLines_vb); + Gfx_DrawVb_IndexedTris(count); +} + + +/*########################################################################################################################* +*-----------------------------------------------AxisLinesRenderer component-----------------------------------------------* +*#########################################################################################################################*/ +static void OnContextLost(void* obj) { + Gfx_DeleteDynamicVb(&axisLines_vb); +} + +static void OnInit(void) { + Event_Register_(&GfxEvents.ContextLost, NULL, OnContextLost); +} + +static void OnFree(void) { OnContextLost(NULL); } + +struct IGameComponent AxisLinesRenderer_Component = { + OnInit, /* Init */ + OnFree, /* Free */ +}; |