Fixed the sculpture view.

This commit is contained in:
Peter Slattery 2020-07-18 12:59:57 -07:00
parent 62e22979f3
commit 078f4e3ed7
2 changed files with 28 additions and 61 deletions

View File

@ -81,56 +81,46 @@ struct draw_leds_job_data
}; };
internal void internal void
DrawLEDsInBufferRangeJob (gs_thread_context Context, gs_data JobData) DrawLedsInBuffer(led_buffer LedBuffer, s32 StartIndex, s32 OnePastLastIndex, render_quad_batch_constructor* Batch, quad_batch_constructor_reserved_range ReservedRange, r32 LedHalfWidth)
{ {
DEBUG_TRACK_FUNCTION;
draw_leds_job_data* Data = (draw_leds_job_data*)JobData.Memory;
s32 LEDCount = Data->OnePastLastIndex - Data->StartIndex;
#if 0
// TODO(Peter): Why are we doing this here? Shouldn't we be able to tell what the range
// needs to be at the time of creation? That way its all on one thread and we're not
// worried about locking up.
quad_batch_constructor_reserved_range BatchReservedRange = ThreadSafeReserveRangeInQuadConstructor(Data->Batch, LEDCount * 2);
#endif
s32 TrisUsed = 0; s32 TrisUsed = 0;
r32 HalfWidth = Data->LEDHalfWidth; v4 P0_In = v4{-LedHalfWidth, -LedHalfWidth, 0, 1};
v4 P1_In = v4{LedHalfWidth, -LedHalfWidth, 0, 1};
v4 P0_In = v4{-HalfWidth, -HalfWidth, 0, 1}; v4 P2_In = v4{LedHalfWidth, LedHalfWidth, 0, 1};
v4 P1_In = v4{HalfWidth, -HalfWidth, 0, 1}; v4 P3_In = v4{-LedHalfWidth, LedHalfWidth, 0, 1};
v4 P2_In = v4{HalfWidth, HalfWidth, 0, 1};
v4 P3_In = v4{-HalfWidth, HalfWidth, 0, 1};
v2 UV0 = v2{0, 0}; v2 UV0 = v2{0, 0};
v2 UV1 = v2{1, 0}; v2 UV1 = v2{1, 0};
v2 UV2 = v2{1, 1}; v2 UV2 = v2{1, 1};
v2 UV3 = v2{0, 1}; v2 UV3 = v2{0, 1};
for (s32 LedIndex = Data->StartIndex; LedIndex < Data->OnePastLastIndex; LedIndex++) Assert(OnePastLastIndex <= (s32)LedBuffer.LedCount);
for (s32 LedIndex = StartIndex; LedIndex < OnePastLastIndex; LedIndex++)
{ {
pixel PixelColor = Data->LedBuffer.Colors[LedIndex]; pixel PixelColor = LedBuffer.Colors[LedIndex];
v4 Color = v4{PixelColor.R / 255.f, PixelColor.G / 255.f, PixelColor.B / 255.f, 1.0f}; v4 Color = v4{PixelColor.R / 255.f, PixelColor.G / 255.f, PixelColor.B / 255.f, 1.0f};
v4 Position = Data->LedBuffer.Positions[LedIndex]; v4 Position = LedBuffer.Positions[LedIndex];
m44 FaceCameraMatrix = M44LookAt(Position, Data->CameraPosition);
v4 PositionOffset = ToV4Vec(Position.xyz); v4 PositionOffset = ToV4Vec(Position.xyz);
v4 P0 = P0_In + PositionOffset;
v4 P1 = P1_In + PositionOffset;
v4 P2 = P2_In + PositionOffset;
v4 P3 = P3_In + PositionOffset;
v4 P0 = (FaceCameraMatrix * P0_In) + PositionOffset; SetTri3DInBatch(Batch, ReservedRange.Start + TrisUsed++, P0, P1, P2, UV0, UV1, UV2, Color, Color, Color);
v4 P1 = (FaceCameraMatrix * P1_In) + PositionOffset; SetTri3DInBatch(Batch, ReservedRange.Start + TrisUsed++, P0, P2, P3, UV0, UV2, UV3, Color, Color, Color);
v4 P2 = (FaceCameraMatrix * P2_In) + PositionOffset;
v4 P3 = (FaceCameraMatrix * P3_In) + PositionOffset;
SetTri3DInBatch(Data->Batch, Data->BatchReservedRange.Start + TrisUsed++,
P0, P1, P2, UV0, UV1, UV2, Color, Color, Color);
SetTri3DInBatch(Data->Batch, Data->BatchReservedRange.Start + TrisUsed++,
P0, P2, P3, UV0, UV2, UV3, Color, Color, Color);
} }
} }
internal void
DrawLEDsInBufferRangeJob (gs_thread_context Context, gs_data JobData)
{
DEBUG_TRACK_FUNCTION;
draw_leds_job_data* Data = (draw_leds_job_data*)JobData.Memory;
DrawLedsInBuffer(Data->LedBuffer, Data->StartIndex, Data->OnePastLastIndex, Data->Batch, Data->BatchReservedRange, Data->LEDHalfWidth);
}
internal void internal void
DrawQuad(render_command_buffer* RenderBuffer, v4 C, r32 Rad, v4 Color) DrawQuad(render_command_buffer* RenderBuffer, v4 C, r32 Rad, v4 Color)
{ {
@ -147,13 +137,6 @@ internal void
SculptureView_Render(panel Panel, rect2 PanelBounds, render_command_buffer* RenderBuffer, app_state* State, context Context) SculptureView_Render(panel Panel, rect2 PanelBounds, render_command_buffer* RenderBuffer, app_state* State, context Context)
{ {
DEBUG_TRACK_SCOPE(RenderSculpture); DEBUG_TRACK_SCOPE(RenderSculpture);
// TODO(Peter): @MajorFix
// NOTE(Peter): Just returning from this function to make sure that this isn't a problem as I go and try to fix
// the other panels
return;
State->Camera.AspectRatio = RectAspectRatio(PanelBounds); State->Camera.AspectRatio = RectAspectRatio(PanelBounds);
PushRenderPerspective(RenderBuffer, PanelBounds, State->Camera); PushRenderPerspective(RenderBuffer, PanelBounds, State->Camera);
@ -168,7 +151,6 @@ SculptureView_Render(panel Panel, rect2 PanelBounds, render_command_buffer* Rend
led_buffer* LedBuffer = LedSystemGetBuffer(&State->LedSystem, BufferIndex); led_buffer* LedBuffer = LedSystemGetBuffer(&State->LedSystem, BufferIndex);
u32 JobsNeeded = U32DivideRoundUp(LedBuffer->LedCount, MaxLEDsPerJob); u32 JobsNeeded = U32DivideRoundUp(LedBuffer->LedCount, MaxLEDsPerJob);
#if 1
u32 NextLEDIndex = 0; u32 NextLEDIndex = 0;
for (u32 Job = 0; Job < JobsNeeded; Job++) for (u32 Job = 0; Job < JobsNeeded; Job++)
{ {
@ -181,30 +163,14 @@ SculptureView_Render(panel Panel, rect2 PanelBounds, render_command_buffer* Rend
JobData->Batch = &RenderLEDsBatch; JobData->Batch = &RenderLEDsBatch;
JobData->BatchReservedRange = ReserveRangeInQuadConstructor(JobData->Batch, JobLedCount * 2); JobData->BatchReservedRange = ReserveRangeInQuadConstructor(JobData->Batch, JobLedCount * 2);
JobData->LEDHalfWidth = .5f; JobData->LEDHalfWidth = .5f;
JobData->CameraPosition = ToV4Point(State->Camera.Position); JobData->CameraPosition = ToV4Point(State->Camera.Position);
#if 1
Context.GeneralWorkQueue->PushWorkOnQueue(Context.GeneralWorkQueue, (thread_proc*)DrawLEDsInBufferRangeJob, Data, ConstString("Sculpture Draw LEDS")); Context.GeneralWorkQueue->PushWorkOnQueue(Context.GeneralWorkQueue, (thread_proc*)DrawLEDsInBufferRangeJob, Data, ConstString("Sculpture Draw LEDS"));
#else
DrawLedsInBuffer(JobData->LedBuffer, JobData->StartIndex, JobData->OnePastLastIndex, JobData->Batch, JobData->BatchReservedRange, JobData->LEDHalfWidth);
#endif
NextLEDIndex = JobData->OnePastLastIndex; NextLEDIndex = JobData->OnePastLastIndex;
} }
#else
gs_data Data = PushSizeToData(&State->Transient, sizeof(draw_leds_job_data));
draw_leds_job_data* JobData = (draw_leds_job_data*)Data.Memory;
JobData->LedBuffer = *LedBuffer;
JobData->StartIndex = 0;
JobData->OnePastLastIndex = LedBuffer->LedCount;
s32 JobLedCount = JobData->OnePastLastIndex - JobData->StartIndex;
JobData->Batch = &RenderLEDsBatch;
JobData->BatchReservedRange = ReserveRangeInQuadConstructor(JobData->Batch, JobLedCount * 2);
JobData->LEDHalfWidth = .5f;
JobData->CameraPosition = ToV4Point(State->Camera.Position);
Context.GeneralWorkQueue->PushWorkOnQueue(Context.GeneralWorkQueue, (thread_proc*)DrawLEDsInBufferRangeJob, Data, ConstString("Sculpture Draw LEDS"));
#endif
u32 f = 0;
} }
// TODO(Peter): I don't like the fact that setting an orthographic view inside a panel render function // TODO(Peter): I don't like the fact that setting an orthographic view inside a panel render function

View File

@ -327,6 +327,7 @@ ReserveRangeInQuadConstructor(render_quad_batch_constructor* Constructor, s32 Tr
{ {
quad_batch_constructor_reserved_range Result = {}; quad_batch_constructor_reserved_range Result = {};
Result.OnePastLast = Constructor->Count + TrisNeeded; Result.OnePastLast = Constructor->Count + TrisNeeded;
Constructor->Count = Result.OnePastLast;
Result.Start = Result.OnePastLast - TrisNeeded; Result.Start = Result.OnePastLast - TrisNeeded;
return Result; return Result;
} }