Skip to content

Commit 5c4cc07

Browse files
hoffstadthoffstadt-nasa
authored andcommitted
WIP
1 parent cb8635a commit 5c4cc07

File tree

3 files changed

+312
-46
lines changed

3 files changed

+312
-46
lines changed

examples/example_gfx_3.c

Lines changed: 235 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,11 @@ typedef struct _plCamera
5656
float fFieldOfView;
5757
float fAspectRatio; // width/height
5858
plMat4 tViewMat; // cached
59+
plMat4 tViewMat2; // cached
5960
plMat4 tProjMat; // cached
61+
plMat4 tProjMat2; // cached
6062
plMat4 tTransformMat; // cached
63+
plMat4 tTransformMat2; // cached
6164

6265
// rotations
6366
float fPitch; // rotation about right vector
@@ -129,6 +132,7 @@ void camera_translate(plCamera*, double dDx, double dDy, double dDz);
129132
void camera_rotate (plCamera*, float fDPitch, float fDYaw);
130133
void camera_rotate (plCamera*, float fDPitch, float fDYaw);
131134
void camera_update (plCamera*);
135+
void camera_update2 (plCamera*);
132136

133137
static void
134138
pl__split_double(double dValue, float* ptHighOut, float* ptLowOut)
@@ -149,6 +153,37 @@ pl__split_double(double dValue, float* ptHighOut, float* ptLowOut)
149153
*ptLowOut = (float)(dValue - *ptHighOut);
150154
}
151155

156+
static void
157+
draw_point(plAppData* ptAppData, float fLongitude, float fLatitude, uint32_t uColor)
158+
{
159+
160+
fLongitude = pl_radiansf(fLongitude);
161+
fLatitude = pl_radiansf(fLatitude);
162+
163+
plSphere tSphere = {
164+
.fRadius = 10000.0f,
165+
};
166+
167+
// PL COORDINATES
168+
plVec3 N = {
169+
cosf(fLatitude) * sinf(fLongitude),
170+
sinf(fLatitude),
171+
cosf(fLatitude) * cosf(fLongitude)
172+
};
173+
174+
float R = 1737400.0;
175+
float R2 = R * R;
176+
177+
float v = sqrtf(R2 * pl_square(N.x) + R2 * pl_square(N.y) + R2 * pl_square(N.z));
178+
plVec3 P = {
179+
R2 * N.x / v,
180+
R2 * N.y / v,
181+
R2 * N.z / v
182+
};
183+
tSphere.tCenter = P;
184+
gptDraw->add_3d_sphere_filled(ptAppData->pt3dDrawlist, tSphere, 0, 0, (plDrawSolidOptions){.uColor = uColor});
185+
}
186+
152187
//-----------------------------------------------------------------------------
153188
// [SECTION] pl_app_load
154189
//-----------------------------------------------------------------------------
@@ -189,8 +224,9 @@ pl_app_load(plApiRegistryI* ptApiRegistry, plAppData* ptAppData)
189224
ptAppData = malloc(sizeof(plAppData));
190225
memset(ptAppData, 0, sizeof(plAppData));
191226

192-
ptAppData->bWireframe = true;
193-
ptAppData->fCameraSpeed = 10000.0f;
227+
228+
ptAppData->bWireframe = false;
229+
ptAppData->fCameraSpeed = 1000000.0f;
194230

195231
// retrieve extension registry
196232
const plExtensionRegistryI* ptExtensionRegistry = pl_get_api_latest(ptApiRegistry, plExtensionRegistryI);
@@ -262,9 +298,9 @@ pl_app_load(plApiRegistryI* ptApiRegistry, plAppData* ptAppData)
262298

263299
// create camera
264300
ptAppData->tCamera = (plCamera){
265-
.tPos = {1737000.0, 0.0f, 0.0f},
301+
.tPos = {1737500.0, 0.0f, 0.0f},
266302
.fNearZ = 0.01f,
267-
.fFarZ = 100000.0f * 2,
303+
.fFarZ = 5000000.0f,
268304
.fFieldOfView = PL_PI_3,
269305
.fAspectRatio = 1.0f,
270306
.fYaw = PL_PI + PL_PI_4,
@@ -285,7 +321,7 @@ pl_app_load(plApiRegistryI* ptApiRegistry, plAppData* ptAppData)
285321
plDVec3 tP3 = (plDVec3){ sqrt(6.0) / 3.0, -1.0 / 3.0, -sqrt(2.0) / 3.0};
286322

287323
// plDVec3 tRadi = {4.0, 3.0, 4.0};
288-
plDVec3 tRadi = {1737000.0, 1737000.0, 1737000.0};
324+
plDVec3 tRadi = {1737400.0, 1737400.0, 1737400.0};
289325

290326
plTesselationTriangle* sbtTessTris = NULL;
291327
pl_sb_push(sbtTessTris, ((plTesselationTriangle){.atPoints = {tP0, tP1, tP2}}));
@@ -334,7 +370,7 @@ pl_app_load(plApiRegistryI* ptApiRegistry, plAppData* ptAppData)
334370
tTri.atPoints[0] = pl_mul_vec3_d(tTri.atPoints[0], tRadi);
335371
tTri.atPoints[1] = pl_mul_vec3_d(tTri.atPoints[1], tRadi);
336372
tTri.atPoints[2] = pl_mul_vec3_d(tTri.atPoints[2], tRadi);
337-
gptMeshBuilder->add_triangle_double(ptBuilder, tTri.atPoints[0], tTri.atPoints[1], tTri.atPoints[2]);
373+
gptMeshBuilder->add_triangle_double(ptBuilder, tTri.atPoints[2], tTri.atPoints[1], tTri.atPoints[0]);
338374
}
339375
}
340376

@@ -462,8 +498,8 @@ pl_app_load(plApiRegistryI* ptApiRegistry, plAppData* ptAppData)
462498
.tMSAASampleCount = PL_SAMPLE_COUNT_1,
463499
.tGraphicsState = {
464500
.ulDepthWriteEnabled = 1,
465-
.ulDepthMode = PL_COMPARE_MODE_GREATER,
466-
.ulCullMode = PL_CULL_MODE_NONE,
501+
.ulDepthMode = PL_COMPARE_MODE_GREATER_OR_EQUAL,
502+
.ulCullMode = PL_CULL_MODE_CULL_BACK,
467503
.ulWireframe = 0,
468504
.ulStencilMode = PL_COMPARE_MODE_ALWAYS,
469505
.ulStencilRef = 0xff,
@@ -487,7 +523,15 @@ pl_app_load(plApiRegistryI* ptApiRegistry, plAppData* ptAppData)
487523
}
488524
},
489525
.atBlendStates = {
490-
{.bBlendEnabled = false}
526+
{
527+
.bBlendEnabled = true,
528+
.tSrcColorFactor = PL_BLEND_FACTOR_SRC_ALPHA,
529+
.tDstColorFactor = PL_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA,
530+
.tColorOp = PL_BLEND_OP_ADD,
531+
.tSrcAlphaFactor = PL_BLEND_FACTOR_SRC_ALPHA,
532+
.tDstAlphaFactor = PL_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA,
533+
.tAlphaOp = PL_BLEND_OP_ADD
534+
}
491535
},
492536
};
493537
ptAppData->tGlobeShader = gptGfx->create_shader(ptDevice, &tGlobeShaderDesc);
@@ -499,8 +543,8 @@ pl_app_load(plApiRegistryI* ptApiRegistry, plAppData* ptAppData)
499543
.tMSAASampleCount = PL_SAMPLE_COUNT_1,
500544
.tGraphicsState = {
501545
.ulDepthWriteEnabled = 1,
502-
.ulDepthMode = PL_COMPARE_MODE_GREATER,
503-
.ulCullMode = PL_CULL_MODE_NONE,
546+
.ulDepthMode = PL_COMPARE_MODE_GREATER_OR_EQUAL,
547+
.ulCullMode = PL_CULL_MODE_CULL_BACK,
504548
.ulWireframe = 1,
505549
.ulStencilMode = PL_COMPARE_MODE_ALWAYS,
506550
.ulStencilRef = 0xff,
@@ -524,7 +568,15 @@ pl_app_load(plApiRegistryI* ptApiRegistry, plAppData* ptAppData)
524568
}
525569
},
526570
.atBlendStates = {
527-
{.bBlendEnabled = false}
571+
{
572+
.bBlendEnabled = true,
573+
.tSrcColorFactor = PL_BLEND_FACTOR_SRC_ALPHA,
574+
.tDstColorFactor = PL_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA,
575+
.tColorOp = PL_BLEND_OP_ADD,
576+
.tSrcAlphaFactor = PL_BLEND_FACTOR_SRC_ALPHA,
577+
.tDstAlphaFactor = PL_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA,
578+
.tAlphaOp = PL_BLEND_OP_ADD
579+
}
528580
},
529581
};
530582
ptAppData->tGlobeWireframeShader = gptGfx->create_shader(ptDevice, &tGlobeWireframeShaderDesc);
@@ -583,6 +635,55 @@ pl_app_update(plAppData* ptAppData)
583635

584636
plCamera* ptCamera = &ptAppData->tCamera;
585637

638+
if(gptIO->is_key_pressed(PL_KEY_P, false))
639+
{
640+
plShaderDesc tGlobeShaderDesc = {
641+
.tVertexShader = gptShader->load_glsl("solid.vert", "main", NULL, NULL),
642+
.tPixelShader = gptShader->load_glsl("solid.frag", "main", NULL, NULL),
643+
.tRenderPassLayout = gptStarter->get_render_pass_layout(),
644+
.tMSAASampleCount = PL_SAMPLE_COUNT_1,
645+
.tGraphicsState = {
646+
.ulDepthWriteEnabled = 1,
647+
.ulDepthMode = PL_COMPARE_MODE_GREATER_OR_EQUAL,
648+
.ulCullMode = PL_CULL_MODE_CULL_BACK,
649+
.ulWireframe = 0,
650+
.ulStencilMode = PL_COMPARE_MODE_ALWAYS,
651+
.ulStencilRef = 0xff,
652+
.ulStencilMask = 0xff,
653+
.ulStencilOpFail = PL_STENCIL_OP_KEEP,
654+
.ulStencilOpDepthFail = PL_STENCIL_OP_KEEP,
655+
.ulStencilOpPass = PL_STENCIL_OP_KEEP,
656+
},
657+
.atVertexBufferLayouts = {
658+
{
659+
.uByteStride = sizeof(float) * 3,
660+
.atAttributes = {
661+
{.tFormat = PL_VERTEX_FORMAT_FLOAT3 }
662+
}
663+
},
664+
{
665+
.uByteStride = sizeof(float) * 3,
666+
.atAttributes = {
667+
{.tFormat = PL_VERTEX_FORMAT_FLOAT3 }
668+
}
669+
}
670+
},
671+
.atBlendStates = {
672+
{
673+
.bBlendEnabled = true,
674+
.tSrcColorFactor = PL_BLEND_FACTOR_SRC_ALPHA,
675+
.tDstColorFactor = PL_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA,
676+
.tColorOp = PL_BLEND_OP_ADD,
677+
.tSrcAlphaFactor = PL_BLEND_FACTOR_SRC_ALPHA,
678+
.tDstAlphaFactor = PL_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA,
679+
.tAlphaOp = PL_BLEND_OP_ADD
680+
}
681+
},
682+
};
683+
gptGfx->queue_shader_for_deletion(gptStarter->get_device(), ptAppData->tGlobeShader);
684+
ptAppData->tGlobeShader = gptGfx->create_shader(gptStarter->get_device(), &tGlobeShaderDesc);
685+
}
686+
586687
// camera space
587688
if(gptIO->is_key_down(PL_KEY_W)) camera_translate(ptCamera, 0.0f, 0.0f, ptAppData->fCameraSpeed * ptIO->fDeltaTime);
588689
if(gptIO->is_key_down(PL_KEY_S)) camera_translate(ptCamera, 0.0f, 0.0f, -ptAppData->fCameraSpeed* ptIO->fDeltaTime);
@@ -600,6 +701,7 @@ pl_app_update(plAppData* ptAppData)
600701
gptIO->reset_mouse_drag_delta(PL_MOUSE_BUTTON_LEFT);
601702
}
602703
camera_update(ptCamera);
704+
camera_update2(ptCamera);
603705

604706
if(gptUi->begin_window("Debug", NULL, 0))
605707
{
@@ -610,13 +712,80 @@ pl_app_update(plAppData* ptAppData)
610712
}
611713

612714
// 3d drawing API usage
613-
// const plMat4 tOrigin = pl_identity_mat4();
614-
// gptDraw->add_3d_transform(ptAppData->pt3dDrawlist, &tOrigin, 10.0f, (plDrawLineOptions){.fThickness = 0.2f});
715+
const plMat4 tOrigin = pl_identity_mat4();
716+
gptDraw->add_3d_transform(ptAppData->pt3dDrawlist, &tOrigin, 1.1f * 1737400.0f, (plDrawLineOptions){.fThickness = 1000.0f});
717+
718+
719+
draw_point(ptAppData, 0.0f, 0.0f, PL_COLOR_32_YELLOW);
720+
draw_point(ptAppData, 0.0f, 15.0f, PL_COLOR_32_YELLOW);
721+
draw_point(ptAppData, 0.0f, 30.0f, PL_COLOR_32_YELLOW);
722+
draw_point(ptAppData, 0.0f, 45.0f, PL_COLOR_32_YELLOW);
723+
draw_point(ptAppData, 0.0f, 60.0f, PL_COLOR_32_YELLOW);
724+
draw_point(ptAppData, 0.0f, 75.0f, PL_COLOR_32_YELLOW);
725+
draw_point(ptAppData, 0.0f, 90.0f, PL_COLOR_32_YELLOW);
726+
draw_point(ptAppData, 0.0f, -15.0f, PL_COLOR_32_YELLOW);
727+
draw_point(ptAppData, 0.0f, -30.0f, PL_COLOR_32_YELLOW);
728+
draw_point(ptAppData, 0.0f, -45.0f, PL_COLOR_32_YELLOW);
729+
draw_point(ptAppData, 0.0f, -60.0f, PL_COLOR_32_YELLOW);
730+
draw_point(ptAppData, 0.0f, -75.0f, PL_COLOR_32_YELLOW);
731+
draw_point(ptAppData, 0.0f, -90.0f, PL_COLOR_32_YELLOW);
732+
733+
draw_point(ptAppData, 15.0f, 0.0f, PL_COLOR_32_YELLOW);
734+
draw_point(ptAppData, 30.0f, 0.0f, PL_COLOR_32_YELLOW);
735+
draw_point(ptAppData, 45.0f, 0.0f, PL_COLOR_32_YELLOW);
736+
draw_point(ptAppData, 60.0f, 0.0f, PL_COLOR_32_YELLOW);
737+
draw_point(ptAppData, 75.0f, 0.0f, PL_COLOR_32_YELLOW);
738+
draw_point(ptAppData, 90.0f, 0.0f, PL_COLOR_32_YELLOW);
739+
draw_point(ptAppData, -15.0f, 0.0f, PL_COLOR_32_YELLOW);
740+
draw_point(ptAppData, -30.0f, 0.0f, PL_COLOR_32_YELLOW);
741+
draw_point(ptAppData, -45.0f, 0.0f, PL_COLOR_32_YELLOW);
742+
draw_point(ptAppData, -60.0f, 0.0f, PL_COLOR_32_YELLOW);
743+
draw_point(ptAppData, -75.0f, 0.0f, PL_COLOR_32_YELLOW);
744+
draw_point(ptAppData, -90.0f, 0.0f, PL_COLOR_32_YELLOW);
745+
746+
draw_point(ptAppData, -45.0f, -29.0f, PL_COLOR_32_GREEN);
747+
draw_point(ptAppData, -135.0f, -29.0f, PL_COLOR_32_GREEN);
748+
draw_point(ptAppData, 45.0f, -29.0f, PL_COLOR_32_GREEN);
749+
draw_point(ptAppData, 135.0f, -29.0f, PL_COLOR_32_GREEN);
750+
751+
float fLongitude = 45.0f;
752+
float fLatitude = -29.0f;
753+
754+
fLongitude = pl_radiansf(fLongitude);
755+
fLatitude = pl_radiansf(fLatitude);
756+
757+
float R = 1737400.0;
758+
// gptDraw->add_3d_plane_yz_filled(ptAppData->pt3dDrawlist, (plVec3){0}, R * 4.0f, R * 4.0f, (plDrawSolidOptions){.uColor = PL_COLOR_32_RGBA(1.0f, 0.0f, 0.0f, 0.5f)});
759+
760+
plVec3 N = {
761+
cosf(fLatitude) * sinf(fLongitude),
762+
sinf(fLatitude),
763+
cosf(fLatitude) * cosf(fLongitude)
764+
};
765+
766+
float R2 = R * R;
767+
768+
float v = sqrtf(R2 * pl_square(N.x) + R2 * pl_square(N.y) + R2 * pl_square(N.z));
769+
plVec3 P = {
770+
R2 * N.x / v,
771+
// R2 * N.y / v,
772+
// R2 * N.z / v
773+
};
774+
775+
gptDraw->add_3d_plane_yz_filled(ptAppData->pt3dDrawlist, P, R * 2.0f, R * 2.0f, (plDrawSolidOptions){.uColor = PL_COLOR_32_RGBA(1.0f, 1.0f, 0.0f, 0.5f)});
776+
777+
778+
plSphere tSphere = {
779+
.fRadius = 10000.0f,
780+
.tCenter = P
781+
};
782+
gptDraw->add_3d_sphere_filled(ptAppData->pt3dDrawlist, tSphere, 0, 0, (plDrawSolidOptions){.uColor = PL_COLOR_32_WHITE});
615783

616784
// start main pass & return the encoder being used
617785
plRenderEncoder* ptEncoder = gptStarter->begin_main_pass();
618786

619787
const plMat4 tMVP = pl_mul_mat4(&ptCamera->tProjMat, &ptCamera->tViewMat);
788+
const plMat4 tMVP2 = pl_mul_mat4(&ptCamera->tProjMat2, &ptCamera->tViewMat2);
620789

621790
plDevice* ptDevice = gptStarter->get_device();
622791

@@ -654,14 +823,14 @@ pl_app_update(plAppData* ptAppData)
654823

655824
gptGfx->draw_indexed(ptEncoder, 1, &tDraw);
656825

657-
// // submit 3d drawlist
658-
// gptDrawBackend->submit_3d_drawlist(ptAppData->pt3dDrawlist,
659-
// ptEncoder,
660-
// ptIO->tMainViewportSize.x,
661-
// ptIO->tMainViewportSize.y,
662-
// &tMVP,
663-
// PL_DRAW_FLAG_DEPTH_TEST | PL_DRAW_FLAG_DEPTH_WRITE,
664-
// gptGfx->get_swapchain_info(gptStarter->get_swapchain()).tSampleCount);
826+
// submit 3d drawlist
827+
gptDrawBackend->submit_3d_drawlist(ptAppData->pt3dDrawlist,
828+
ptEncoder,
829+
ptIO->tMainViewportSize.x,
830+
ptIO->tMainViewportSize.y,
831+
&tMVP2,
832+
PL_DRAW_FLAG_DEPTH_TEST | PL_DRAW_FLAG_DEPTH_WRITE | PL_DRAW_FLAG_REVERSE_Z_DEPTH,
833+
gptGfx->get_swapchain_info(gptStarter->get_swapchain()).tSampleCount);
665834

666835
// allows the starter extension to handle some things then ends the main pass
667836
gptStarter->end_main_pass();
@@ -757,3 +926,47 @@ camera_update(plCamera* ptCamera)
757926
ptCamera->tProjMat.col[3].z = -ptCamera->fNearZ * ptCamera->fFarZ / (ptCamera->fNearZ - ptCamera->fFarZ);
758927
ptCamera->tProjMat.col[3].w = 0.0f;
759928
}
929+
930+
void
931+
camera_update2(plCamera* ptCamera)
932+
{
933+
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~update view~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
934+
935+
// world space
936+
static const plVec4 tOriginalUpVec = {0.0f, 1.0f, 0.0f, 0.0f};
937+
static const plVec4 tOriginalForwardVec = {0.0f, 0.0f, 1.0f, 0.0f};
938+
static const plVec4 tOriginalRightVec = {-1.0f, 0.0f, 0.0f, 0.0f};
939+
940+
const plMat4 tXRotMat = pl_mat4_rotate_vec3(ptCamera->fPitch, tOriginalRightVec.xyz);
941+
const plMat4 tYRotMat = pl_mat4_rotate_vec3(ptCamera->fYaw, tOriginalUpVec.xyz);
942+
const plMat4 tZRotMat = pl_mat4_rotate_vec3(ptCamera->fRoll, tOriginalForwardVec.xyz);
943+
const plMat4 tTranslate = pl_mat4_translate_vec3((plVec3){(float)ptCamera->tPos.x, (float)ptCamera->tPos.y, (float)ptCamera->tPos.z});
944+
945+
// rotations: rotY * rotX * rotZ
946+
plMat4 tRotations = pl_mul_mat4t(&tXRotMat, &tZRotMat);
947+
tRotations = pl_mul_mat4t(&tYRotMat, &tRotations);
948+
949+
// update camera vectors
950+
ptCamera->_tRightVec = pl_norm_vec4(pl_mul_mat4_vec4(&tRotations, tOriginalRightVec)).xyz;
951+
ptCamera->_tUpVec = pl_norm_vec4(pl_mul_mat4_vec4(&tRotations, tOriginalUpVec)).xyz;
952+
ptCamera->_tForwardVec = pl_norm_vec4(pl_mul_mat4_vec4(&tRotations, tOriginalForwardVec)).xyz;
953+
954+
// update camera transform: translate * rotate
955+
ptCamera->tTransformMat2 = pl_mul_mat4t(&tTranslate, &tRotations);
956+
957+
// update camera view matrix
958+
ptCamera->tViewMat2 = pl_mat4t_invert(&ptCamera->tTransformMat2);
959+
960+
// flip x & y so camera looks down +z and remains right handed (+x to the right)
961+
const plMat4 tFlipXY = pl_mat4_scale_xyz(-1.0f, -1.0f, 1.0f);
962+
ptCamera->tViewMat2 = pl_mul_mat4t(&tFlipXY, &ptCamera->tViewMat2);
963+
964+
//~~~~~~~~~~~~~~~~~~~~~~~~~~~update projection~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
965+
const float fInvtanHalfFovy = 1.0f / tanf(ptCamera->fFieldOfView / 2.0f);
966+
ptCamera->tProjMat2.col[0].x = fInvtanHalfFovy / ptCamera->fAspectRatio;
967+
ptCamera->tProjMat2.col[1].y = fInvtanHalfFovy;
968+
ptCamera->tProjMat2.col[2].z = ptCamera->fNearZ / (ptCamera->fNearZ - ptCamera->fFarZ);
969+
ptCamera->tProjMat2.col[2].w = 1.0f;
970+
ptCamera->tProjMat2.col[3].z = -ptCamera->fNearZ * ptCamera->fFarZ / (ptCamera->fNearZ - ptCamera->fFarZ);
971+
ptCamera->tProjMat2.col[3].w = 0.0f;
972+
}

0 commit comments

Comments
 (0)