Fov tweaks

This commit is contained in:
2026-07-01 20:18:32 -05:00
parent 172dc5d37b
commit 117bdf0c00
5 changed files with 72 additions and 12 deletions
+1 -1
View File
@@ -49,7 +49,7 @@ errorret_t rpgInit(void) {
entity_t *npc = &ENTITIES[npcIndex];
entityInit(npc, ENTITY_TYPE_NPC);
npcSetMoveType(npc, NPC_MOVE_TYPE_PATH);
npc->position = (worldpos_t){ 8, 8, 0 };
npc->position = (worldpos_t){ 8, 8, 1 };
npc->interact.type = ENTITY_INTERACT_PRINT;
npc->interact.data.message = "hello world";
{
+1 -1
View File
@@ -48,7 +48,7 @@ void rpgCameraUpdateProjection(void) {
#endif
glm_perspective(
glm_rad(45.0f),
glm_rad(RPG_CAMERA_FOV),
SCREEN.aspect,
0.1f,
100.0f,
+2
View File
@@ -9,6 +9,8 @@
#include "rpg/overworld/worldpos.h"
#include "error/error.h"
#define RPG_CAMERA_FOV 35.0f
typedef enum {
RPG_CAMERA_MODE_FREE,
RPG_CAMERA_MODE_FOLLOW_ENTITY,
+56 -7
View File
@@ -59,7 +59,7 @@ errorret_t sceneOverworldRender(scenedata_t *sceneData) {
));
// Camera Eye
float_t fov = glm_rad(45.0f);
float_t fov = glm_rad(RPG_CAMERA_FOV);
float_t pixelsPerUnit = TILE_SIZE_PIXELS;
float_t worldH = (float_t)(SCREEN.height / SCREEN.scale3d) / pixelsPerUnit;
float_t z = (worldH * 0.5f) / tanf(fov * 0.5f);
@@ -81,8 +81,15 @@ errorret_t sceneOverworldRender(scenedata_t *sceneData) {
);
errorChain(shaderSetMatrix(&SHADER_UNLIT, SHADER_UNLIT_VIEW, eye));
// Chunks
errorChain(sceneOverworldDrawChunks());
// Base terrain meshes, drawn with normal depth testing.
errorChain(sceneOverworldDrawChunksBase());
// Entities are drawn with depth testing fully disabled so sloped tiles
// (ramps) never clip them; entity-vs-entity overlap falls back to
// array draw order instead of true depth.
errorChain(displaySetState((displaystate_t){
.flags = DISPLAY_STATE_FLAG_CULL
}));
// Entities
{
@@ -115,16 +122,59 @@ errorret_t sceneOverworldRender(scenedata_t *sceneData) {
}
}
// Other chunk meshes (trees, buildings, etc), drawn last with normal
// depth testing so they correctly occlude entities standing beneath
// them.
errorChain(displaySetState((displaystate_t){
.flags = DISPLAY_STATE_FLAG_DEPTH_TEST | DISPLAY_STATE_FLAG_CULL
}));
errorChain(sceneOverworldDrawChunksProps());
errorOk();
}
errorret_t sceneOverworldDrawChunks() {
errorret_t sceneOverworldDrawChunksBase() {
for(chunkindex_t i = 0; i < MAP_CHUNK_COUNT; i++) {
chunk_t *chunk = MAP.chunkOrder[i];
if(chunk == NULL) continue;
if(chunk->meshCount == 0) continue;
if(chunk->modelEntries[0] == NULL) continue;
if(chunk->modelEntries[0]->state != ASSET_ENTRY_STATE_LOADED) continue;
for(uint8_t m = 0; m < chunk->meshCount; m++) {
assetmodeloutput_t *model = &chunk->modelEntries[0]->data.model;
if(model->meshEntry == NULL) continue;
texture_t *tex = model->texEntry != NULL
? &model->texEntry->data.texture
: NULL;
shadermaterial_t mat = {
.unlit = { .color = model->color, .texture = tex }
};
errorChain(shaderSetMatrix(
&SHADER_UNLIT, SHADER_UNLIT_MODEL, chunk->meshModels[0]
));
errorChain(shaderSetMaterial(&SHADER_UNLIT, &mat));
errorChain(meshDraw(
&model->meshEntry->data.mesh.mesh, 0, -1
));
}
// Restore identity model so subsequent renders (e.g. entities) are
// not affected by the last chunk transform.
mat4 identity;
glm_mat4_identity(identity);
errorChain(shaderSetMatrix(&SHADER_UNLIT, SHADER_UNLIT_MODEL, identity));
errorOk();
}
errorret_t sceneOverworldDrawChunksProps() {
for(chunkindex_t i = 0; i < MAP_CHUNK_COUNT; i++) {
chunk_t *chunk = MAP.chunkOrder[i];
if(chunk == NULL) continue;
for(uint8_t m = 1; m < chunk->meshCount; m++) {
if(chunk->modelEntries[m] == NULL) continue;
if(chunk->modelEntries[m]->state != ASSET_ENTRY_STATE_LOADED) continue;
@@ -148,8 +198,7 @@ errorret_t sceneOverworldDrawChunks() {
}
}
// Restore identity model so subsequent renders (e.g. entities) are
// not affected by the last chunk transform.
// Restore identity model in case anything renders after props.
mat4 identity;
glm_mat4_identity(identity);
errorChain(shaderSetMatrix(&SHADER_UNLIT, SHADER_UNLIT_MODEL, identity));
+12 -3
View File
@@ -29,12 +29,21 @@ errorret_t sceneOverworldInit(scenedata_t *sceneData);
errorret_t sceneOverworldUpdate(scenedata_t *sceneData);
/**
* Draws all loaded chunks in two passes: base meshes first (shared texture,
* no binds between chunks), then each chunk's additional meshes.
* Draws the base (tile) mesh of every loaded chunk, with normal depth
* testing. Must be called before entities are rendered.
*
* @return An error if drawing failed, or errorOk() on success.
*/
errorret_t sceneOverworldDrawChunks();
errorret_t sceneOverworldDrawChunksBase();
/**
* Draws every loaded chunk's additional meshes (trees, buildings, etc),
* with normal depth testing so they correctly occlude entities standing
* beneath them. Must be called after entities are rendered.
*
* @return An error if drawing failed, or errorOk() on success.
*/
errorret_t sceneOverworldDrawChunksProps();
/**
* Renders the overworld scene.