minecraft: use layout binding

This commit is contained in:
Zack Buhman 2026-03-25 22:07:28 -05:00
parent 3facb17f90
commit c21aed27c5
5 changed files with 67 additions and 74 deletions

View File

@ -59,8 +59,6 @@ OBJS = \
src/collada/effect.o \
src/collada/node_state.o \
src/collada/animate.o \
src/lua_api.o \
src/pixel_line_art.o \
src/flame.o \
src/audio.o \
data/scenes/ship20/ship20.o \

View File

@ -1,4 +1,4 @@
#version 330 core
#version 430 core
in VS_OUT {
vec3 Position; // world coordinates
@ -16,9 +16,7 @@ layout (location = 1) out vec4 Normal;
layout (location = 2) out vec3 Color;
layout (location = 3) out vec4 Block;
uniform sampler2D TerrainSampler;
uniform vec3 MousePosition;
uniform vec3 MousePosition2;
layout (location = 1) uniform sampler2D TerrainSampler;
void main()
{

View File

@ -1,15 +1,15 @@
#version 330 core
#version 430 core
// per-vertex:
in vec3 Position;
in vec3 Normal;
in vec2 Texture;
layout (location = 0) in vec3 Position;
layout (location = 1) in vec3 Normal;
layout (location = 2) in vec2 Texture;
// per-instance:
in vec3 BlockPosition;
in int BlockID;
in int Data;
in int TextureID;
in int Special;
layout (location = 3) in vec3 BlockPosition;
layout (location = 4) in int BlockID;
layout (location = 5) in int Data;
layout (location = 6) in int TextureID;
layout (location = 7) in int Special;
out VS_OUT {
vec3 Position;
@ -22,7 +22,7 @@ out VS_OUT {
flat int Special;
} vs_out;
uniform mat4 Transform;
layout (location = 0) uniform mat4 Transform;
vec3 orientation(vec3 position)
{

View File

@ -126,8 +126,8 @@ int main()
}
load(".");
audio::init();
audio::load();
//audio::init();
//audio::load();
update_window(1024, 1024);
@ -150,13 +150,20 @@ int main()
case SDL_EVENT_GAMEPAD_REMOVED:
remove_gamepad(event.gdevice.which);
break;
case SDL_EVENT_MOUSE_BUTTON_DOWN:
if (event.button.button == 1) {
update_mouse(event.button.x, event.button.y);
}
break;
default:
break;
}
}
update();
draw();
audio::update();
//audio::update();
SDL_GL_SwapWindow(window);
}

View File

@ -15,7 +15,7 @@
#include "world/world.h"
namespace minecraft {
struct location {
struct layout {
struct {
unsigned int position;
unsigned int normal;
@ -25,7 +25,7 @@ namespace minecraft {
unsigned int data;
unsigned int texture_id;
unsigned int special;
} attrib;
} attribute;
struct {
unsigned int transform;
unsigned int terrain_sampler;
@ -33,7 +33,23 @@ namespace minecraft {
};
static unsigned int program;
static location location;
static layout const layout = {
.attribute = {
.position = 0,
.normal = 1,
.texture = 2,
.block_position = 3,
.block_id = 4,
.data = 5,
.texture_id = 6,
.special = 7,
},
.uniform = {
.transform = 0,
.terrain_sampler = 1,
}
};
static unsigned int vertex_array_object;
static unsigned int per_vertex_buffer;
@ -53,32 +69,6 @@ namespace minecraft {
program = compile_from_files("shader/minecraft.vert",
NULL,
"shader/minecraft.frag");
location.attrib.position = glGetAttribLocation(program, "Position");
location.attrib.normal = glGetAttribLocation(program, "Normal");
location.attrib.texture = glGetAttribLocation(program, "Texture");
location.attrib.block_position = glGetAttribLocation(program, "BlockPosition");
location.attrib.block_id = glGetAttribLocation(program, "BlockID");
location.attrib.data = glGetAttribLocation(program, "Data");
location.attrib.texture_id = glGetAttribLocation(program, "TextureID");
location.attrib.special = glGetAttribLocation(program, "Special");
printf("minecraft program:\n");
printf(" attributes:\n position %u\n normal %u\n texture %u\n block_position %u\n block_id %u\n data %u\n texture_id %u\n special %u\n",
location.attrib.position,
location.attrib.normal,
location.attrib.texture,
location.attrib.block_position,
location.attrib.block_id,
location.attrib.data,
location.attrib.texture_id,
location.attrib.special);
location.uniform.transform = glGetUniformLocation(program, "Transform");
location.uniform.terrain_sampler = glGetUniformLocation(program, "TerrainSampler");
printf(" uniforms:\n transform %u\n terrain_sampler %u\n",
location.uniform.transform,
location.uniform.terrain_sampler);
}
void load_vertex_attributes()
@ -89,37 +79,37 @@ namespace minecraft {
glVertexBindingDivisor(0, 0);
glVertexBindingDivisor(1, 1);
glEnableVertexAttribArray(location.attrib.position);
glVertexAttribFormat(location.attrib.position, 3, GL_HALF_FLOAT, GL_FALSE, 0);
glVertexAttribBinding(location.attrib.position, 0);
glEnableVertexAttribArray(layout.attribute.position);
glVertexAttribFormat(layout.attribute.position, 3, GL_HALF_FLOAT, GL_FALSE, 0);
glVertexAttribBinding(layout.attribute.position, 0);
glEnableVertexAttribArray(location.attrib.normal);
glVertexAttribFormat(location.attrib.normal, 3, GL_HALF_FLOAT, GL_FALSE, 6);
glVertexAttribBinding(location.attrib.normal, 0);
glEnableVertexAttribArray(layout.attribute.normal);
glVertexAttribFormat(layout.attribute.normal, 3, GL_HALF_FLOAT, GL_FALSE, 6);
glVertexAttribBinding(layout.attribute.normal, 0);
glEnableVertexAttribArray(location.attrib.texture);
glVertexAttribFormat(location.attrib.texture, 2, GL_HALF_FLOAT, GL_FALSE, 12);
glVertexAttribBinding(location.attrib.texture, 0);
glEnableVertexAttribArray(layout.attribute.texture);
glVertexAttribFormat(layout.attribute.texture, 2, GL_HALF_FLOAT, GL_FALSE, 12);
glVertexAttribBinding(layout.attribute.texture, 0);
glEnableVertexAttribArray(location.attrib.block_position);
glVertexAttribFormat(location.attrib.block_position, 3, GL_SHORT, GL_FALSE, 0);
glVertexAttribBinding(location.attrib.block_position, 1);
glEnableVertexAttribArray(layout.attribute.block_position);
glVertexAttribFormat(layout.attribute.block_position, 3, GL_SHORT, GL_FALSE, 0);
glVertexAttribBinding(layout.attribute.block_position, 1);
glEnableVertexAttribArray(location.attrib.block_id);
glVertexAttribIFormat(location.attrib.block_id, 1, GL_SHORT, 8);
glVertexAttribBinding(location.attrib.block_id, 1);
glEnableVertexAttribArray(layout.attribute.block_id);
glVertexAttribIFormat(layout.attribute.block_id, 1, GL_SHORT, 8);
glVertexAttribBinding(layout.attribute.block_id, 1);
glEnableVertexAttribArray(location.attrib.data);
glVertexAttribIFormat(location.attrib.data, 1, GL_SHORT, 10);
glVertexAttribBinding(location.attrib.data, 1);
glEnableVertexAttribArray(layout.attribute.data);
glVertexAttribIFormat(layout.attribute.data, 1, GL_SHORT, 10);
glVertexAttribBinding(layout.attribute.data, 1);
glEnableVertexAttribArray(location.attrib.texture_id);
glVertexAttribIFormat(location.attrib.texture_id, 1, GL_SHORT, 12);
glVertexAttribBinding(location.attrib.texture_id, 1);
glEnableVertexAttribArray(layout.attribute.texture_id);
glVertexAttribIFormat(layout.attribute.texture_id, 1, GL_SHORT, 12);
glVertexAttribBinding(layout.attribute.texture_id, 1);
glEnableVertexAttribArray(location.attrib.special);
glVertexAttribIFormat(location.attrib.special, 1, GL_SHORT, 14);
glVertexAttribBinding(location.attrib.special, 1);
glEnableVertexAttribArray(layout.attribute.special);
glVertexAttribIFormat(layout.attribute.special, 1, GL_SHORT, 14);
glVertexAttribBinding(layout.attribute.special, 1);
glBindVertexArray(0);
}
@ -289,8 +279,8 @@ namespace minecraft {
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, texture);
glUniformMatrix4fv(location.uniform.transform, 1, false, (float *)&view::state.float_transform);
glUniform1i(location.uniform.terrain_sampler, 0);
glUniformMatrix4fv(layout.uniform.transform, 1, false, (float *)&view::state.float_transform);
glUniform1i(layout.uniform.terrain_sampler, 0);
//glEnable(GL_CULL_FACE);
//glCullFace(GL_FRONT);