diff --git a/src/Game.c b/src/Game.c index 6bf45b4f2..636f2cb18 100644 --- a/src/Game.c +++ b/src/Game.c @@ -526,8 +526,7 @@ static void Game_Render3D(double delta, float t) { Entities_DrawShadows(); if (Game_SelectedPos.Valid && !Game_HideGui) { - PickedPosRenderer_Update(&Game_SelectedPos); - PickedPosRenderer_Render(); + PickedPosRenderer_Render(&Game_SelectedPos, true); } /* Render water over translucent blocks when under the water outside the map for proper alpha blending */ @@ -543,7 +542,7 @@ static void Game_Render3D(double delta, float t) { /* Need to render again over top of translucent block, as the selection outline */ /* is drawn without writing to the depth buffer */ if (Game_SelectedPos.Valid && !Game_HideGui && Blocks.Draw[Game_SelectedPos.block] == DRAW_TRANSLUCENT) { - PickedPosRenderer_Render(); + PickedPosRenderer_Render(&Game_SelectedPos, false); } Selections_Render(); diff --git a/src/Model.h b/src/Model.h index d9b35b96b..d005b9cc5 100644 --- a/src/Model.h +++ b/src/Model.h @@ -142,7 +142,7 @@ CC_API void Model_DrawArmPart(struct ModelPart* part); /* Returns a pointer to the model whose name caselessly matches given name. */ CC_API struct Model* Model_Get(const String* name); -/* Returns index of the model texture whose name caselessly matches given name. */ +/* Returns a pointer to the model texture whose name caselessly matches given name. */ CC_API struct ModelTex* Model_GetTexture(const String* name); /* Adds a model to the list of models. (e.g. "skeleton") */ /* Models can be applied to entities to change their appearance. Use Entity_SetModel for that. */ diff --git a/src/PickedPosRenderer.c b/src/PickedPosRenderer.c index c4c089aeb..28df9b6d5 100644 --- a/src/PickedPosRenderer.c +++ b/src/PickedPosRenderer.c @@ -10,19 +10,6 @@ static GfxResourceID pickedPos_vb; #define PICKEDPOS_NUM_VERTICES (16 * 6) -static VertexP3fC4b pickedPos_vertices[PICKEDPOS_NUM_VERTICES]; - -void PickedPosRenderer_Render(void) { - if (Gfx.LostContext) return; - - Gfx_SetAlphaBlending(true); - Gfx_SetDepthWrite(false); - Gfx_SetVertexFormat(VERTEX_FORMAT_P3FC4B); - - Gfx_UpdateDynamicVb_IndexedTris(pickedPos_vb, pickedPos_vertices, PICKEDPOS_NUM_VERTICES); - Gfx_SetDepthWrite(true); - Gfx_SetAlphaBlending(false); -} #define PickedPos_Y(y)\ 0,y,1, 0,y,2, 1,y,2, 1,y,1,\ @@ -42,7 +29,7 @@ x,3,0, x,2,0, x,2,3, x,3,3, 0,0,z, 0,1,z, 3,1,z, 3,0,z,\ 0,3,z, 0,2,z, 3,2,z, 3,3,z, -void PickedPosRenderer_Update(struct RayTracer* selected) { +static void BuildMesh(struct RayTracer* selected) { static const cc_uint8 indices[288] = { PickedPos_Y(0) PickedPos_Y(3) /* YMin, YMax */ PickedPos_X(0) PickedPos_X(3) /* XMin, XMax */ @@ -88,13 +75,29 @@ void PickedPosRenderer_Update(struct RayTracer* selected) { Vec3_Add1(&coords[3], &selected->Max, offset); Vec3_Add1(&coords[2], &coords[3], -size); - ptr = pickedPos_vertices; + ptr = (VertexP3fC4b*)Gfx_LockDynamicVb(pickedPos_vb, VERTEX_FORMAT_P3FC4B, PICKEDPOS_NUM_VERTICES); for (i = 0; i < Array_Elems(indices); i += 3, ptr++) { ptr->X = coords[indices[i + 0]].X; ptr->Y = coords[indices[i + 1]].Y; ptr->Z = coords[indices[i + 2]].Z; ptr->Col = col; } + Gfx_UnlockDynamicVb(pickedPos_vb); +} + +void PickedPosRenderer_Render(struct RayTracer* selected, cc_bool dirty) { + if (Gfx.LostContext) return; + + Gfx_SetAlphaBlending(true); + Gfx_SetDepthWrite(false); + Gfx_SetVertexFormat(VERTEX_FORMAT_P3FC4B); + + if (dirty) BuildMesh(selected); + else Gfx_BindDynamicVb(pickedPos_vb); + + Gfx_DrawVb_IndexedTris(PICKEDPOS_NUM_VERTICES); + Gfx_SetDepthWrite(true); + Gfx_SetAlphaBlending(false); } diff --git a/src/PickedPosRenderer.h b/src/PickedPosRenderer.h index 87cad3a92..dcc3b1970 100644 --- a/src/PickedPosRenderer.h +++ b/src/PickedPosRenderer.h @@ -8,6 +8,5 @@ struct RayTracer; struct IGameComponent; extern struct IGameComponent PickedPosRenderer_Component; -void PickedPosRenderer_Render(void); -void PickedPosRenderer_Update(struct RayTracer* selected); +void PickedPosRenderer_Render(struct RayTracer* selected, cc_bool dirty); #endif