summary refs log tree commit diff
path: root/src/AxisLinesRenderer.c
diff options
context:
space:
mode:
authorWlodekM <[email protected]>2024-06-16 10:35:45 +0300
committerWlodekM <[email protected]>2024-06-16 10:35:45 +0300
commitabef6da56913f1c55528103e60a50451a39628b1 (patch)
treeb3c8092471ecbb73e568cd0d336efa0e7871ee8d /src/AxisLinesRenderer.c
initial commit
Diffstat (limited to 'src/AxisLinesRenderer.c')
-rw-r--r--src/AxisLinesRenderer.c95
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 */
+};