]> git.lizzy.rs Git - dragonblocks_alpha.git/commitdiff
Render own model with depth offset
authorElias Fleckenstein <eliasfleckenstein@web.de>
Wed, 20 Apr 2022 10:41:18 +0000 (12:41 +0200)
committerElias Fleckenstein <eliasfleckenstein@web.de>
Wed, 20 Apr 2022 10:41:18 +0000 (12:41 +0200)
shaders/3d/entity/vertex.glsl
shaders/3d/item/vertex.glsl
src/client/client_entity.c
src/client/client_entity.h
src/client/client_inventory.c
src/client/client_inventory.h
src/client/client_player.c
src/client/model.c
src/client/model.h

index a53f950549202299b36aa88050621e5e644ef104..1490381821242ca556aaf7c4cc2b5ae9020d11e3 100755 (executable)
@@ -10,11 +10,14 @@ uniform mat4 VP;
 uniform float daylight;
 uniform float ambientLight;
 uniform vec3 lightDir;
+uniform float depthOffset;
 
 void main()
 {
        vec4 worldSpace = model * vec4(vertexPosition, 1.0);
        gl_Position = VP * worldSpace;
+       if (gl_Position.z > -1.0)
+               gl_Position.z = max(-1.0, gl_Position.z - depthOffset);
 
        fragmentPosition = worldSpace.xyz;
        fragmentTextureCoordinates = vertexPosition;
index 9aabdcc14282f443467394f7955e856f7b3ffaa0..897610ca5c0ad9889b63a4672293cbdeeb7011e4 100755 (executable)
@@ -10,11 +10,14 @@ uniform mat4 VP;
 uniform float daylight;
 uniform float ambientLight;
 uniform vec3 lightDir;
+uniform float depthOffset;
 
 void main()
 {
        vec4 worldSpace = model * vec4(vertexPosition, 1.0);
        gl_Position = VP * worldSpace;
+       if (gl_Position.z > -1.0)
+               gl_Position.z = max(-1.0, gl_Position.z - depthOffset);
 
        fragmentPosition = worldSpace.xyz;
        fragmentColor = vertexColor;
index 2bc325363bc30ed484207fb11c309e95e49f9a62..6415cece8503c0124aa834871527272fc3dc5a0a 100644 (file)
@@ -37,6 +37,7 @@ Mesh client_entity_cube = {
 
 static GLuint shader_prog;
 static GLint loc_VP;
+static GLint loc_depthOffset;
 static LightShader light_shader;
 static Map entities;
 static List nametagged;
@@ -177,6 +178,7 @@ bool client_entity_gfx_init()
        free(shader_defs);
 
        loc_VP = glGetUniformLocation(shader_prog, "VP"); GL_DEBUG
+       loc_depthOffset = glGetUniformLocation(shader_prog, "depthOffset"); GL_DEBUG
 
        EntityVertex vertices[6][6];
        for (int f = 0; f < 6; f++) {
@@ -195,6 +197,8 @@ bool client_entity_gfx_init()
        light_shader.prog = shader_prog;
        light_shader_locate(&light_shader);
 
+       client_entity_depth_offset(0.0f);
+
        return true;
 }
 
@@ -214,6 +218,11 @@ void client_entity_gfx_update()
        pthread_mutex_unlock(&mtx_nametagged);
 }
 
+void client_entity_depth_offset(f32 offset)
+{
+       glProgramUniform1f(shader_prog, loc_depthOffset, offset);
+}
+
 ClientEntity *client_entity_grab(u64 id)
 {
        return id ? map_get(&entities, &id, &cmp_entity, &refcount_grb) : NULL;
index 03238a6032bc5bde468d29d20c91dd237427ddf9..c97bc06d201e687048f99cc867ac2b63aba92b76 100644 (file)
@@ -50,6 +50,7 @@ void client_entity_deinit();
 bool client_entity_gfx_init();
 void client_entity_gfx_deinit();
 void client_entity_gfx_update();
+void client_entity_depth_offset(f32 offset);
 
 ClientEntity *client_entity_grab(u64 id);
 void client_entity_drop(ClientEntity *entity);
index 4ae916bce192024e73662fd1cc5552c3282dec47..b8598f70c5184fc5f493e2737e4f7d4bbb6df30b 100644 (file)
@@ -11,6 +11,7 @@
 
 static GLuint _3d_shader_prog;
 static GLint _3d_loc_VP;
+static GLint _3d_loc_depthOffset;
 static ModelShader _3d_model_shader;
 static LightShader _3d_light_shader;
 
@@ -27,6 +28,7 @@ bool client_inventory_init()
        free(_3d_shader_defs);
 
        _3d_loc_VP = glGetUniformLocation(_3d_shader_prog, "VP");
+       _3d_loc_depthOffset = glGetUniformLocation(_3d_shader_prog, "depthOffset");
 
        _3d_model_shader.prog = _3d_shader_prog;
        _3d_model_shader.loc_transform = glGetUniformLocation(_3d_shader_prog, "model"); GL_DEBUG
@@ -34,6 +36,8 @@ bool client_inventory_init()
        _3d_light_shader.prog = _3d_shader_prog;
        light_shader_locate(&_3d_light_shader);
 
+       client_inventory_depth_offset(0.0f);
+
        return true;
 }
 
@@ -48,6 +52,11 @@ void client_inventory_update()
        light_shader_update(&_3d_light_shader);
 }
 
+void client_inventory_depth_offset(f32 offset)
+{
+       glProgramUniform1f(_3d_shader_prog, _3d_loc_depthOffset, offset);
+}
+
 static void wield_init(ModelNode *hand)
 {
        if (hand)
index 3b09789654051421acf555568668602d13c9cafe..586f560042da1bf0aeeadd0a12cdf016cf1cc5b2 100644 (file)
@@ -9,6 +9,7 @@ bool client_inventory_init();
 void client_inventory_deinit();
 void client_inventory_update();
 
+void client_inventory_depth_offset(f32 offset);
 void client_inventory_init_player(ClientEntity *entity);
 void client_inventory_deinit_player(ClientEntity *entity);
 void client_inventory_update_player(void *peer, ToClientPlayerInventory *pkt);
index ccbd059e0aeb32101ad2202c59e489f353206df2..9ab340c6519d30198c86d7b53285f5acdbc8fbcf 100644 (file)
@@ -74,6 +74,17 @@ static void recv_pos_rot()
 
 // entity callbacks
 
+static void local_on_model_before_render(__attribute__((unused)) Model *model)
+{
+       client_entity_depth_offset(0.2f);
+       client_inventory_depth_offset(0.2f);
+}
+
+static void local_on_model_after_render(__attribute__((unused)) Model *model)
+{
+       client_entity_depth_offset(0.0f);
+       client_inventory_depth_offset(0.0f);}
+
 static void on_add(ClientEntity *entity)
 {
        entity->model = model_clone(player_model);
@@ -137,6 +148,8 @@ static void local_on_add(ClientEntity *entity)
        }
 
        on_add(entity);
+       entity->model->callbacks.before_render = &local_on_model_before_render;
+       entity->model->callbacks.after_render = &local_on_model_after_render;
 
        player_entity = refcount_grb(&entity->rc);
        recv_pos_rot();
@@ -169,12 +182,6 @@ static void local_on_update_nametag(ClientEntity *entity)
        }
 }
 
-static void __attribute__((unused)) on_model_step(Model *model, __attribute__((unused)) f64 dtime)
-{
-       ClientPlayerData *data = ((ClientEntity *) model->extra)->extra;
-       (void) data; // ToDo: animations
-}
-
 static void on_model_delete(Model *model)
 {
        if (model->extra)
@@ -229,7 +236,6 @@ void client_player_gfx_init()
                RESSOURCE_PATH "models/player.txt", RESSOURCE_PATH "textures/models/player",
                &client_entity_cube, &client_entity_shader);
 
-       player_model->callbacks.step = &on_model_step;
        player_model->callbacks.delete = &on_model_delete;
 }
 
index 89542679c8313d5d7b5b0ffcd2955b2cc1fc8fea..f2a224402ea6c54ac97d7524e67353080991fb8a 100644 (file)
@@ -145,29 +145,27 @@ static int cmp_model(const Model *model, const f32 *distance)
 
 static void render_model(Model *model)
 {
-       if (model->flags.wireframe) {
-               glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); GL_DEBUG
-       }
+       if (model->callbacks.before_render)
+               model->callbacks.before_render(model);
 
        render_node(model->root);
 
-       if (model->flags.wireframe) {
-               glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); GL_DEBUG
-       }
+       if (model->callbacks.after_render)
+               model->callbacks.after_render(model);
 }
 
 // step model help im stuck
 static void model_step(Model *model, Tree *transparent, f64 dtime)
 {
+       if (model->callbacks.step)
+               model->callbacks.step(model, dtime);
+
        if (client_config.view_distance < (model->distance = sqrt(
                        pow(model->root->pos.x - camera.eye[0], 2) +
                        pow(model->root->pos.y - camera.eye[1], 2) +
                        pow(model->root->pos.z - camera.eye[2], 2))))
                return;
 
-       if (model->callbacks.step)
-               model->callbacks.step(model, dtime);
-
        if (!model->root->visible)
                return;
 
@@ -212,10 +210,11 @@ Model *model_create()
        model->replace = NULL;
 
        model->callbacks.step = NULL;
+       model->callbacks.before_render = NULL;
+       model->callbacks.after_render = NULL;
        model->callbacks.delete = NULL;
 
        model->flags.delete =
-               model->flags.wireframe =
                model->flags.frustum_culling =
                model->flags.transparent = 0;
 
index 8ca5ed274b663e3c9cbf36f47f164348c119d367..7254d0da70315bc592749ad64af4307b64460e25 100644 (file)
@@ -55,11 +55,12 @@ typedef struct Model {
        struct Model *replace;
        struct {
                void (*step)(struct Model *model, f64 dtime);
+               void (*before_render)(struct Model *model);
+               void (*after_render)(struct Model *model);
                void (*delete)(struct Model *model);
        } callbacks;
        struct {
                unsigned int delete: 1;
-               unsigned int wireframe: 1;
                unsigned int frustum_culling: 1;
                unsigned int transparent: 1;
        } flags;