Skip to content

Commit cf6a586

Browse files
committed
WIP
1 parent 2ed86b3 commit cf6a586

9 files changed

Lines changed: 217 additions & 422 deletions

File tree

extensions/pl_renderer_ext.c

Lines changed: 46 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1126,6 +1126,20 @@ pl_renderer_create_scene(plSceneInit tInit)
11261126
ptScene->tProbeLightingShader = gptShaderVariant->get_shader("deferred_lighting", NULL, NULL, NULL, &gptData->tRenderPassLayout);
11271127
ptScene->tTerrainShader = gptShaderVariant->get_shader("terrain", NULL, NULL, NULL, &gptData->tRenderPassLayout);
11281128
ptScene->tTerrainShadowShader = gptShaderVariant->get_shader("terrain_shadow", NULL, NULL, NULL, &gptData->tDepthRenderPassLayout);
1129+
1130+
plGraphicsState tTerrainVariantTemp = {
1131+
.ulDepthWriteEnabled = 1,
1132+
.ulDepthMode = PL_COMPARE_MODE_GREATER,
1133+
.ulCullMode = PL_CULL_MODE_NONE,
1134+
.ulStencilMode = PL_COMPARE_MODE_ALWAYS,
1135+
.ulStencilRef = 0xff,
1136+
.ulStencilMask = 0xff,
1137+
.ulStencilOpFail = PL_STENCIL_OP_KEEP,
1138+
.ulStencilOpDepthFail = PL_STENCIL_OP_KEEP,
1139+
.ulStencilOpPass = PL_STENCIL_OP_KEEP,
1140+
.ulWireframe = 1
1141+
};
1142+
ptScene->tTerrainWireframeShader = gptShaderVariant->get_shader("terrain", &tTerrainVariantTemp, NULL, NULL, &gptData->tRenderPassLayout);
11291143

11301144
for(uint32_t i = 0; i < gptGfx->get_frames_in_flight(); i++)
11311145
{
@@ -1178,44 +1192,6 @@ pl_renderer_create_scene(plSceneInit tInit)
11781192

11791193
gptGfx->update_bind_group(gptData->ptDevice, ptScene->atShadowBG[i], &tShadowBGData);
11801194
}
1181-
1182-
1183-
#if 0
1184-
plCommandBuffer* ptCmdBuffer = gptStarter->get_temporary_command_buffer();
1185-
1186-
plTerrainProcessTileInfo tTile = {
1187-
.iTreeDepth = 6,
1188-
.fMaxHeight = 500.0f,
1189-
.fMinHeight = 0.0f,
1190-
.fMaxBaseError = 0.1f,
1191-
.tCenter = {0}
1192-
};
1193-
plTerrainProcessInfo tTerrainInfo = {
1194-
.fMetersPerPixel = 5.0f,
1195-
.uHorizontalTiles = 1,
1196-
.uVerticalTiles = 1,
1197-
.uSize = 1024,
1198-
.uTileCount = 1,
1199-
.atTiles = &tTile
1200-
};
1201-
1202-
sprintf(tTile.acOutputFile, "/assets/terrain.chu");
1203-
sprintf(tTile.acHeightMapFile, "/assets/terrain.png");
1204-
1205-
gptTerrain->process(&tTerrainInfo);
1206-
ptScene->ptTerrain = pl_renderer_create_terrain(ptCmdBuffer, &tTerrainInfo);
1207-
1208-
gptStarter->submit_temporary_command_buffer(ptCmdBuffer);
1209-
1210-
plTerrainTexture tTerrainTexture = {
1211-
.pcPath = "/textures/grass.png",
1212-
.fMetersPerPixel = 0.01f,
1213-
.tCenter = {0.0f, 0.0f}
1214-
};
1215-
pl_terrain_set_texture(ptScene, ptScene->ptTerrain, &tTerrainTexture);
1216-
#endif
1217-
1218-
// create semaphores
12191195
return ptScene;
12201196
}
12211197

@@ -1360,8 +1336,6 @@ pl_renderer_cleanup_scene(plScene* ptScene)
13601336
gptGfx->queue_buffer_for_deletion(gptData->ptDevice, ptScene->tIndexBuffer);
13611337
gptGfx->queue_buffer_for_deletion(gptData->ptDevice, ptScene->tStorageBuffer);
13621338

1363-
if(ptScene->ptTerrain)
1364-
pl_renderer_cleanup_terrain(ptScene->ptTerrain);
13651339
gptGfx->queue_texture_for_deletion(gptData->ptDevice, ptScene->tShadowTexture);
13661340
gptGfx->queue_render_pass_for_deletion(gptData->ptDevice, ptScene->tShadowRenderPass);
13671341
gptGfx->queue_render_pass_for_deletion(gptData->ptDevice, ptScene->tFirstShadowRenderPass);
@@ -1432,6 +1406,12 @@ pl_renderer_cleanup_scene(plScene* ptScene)
14321406
ptScene = NULL;
14331407
}
14341408

1409+
void
1410+
pl_renderer_set_terrain(plScene* ptScene, plTerrain* ptTerrain)
1411+
{
1412+
ptScene->ptTerrain = ptTerrain;
1413+
}
1414+
14351415
plView*
14361416
pl_renderer_create_view(plScene* ptScene, plVec2 tDimensions)
14371417
{
@@ -2699,6 +2679,21 @@ pl_renderer_reload_scene_shaders(plScene* ptScene)
26992679
ptScene->tTerrainShader = gptShaderVariant->get_shader("terrain", NULL, NULL, NULL, &gptData->tRenderPassLayout);
27002680
ptScene->tTerrainShadowShader = gptShaderVariant->get_shader("terrain_shadow", NULL, NULL, NULL, &gptData->tDepthRenderPassLayout);
27012681

2682+
plGraphicsState tTerrainVariantTemp = {
2683+
.ulDepthWriteEnabled = 1,
2684+
.ulDepthMode = PL_COMPARE_MODE_GREATER,
2685+
.ulCullMode = PL_CULL_MODE_NONE,
2686+
.ulStencilMode = PL_COMPARE_MODE_ALWAYS,
2687+
.ulStencilRef = 0xff,
2688+
.ulStencilMask = 0xff,
2689+
.ulStencilOpFail = PL_STENCIL_OP_KEEP,
2690+
.ulStencilOpDepthFail = PL_STENCIL_OP_KEEP,
2691+
.ulStencilOpPass = PL_STENCIL_OP_KEEP,
2692+
.ulWireframe = 1
2693+
};
2694+
ptScene->tTerrainWireframeShader = gptShaderVariant->get_shader("terrain", &tTerrainVariantTemp, NULL, NULL, &gptData->tRenderPassLayout);
2695+
2696+
27022697
gptShader->set_options(&tOriginalOptions);
27032698

27042699
const uint32_t uDrawableCount = pl_sb_size(ptScene->sbtDrawables);
@@ -3781,13 +3776,18 @@ pl_renderer_render_view(plView* ptView, plCamera* ptCamera, plCamera* ptCullCame
37813776
{
37823777
const plMat4 tMVP = pl_mul_mat4(&ptCamera->tProjMat, &ptCamera->tViewMat);
37833778

3779+
plShaderHandle tTerrainShader = ptScene->tTerrainShader;
3780+
3781+
if(ptScene->ptTerrain->tRuntimeOptions.tFlags & PL_TERRAIN_FLAGS_WIREFRAME)
3782+
tTerrainShader = ptScene->tTerrainWireframeShader;
3783+
37843784
gptGfx->set_depth_bias(ptMainEncoder, 0.0f, 0.0f, 0.0f);
3785-
gptGfx->bind_shader(ptMainEncoder, ptScene->tTerrainShader);
3785+
gptGfx->bind_shader(ptMainEncoder, tTerrainShader);
37863786
gptGfx->bind_vertex_buffer(ptMainEncoder, ptScene->ptTerrain->tVertexBuffer);
37873787
plBindGroupHandle atBindGroups[] = {ptScene->atSceneBindGroups[uFrameIdx], ptView->atDeferredBG1[uFrameIdx]};
37883788
gptGfx->bind_graphics_bind_groups(
37893789
ptMainEncoder,
3790-
ptScene->tTerrainShader,
3790+
tTerrainShader,
37913791
0, 2,
37923792
atBindGroups,
37933793
0, NULL
@@ -4913,6 +4913,10 @@ pl_load_renderer_ext(plApiRegistryI* ptApiRegistry, bool bReload)
49134913
tApi.get_ecs_type_key_object = pl_renderer_get_ecs_type_key_object;
49144914
tApi.run_skin_update_system = pl_renderer_run_skin_update_system;
49154915
tApi.run_object_update_system = pl_renderer_run_object_update_system;
4916+
tApi.create_terrain = pl_renderer_create_terrain;
4917+
tApi.cleanup_terrain = pl_renderer_cleanup_terrain;
4918+
tApi.set_terrain = pl_renderer_set_terrain;
4919+
tApi.get_terrain_runtime_options = pl_renderer_get_terrain_runtime_options;
49164920
pl_set_api(ptApiRegistry, plRendererI, &tApi);
49174921

49184922
// core apis

extensions/pl_renderer_ext.h

Lines changed: 47 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,10 @@ typedef struct _plRendererRuntimeOptions plRendererRuntimeOptions;
9393
typedef struct _plScene plScene; // opaque type
9494
typedef struct _plView plView; // opaque type
9595

96+
// terrain types
97+
typedef struct _plTerrain plTerrain; // opaque type
98+
typedef struct _plTerrainRuntimeOptions plTerrainRuntimeOptions;
99+
96100
// ecs components
97101
typedef struct _plObjectComponent plObjectComponent;
98102
typedef struct _plSkinComponent plSkinComponent;
@@ -104,22 +108,24 @@ typedef int plLightFlags;
104108
typedef int plEnvironmentProbeFlags;
105109
typedef int plObjectFlags;
106110
typedef int plTonemapMode;
111+
typedef int plTerrainFlags;
107112

108113
// external
109-
typedef struct _plWindow plWindow; // pl_platform_ext.h
110-
typedef struct _plGraphics plGraphics; // pl_graphics_ext.h
111-
typedef struct _plDevice plDevice; // pl_graphics_ext.h
112-
typedef struct _plDeviceInfo plDeviceInfo; // pl_graphics_ext.h
113-
typedef struct _plDrawList3D plDrawList3D; // pl_draw_ext.h
114-
typedef struct _plCommandBuffer plCommandBuffer; // pl_graphics_ext.h
115-
typedef struct _plCommandPool plCommandPool; // pl_graphics_ext.h
116-
typedef struct _plSwapchain plSwapchain; // pl_graphics_ext.h
117-
typedef union plTextureHandle plTextureHandle; // pl_graphics_ext.h
118-
typedef struct _plRenderEncoder plRenderEncoder; // pl_graphics_ext.h
119-
typedef union plRenderPassHandle plRenderPassHandle; // pl_graphics_ext.h
120-
typedef union plBindGroupHandle plBindGroupHandle; // pl_graphics_ext.h
121-
typedef struct _plComponentLibrary plComponentLibrary; // pl_ecs_ext.h
122-
typedef struct _plCamera plCamera; // pl_camera_ext.h
114+
typedef struct _plWindow plWindow; // pl_platform_ext.h
115+
typedef struct _plGraphics plGraphics; // pl_graphics_ext.h
116+
typedef struct _plDevice plDevice; // pl_graphics_ext.h
117+
typedef struct _plDeviceInfo plDeviceInfo; // pl_graphics_ext.h
118+
typedef struct _plDrawList3D plDrawList3D; // pl_draw_ext.h
119+
typedef struct _plCommandBuffer plCommandBuffer; // pl_graphics_ext.h
120+
typedef struct _plCommandPool plCommandPool; // pl_graphics_ext.h
121+
typedef struct _plSwapchain plSwapchain; // pl_graphics_ext.h
122+
typedef union plTextureHandle plTextureHandle; // pl_graphics_ext.h
123+
typedef struct _plRenderEncoder plRenderEncoder; // pl_graphics_ext.h
124+
typedef union plRenderPassHandle plRenderPassHandle; // pl_graphics_ext.h
125+
typedef union plBindGroupHandle plBindGroupHandle; // pl_graphics_ext.h
126+
typedef struct _plComponentLibrary plComponentLibrary; // pl_ecs_ext.h
127+
typedef struct _plCamera plCamera; // pl_camera_ext.h
128+
typedef struct _plTerrainProcessInfo plTerrainProcessInfo; // pl_terrain_ext.h
123129
typedef void* plTextureId; // pl_ui_ext.h
124130

125131
// external enums & flags
@@ -142,6 +148,12 @@ PL_API void pl_renderer_cleanup (void);
142148
// scenes
143149
PL_API plScene* pl_renderer_create_scene (plSceneInit);
144150
PL_API void pl_renderer_cleanup_scene(plScene*);
151+
PL_API void pl_renderer_set_terrain(plScene*, plTerrain*);
152+
153+
// terrain
154+
PL_API plTerrain* pl_renderer_create_terrain(plCommandBuffer*, plTerrainProcessInfo*);
155+
PL_API void pl_renderer_cleanup_terrain(plTerrain*);
156+
PL_API plTerrainRuntimeOptions* pl_renderer_get_terrain_runtime_options(plTerrain*);
145157

146158
// scene composition
147159
PL_API void pl_renderer_load_skybox_from_panorama (plScene*, const char* path, int resolution);
@@ -262,10 +274,14 @@ typedef struct _plRendererI
262274
void (*run_skin_update_system) (plComponentLibrary*);
263275
void (*run_light_update_system) (plComponentLibrary*);
264276
void (*run_environment_probe_update_system)(plComponentLibrary*);
265-
plEcsTypeKey (*get_ecs_type_key_object) (void);
266-
plEcsTypeKey (*get_ecs_type_key_skin) (void);
267-
plEcsTypeKey (*get_ecs_type_key_light) (void);
268-
plEcsTypeKey (*get_ecs_type_key_environment_probe)(void);
277+
plEcsTypeKey (*get_ecs_type_key_object) (void);
278+
plEcsTypeKey (*get_ecs_type_key_skin) (void);
279+
plEcsTypeKey (*get_ecs_type_key_light) (void);
280+
plEcsTypeKey (*get_ecs_type_key_environment_probe) (void);
281+
plTerrain* (*create_terrain) (plCommandBuffer*, plTerrainProcessInfo*);
282+
void (*cleanup_terrain) (plTerrain*);
283+
void (*set_terrain) (plScene*, plTerrain*);
284+
plTerrainRuntimeOptions* (*get_terrain_runtime_options) (plTerrain*);
269285
} plRendererI;
270286

271287
//-----------------------------------------------------------------------------
@@ -340,10 +356,23 @@ typedef struct _plRendererRuntimeOptions
340356

341357
} plRendererRuntimeOptions;
342358

359+
typedef struct _plTerrainRuntimeOptions
360+
{
361+
plTerrainFlags tFlags;
362+
float fTau;
363+
} plTerrainRuntimeOptions;
364+
343365
//-----------------------------------------------------------------------------
344366
// [SECTION] enums
345367
//-----------------------------------------------------------------------------
346368

369+
enum _plTerrainFlags
370+
{
371+
PL_TERRAIN_FLAGS_NONE = 0,
372+
PL_TERRAIN_FLAGS_WIREFRAME = 1 << 0,
373+
PL_TERRAIN_FLAGS_SHOW_LEVELS = 1 << 1
374+
};
375+
347376
enum _plLightFlags
348377
{
349378
PL_LIGHT_FLAG_NONE = 0,

extensions/pl_renderer_internal.h

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -146,17 +146,13 @@ typedef struct _plMemCpyJobData plMemCpyJobData;
146146
typedef struct _plOBB plOBB;
147147
typedef struct _plEnvironmentProbeData plEnvironmentProbeData;
148148

149-
// terrain
150-
typedef struct _plTerrain plTerrain;
151-
152149
// shader variants
153150
typedef struct _plShaderVariant plShaderVariant;
154151
typedef struct _plComputeShaderVariant plComputeShaderVariant;
155152

156153
// enums & flags
157154
typedef int plDrawableFlags;
158155
typedef int plSceneInternalFlags;
159-
typedef int plTerrainFlags;
160156

161157
//-----------------------------------------------------------------------------
162158
// [SECTION] enums
@@ -180,13 +176,6 @@ enum _plSceneInternalFlags
180176
PL_SCENE_INTERNAL_FLAG_OBJECT_COUNT_DIRTY = 1 << 3,
181177
};
182178

183-
enum _plTerrainFlags
184-
{
185-
PL_TERRAIN_FLAGS_NONE = 0,
186-
PL_TERRAIN_FLAGS_WIREFRAME = 1 << 0,
187-
PL_TERRAIN_FLAGS_SHOW_LEVELS = 1 << 1
188-
};
189-
190179
//-----------------------------------------------------------------------------
191180
// [SECTION] structs
192181
//-----------------------------------------------------------------------------
@@ -434,6 +423,7 @@ typedef struct _plScene
434423
plShaderHandle tPointLightingShader;
435424
plShaderHandle tTerrainShader;
436425
plShaderHandle tTerrainShadowShader;
426+
plShaderHandle tTerrainWireframeShader;
437427

438428
// render passes
439429
plRenderPassHandle tFirstShadowRenderPass;

0 commit comments

Comments
 (0)