Skip to content

Commit 66f94e2

Browse files
hoffstadthoffstadt-nasa
authored andcommitted
WIP
1 parent cb8635a commit 66f94e2

File tree

3 files changed

+168
-33
lines changed

3 files changed

+168
-33
lines changed

examples/example_gfx_3.c

Lines changed: 78 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -189,8 +189,9 @@ pl_app_load(plApiRegistryI* ptApiRegistry, plAppData* ptAppData)
189189
ptAppData = malloc(sizeof(plAppData));
190190
memset(ptAppData, 0, sizeof(plAppData));
191191

192-
ptAppData->bWireframe = true;
193-
ptAppData->fCameraSpeed = 10000.0f;
192+
193+
ptAppData->bWireframe = false;
194+
ptAppData->fCameraSpeed = 1000000.0f;
194195

195196
// retrieve extension registry
196197
const plExtensionRegistryI* ptExtensionRegistry = pl_get_api_latest(ptApiRegistry, plExtensionRegistryI);
@@ -262,9 +263,9 @@ pl_app_load(plApiRegistryI* ptApiRegistry, plAppData* ptAppData)
262263

263264
// create camera
264265
ptAppData->tCamera = (plCamera){
265-
.tPos = {1737000.0, 0.0f, 0.0f},
266+
.tPos = {1737500.0, 0.0f, 0.0f},
266267
.fNearZ = 0.01f,
267-
.fFarZ = 100000.0f * 2,
268+
.fFarZ = 5000000.0f,
268269
.fFieldOfView = PL_PI_3,
269270
.fAspectRatio = 1.0f,
270271
.fYaw = PL_PI + PL_PI_4,
@@ -285,7 +286,7 @@ pl_app_load(plApiRegistryI* ptApiRegistry, plAppData* ptAppData)
285286
plDVec3 tP3 = (plDVec3){ sqrt(6.0) / 3.0, -1.0 / 3.0, -sqrt(2.0) / 3.0};
286287

287288
// plDVec3 tRadi = {4.0, 3.0, 4.0};
288-
plDVec3 tRadi = {1737000.0, 1737000.0, 1737000.0};
289+
plDVec3 tRadi = {1737400.0, 1737400.0, 1737400.0};
289290

290291
plTesselationTriangle* sbtTessTris = NULL;
291292
pl_sb_push(sbtTessTris, ((plTesselationTriangle){.atPoints = {tP0, tP1, tP2}}));
@@ -334,7 +335,7 @@ pl_app_load(plApiRegistryI* ptApiRegistry, plAppData* ptAppData)
334335
tTri.atPoints[0] = pl_mul_vec3_d(tTri.atPoints[0], tRadi);
335336
tTri.atPoints[1] = pl_mul_vec3_d(tTri.atPoints[1], tRadi);
336337
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]);
338+
gptMeshBuilder->add_triangle_double(ptBuilder, tTri.atPoints[2], tTri.atPoints[1], tTri.atPoints[0]);
338339
}
339340
}
340341

@@ -462,8 +463,8 @@ pl_app_load(plApiRegistryI* ptApiRegistry, plAppData* ptAppData)
462463
.tMSAASampleCount = PL_SAMPLE_COUNT_1,
463464
.tGraphicsState = {
464465
.ulDepthWriteEnabled = 1,
465-
.ulDepthMode = PL_COMPARE_MODE_GREATER,
466-
.ulCullMode = PL_CULL_MODE_NONE,
466+
.ulDepthMode = PL_COMPARE_MODE_GREATER_OR_EQUAL,
467+
.ulCullMode = PL_CULL_MODE_CULL_BACK,
467468
.ulWireframe = 0,
468469
.ulStencilMode = PL_COMPARE_MODE_ALWAYS,
469470
.ulStencilRef = 0xff,
@@ -487,7 +488,15 @@ pl_app_load(plApiRegistryI* ptApiRegistry, plAppData* ptAppData)
487488
}
488489
},
489490
.atBlendStates = {
490-
{.bBlendEnabled = false}
491+
{
492+
.bBlendEnabled = true,
493+
.tSrcColorFactor = PL_BLEND_FACTOR_SRC_ALPHA,
494+
.tDstColorFactor = PL_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA,
495+
.tColorOp = PL_BLEND_OP_ADD,
496+
.tSrcAlphaFactor = PL_BLEND_FACTOR_SRC_ALPHA,
497+
.tDstAlphaFactor = PL_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA,
498+
.tAlphaOp = PL_BLEND_OP_ADD
499+
}
491500
},
492501
};
493502
ptAppData->tGlobeShader = gptGfx->create_shader(ptDevice, &tGlobeShaderDesc);
@@ -499,8 +508,8 @@ pl_app_load(plApiRegistryI* ptApiRegistry, plAppData* ptAppData)
499508
.tMSAASampleCount = PL_SAMPLE_COUNT_1,
500509
.tGraphicsState = {
501510
.ulDepthWriteEnabled = 1,
502-
.ulDepthMode = PL_COMPARE_MODE_GREATER,
503-
.ulCullMode = PL_CULL_MODE_NONE,
511+
.ulDepthMode = PL_COMPARE_MODE_GREATER_OR_EQUAL,
512+
.ulCullMode = PL_CULL_MODE_CULL_BACK,
504513
.ulWireframe = 1,
505514
.ulStencilMode = PL_COMPARE_MODE_ALWAYS,
506515
.ulStencilRef = 0xff,
@@ -524,7 +533,15 @@ pl_app_load(plApiRegistryI* ptApiRegistry, plAppData* ptAppData)
524533
}
525534
},
526535
.atBlendStates = {
527-
{.bBlendEnabled = false}
536+
{
537+
.bBlendEnabled = true,
538+
.tSrcColorFactor = PL_BLEND_FACTOR_SRC_ALPHA,
539+
.tDstColorFactor = PL_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA,
540+
.tColorOp = PL_BLEND_OP_ADD,
541+
.tSrcAlphaFactor = PL_BLEND_FACTOR_SRC_ALPHA,
542+
.tDstAlphaFactor = PL_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA,
543+
.tAlphaOp = PL_BLEND_OP_ADD
544+
}
528545
},
529546
};
530547
ptAppData->tGlobeWireframeShader = gptGfx->create_shader(ptDevice, &tGlobeWireframeShaderDesc);
@@ -583,6 +600,55 @@ pl_app_update(plAppData* ptAppData)
583600

584601
plCamera* ptCamera = &ptAppData->tCamera;
585602

603+
if(gptIO->is_key_pressed(PL_KEY_P, false))
604+
{
605+
plShaderDesc tGlobeShaderDesc = {
606+
.tVertexShader = gptShader->load_glsl("solid.vert", "main", NULL, NULL),
607+
.tPixelShader = gptShader->load_glsl("solid.frag", "main", NULL, NULL),
608+
.tRenderPassLayout = gptStarter->get_render_pass_layout(),
609+
.tMSAASampleCount = PL_SAMPLE_COUNT_1,
610+
.tGraphicsState = {
611+
.ulDepthWriteEnabled = 1,
612+
.ulDepthMode = PL_COMPARE_MODE_GREATER_OR_EQUAL,
613+
.ulCullMode = PL_CULL_MODE_CULL_BACK,
614+
.ulWireframe = 0,
615+
.ulStencilMode = PL_COMPARE_MODE_ALWAYS,
616+
.ulStencilRef = 0xff,
617+
.ulStencilMask = 0xff,
618+
.ulStencilOpFail = PL_STENCIL_OP_KEEP,
619+
.ulStencilOpDepthFail = PL_STENCIL_OP_KEEP,
620+
.ulStencilOpPass = PL_STENCIL_OP_KEEP,
621+
},
622+
.atVertexBufferLayouts = {
623+
{
624+
.uByteStride = sizeof(float) * 3,
625+
.atAttributes = {
626+
{.tFormat = PL_VERTEX_FORMAT_FLOAT3 }
627+
}
628+
},
629+
{
630+
.uByteStride = sizeof(float) * 3,
631+
.atAttributes = {
632+
{.tFormat = PL_VERTEX_FORMAT_FLOAT3 }
633+
}
634+
}
635+
},
636+
.atBlendStates = {
637+
{
638+
.bBlendEnabled = true,
639+
.tSrcColorFactor = PL_BLEND_FACTOR_SRC_ALPHA,
640+
.tDstColorFactor = PL_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA,
641+
.tColorOp = PL_BLEND_OP_ADD,
642+
.tSrcAlphaFactor = PL_BLEND_FACTOR_SRC_ALPHA,
643+
.tDstAlphaFactor = PL_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA,
644+
.tAlphaOp = PL_BLEND_OP_ADD
645+
}
646+
},
647+
};
648+
gptGfx->queue_shader_for_deletion(gptStarter->get_device(), ptAppData->tGlobeShader);
649+
ptAppData->tGlobeShader = gptGfx->create_shader(gptStarter->get_device(), &tGlobeShaderDesc);
650+
}
651+
586652
// camera space
587653
if(gptIO->is_key_down(PL_KEY_W)) camera_translate(ptCamera, 0.0f, 0.0f, ptAppData->fCameraSpeed * ptIO->fDeltaTime);
588654
if(gptIO->is_key_down(PL_KEY_S)) camera_translate(ptCamera, 0.0f, 0.0f, -ptAppData->fCameraSpeed* ptIO->fDeltaTime);

examples/shaders/solid.frag

Lines changed: 88 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ layout(location = 0) out vec4 outColor;
1414

1515
layout(location = 0) in struct plShaderOut {
1616
vec3 tPosition;
17+
vec3 tActualPosition;
1718
} tShaderIn;
1819

1920
//-----------------------------------------------------------------------------
@@ -27,36 +28,102 @@ const float shininess = 20.0;
2728
const vec4 lightColor = vec4(1.0, 1.0, 1.0, 1.0);
2829
const float irradiPerp = 1.0;
2930

30-
vec3 phongBRDF(vec3 lightDir, vec3 viewDir, vec3 normal, vec3 phongDiffuseCol, vec3 phongSpecularCol, float phongShininess) {
31-
vec3 color = phongDiffuseCol;
32-
vec3 reflectDir = reflect(-lightDir, normal);
33-
float specDot = max(dot(reflectDir, viewDir), 0.0);
34-
color += pow(specDot, phongShininess) * phongSpecularCol;
35-
return color;
31+
vec3
32+
pl_get_pos(float longitude, float latitude)
33+
{
34+
vec3 N = vec3(0);
35+
N.x = cos(latitude) * cos(longitude);
36+
N.y = cos(latitude) * sin(longitude);
37+
N.z = sin(latitude);
38+
float R = 1737400.0;
39+
float R2 = R * R;
40+
vec3 P = vec3(0);
41+
P.x = R2 * N.x / longitude;
42+
P.y = R2 * N.y / longitude;
43+
P.z = R2 * N.z / longitude;
44+
return P;
3645
}
3746

3847
void main()
3948
{
40-
// vec3 sunlightDirection = vec3(-1.0, -1.0, -1.0);
4149

42-
// vec3 ambient = vec3(0);
4350

44-
// vec3 lightDir = normalize(sunlightDirection);
45-
// vec3 viewDir = normalize(tShaderIn.tPosition - tObjectInfo.tCameraPosHigh.xyz);
46-
// // vec3 viewDir = normalize(-tShaderIn.tPosition);
47-
// vec3 n = normalize(tShaderIn.tPosition);
51+
// // degrees -> radians
52+
float rad = 3.14159265358979323846 / 180.0;
4853

49-
// vec3 radiance = ambient;
50-
51-
// float ddot = dot(lightDir, n);
52-
// float irradiance = max(ddot, 0.0) * irradiPerp;
53-
// if(irradiance > 0.0)
54+
// // Inputs: lon, lat in degrees (planetocentric, east-positive)
55+
// // CRS params (use from your WKT): lon0 = 0 for IAU_2015:30130, k0 = 1
56+
float R = 1737400.0;
57+
// float lon0 = 0.0;
58+
// float k0 = 1.0;
59+
60+
float lat = asin(tShaderIn.tActualPosition.y / R);
61+
float lon = atan(tShaderIn.tActualPosition.z / tShaderIn.tActualPosition.x);
62+
63+
// float lat = asin(tShaderIn.tActualPosition.x / R);
64+
// float lon = atan(tShaderIn.tActualPosition.y / tShaderIn.tActualPosition.z);
65+
66+
// float phi = lat * rad;
67+
// float lam = lon * rad;
68+
// float lam0 = lon0 * rad;
69+
70+
// // Stereographic (north polar)
71+
// float t = tan(3.14159265358979323846/4.0 + phi/2.0); // ρ/(2R) for k0=1
72+
// float rho = 2.0 * R * k0 * t;
73+
74+
// float x = rho * sin(lam - lam0);
75+
// float y = -rho * cos(lam - lam0); // north polar, y increases south in projected coords
76+
77+
// float minX = -1439640.0;
78+
// float maxX = minX + 720.0 * (4000 - 1);
79+
80+
// float minY = 1439640.0;
81+
// float maxY = minY + -720.0 * (4000 - 1);
82+
83+
// // Now convert projected (x,y in meters) -> PNG uv:
84+
// float u = (x - minX) / (maxX - minX);
85+
// float v = (maxY - y) / (maxY - minY); // top-left origin
86+
// v = abs(v);
87+
88+
89+
// outColor.rgb = vec3(1.0);
90+
// outColor.a = 1.0;
91+
92+
// if(u >= 0.0 && u <= 1.0 && v >= 0.0 && v <= 1.0)
5493
// {
55-
// vec3 brdf = phongBRDF(lightDir, viewDir, n, diffuseColor.rgb, specularColor.rgb, shininess);
56-
// radiance += brdf * irradiance * lightColor.rgb;
94+
// outColor.rg = vec2(u, v);
95+
// outColor.b = 0.0;
5796
// }
5897

59-
// radiance = pow(radiance, vec3(1.0 / 2.2) ); // gamma correction
60-
outColor.rgb = vec3(1.0);
98+
// vec2 tXZPlane = normalize(tShaderIn.tActualPosition.xz);
99+
// float longitude = atan(tShaderIn.tActualPosition.z / tShaderIn.tActualPosition.x);
100+
// float latitude = atan(tShaderIn.tActualPosition.z / tShaderIn.tActualP);
101+
102+
outColor.r = 0.2;
103+
outColor.g = 0.2;
104+
outColor.b = 0.2;
61105
outColor.a = 1.0;
106+
107+
vec2 tGeographic = vec2(lon, lat);
108+
109+
vec2 tUpperLeft = vec2(-45.0 * rad, -29.0 * rad);
110+
vec2 tLowerLeft = vec2(-135.0 * rad, -29.0 * rad);
111+
vec2 tUpperRight = vec2(45.0 * rad, -29.0 * rad);
112+
vec2 tLowerRight = vec2(135.0 * rad, -29.0 * rad);
113+
114+
vec3 tUpperLeftP = pl_get_pos(tUpperLeft.x, tUpperLeft.y);
115+
vec3 tLowerLeftP = pl_get_pos(tLowerLeft.x, tLowerLeft.y);
116+
vec3 tUpperRightP = pl_get_pos(tUpperRight.x, tUpperRight.y);
117+
vec3 tLowerRightP = pl_get_pos(tLowerRight.x, tLowerRight.y);
118+
119+
float rr = length(tUpperLeftP);
120+
121+
if(
122+
tGeographic.y < tUpperLeft.y
123+
&& tShaderIn.tActualPosition.x < tUpperLeftP.y
124+
)
125+
{
126+
outColor.r += 0.5;
127+
}
128+
62129
}

examples/shaders/solid.vert

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ layout(location = 1) in vec3 inLowPos;
1515

1616
layout(location = 0) out struct plShaderOut {
1717
vec3 tPosition;
18+
vec3 tActualPosition;
1819
} tShaderIn;
1920

2021
void main()
@@ -31,5 +32,6 @@ void main()
3132

3233

3334
tShaderIn.tPosition = lowDifference + highDifference;
35+
tShaderIn.tActualPosition = inHighPos;
3436
gl_Position = tObjectInfo.tCameraViewProjection * vec4(tShaderIn.tPosition, 1.0);
3537
}

0 commit comments

Comments
 (0)