@@ -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);
129132void camera_rotate (plCamera * , float fDPitch , float fDYaw );
130133void camera_rotate (plCamera * , float fDPitch , float fDYaw );
131134void camera_update (plCamera * );
135+ void camera_update2 (plCamera * );
132136
133137static void
134138pl__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