main: draw mesh from binary vertex/index buffers

This commit is contained in:
Zack Buhman 2026-02-22 03:51:22 +00:00
parent c54fd525ff
commit 955a3e09aa
3 changed files with 107 additions and 33 deletions

BIN
index.idx Normal file

Binary file not shown.

104
main.lua
View File

@ -17,14 +17,21 @@ local vertexcode = [[
#pragma language glsl3 #pragma language glsl3
layout (location = 0) in vec4 VertexPosition; layout (location = 0) in vec4 VertexPosition;
layout (location = 1) in vec4 VertexColor; layout (location = 1) in vec4 VertexNormal;
layout (location = 2) in vec4 VertexTexture;
uniform mat4 projection;
uniform mat4 view;
uniform mat4 model;
uniform mat4 model2;
varying vec4 PixelColor; varying vec4 PixelColor;
void vertexmain() void vertexmain()
{ {
PixelColor = VertexColor; PixelColor = VertexNormal * 0.5 + 0.5;
love_Position = TransformProjectionMatrix * VertexPosition; mat4 trans = projection * view * model * model2;
love_Position = trans * vec4(VertexPosition.xyz, 1);
} }
]] ]]
@ -32,24 +39,41 @@ local shader = love.graphics.newShader(pixelcode, vertexcode)
local vertexformat = { local vertexformat = {
{ name = 'VertexPosition', format = 'floatvec3', location = 0 }, { name = 'VertexPosition', format = 'floatvec3', location = 0 },
{ name = 'VertexColor', format = 'floatvec3', location = 1 }, { name = 'VertexNormal', format = 'floatvec3', location = 1 },
{ name = 'VertexTexture', format = 'floatvec3', location = 2 },
} }
local vertexdata = { local rotation
-0.5, -0.5, -0.5, 1, 0, 0, -- tl \|
0.5, -0.5, -0.5, 0, 1, 0, -- tr function look_at()
0.5, 0.5, -0.5, 0, 0, 1, -- br local m = {
-0.5, 0.5, -0.5, 1, 1, 1, -- bl |\ 1.000000, 0.000000, 0.000000, 0.000000,
0.000000, 1.000000, 0.000000, 0.000000,
0.000000, 0.000000, 1.000000, -2.000000,
0.000000, 0.000000, 0.000000, 1.000000,
} }
local indexdata = { return m;
0, 1, 2, end
0, 3, 2,
}; function projection()
local m = {
1.000000, 0.000000, 0.000000, 0.000000,
0.000000, 1.000000, 0.000000, 0.000000,
0.000000, 0.000000, -1.002002, -0.200200,
0.000000, 0.000000, -1.000000, 0.000000,
}
return m
end
function love.load(args) function love.load(args)
love.window.setMode(600, 600, {depth=true})
local vertexdata = love.filesystem.newFileData("position_normal_texture.vtx")
local indexdata = love.filesystem.newFileData("index.idx")
local vertexbuffer = love.graphics.newBuffer(vertexformat, vertexdata, { vertex = true, usage = "static" }) local vertexbuffer = love.graphics.newBuffer(vertexformat, vertexdata, { vertex = true, usage = "static" })
local indexbuffer = love.graphics.newBuffer("uint16", indexdata, { index = true, usage = "static" }) local indexbuffer = love.graphics.newBuffer("uint32", indexdata, { index = true, usage = "static" })
attributelist = { attributelist = {
{ {
@ -63,7 +87,15 @@ function love.load(args)
{ {
buffer = vertexbuffer, buffer = vertexbuffer,
location = 1, location = 1,
name = "VertexColor", -- the name this vertex attribute will use in a shader name = "VertexNormal", -- the name this vertex attribute will use in a shader
nameinbuffer = nil, -- the name of the attribute in the vertex buffer. Defaults to the name field.
step = "pervertex", -- vertex attribute step ("pervertex" or "perinstance"), defaults to "pervertex".
startindex = 1, -- 1-based array index within the given vertex buffer where the attribute data will start being pulled from during rendering. Defaults to 1.
},
{
buffer = vertexbuffer,
location = 2,
name = "VertexTexture", -- the name this vertex attribute will use in a shader
nameinbuffer = nil, -- the name of the attribute in the vertex buffer. Defaults to the name field. nameinbuffer = nil, -- the name of the attribute in the vertex buffer. Defaults to the name field.
step = "pervertex", -- vertex attribute step ("pervertex" or "perinstance"), defaults to "pervertex". step = "pervertex", -- vertex attribute step ("pervertex" or "perinstance"), defaults to "pervertex".
startindex = 1, -- 1-based array index within the given vertex buffer where the attribute data will start being pulled from during rendering. Defaults to 1. startindex = 1, -- 1-based array index within the given vertex buffer where the attribute data will start being pulled from during rendering. Defaults to 1.
@ -75,10 +107,52 @@ function love.load(args)
mesh:setIndexBuffer(indexbuffer) mesh:setIndexBuffer(indexbuffer)
end end
local rotation = 0.0
function rotate_x(t)
local cos = math.cos
local sin = math.sin
return {
1, 0, 0, 0,
0, cos(t), -sin(t), 0,
0, sin(t), cos(t), 0,
0, 0, 0, 1
}
end
function rotate_y(t)
local cos = math.cos
local sin = math.sin
return {
cos(t), 0, sin(t), 0,
0, 1, 0, 0,
-sin(t), 0, cos(t), 0,
0, 0, 0, 1
}
end
function rotate_z(t)
local cos = math.cos
local sin = math.sin
return {
cos(t), -sin(t), 0, 0,
sin(t), cos(t), 0, 0,
0, 0, 1, 0,
0, 0, 0, 1
}
end
function love.draw() function love.draw()
local radius = 100 local radius = 100
local mx, my = love.mouse.getPosition() local mx, my = love.mouse.getPosition()
shader:send("projection", projection(1, 1))
shader:send("view", look_at())
shader:send("model", rotate_x(rotation))
shader:send("model2", rotate_z(rotation * 0.5))
rotation = rotation + 0.01
love.graphics.setShader(shader) love.graphics.setShader(shader)
love.graphics.setDepthMode("less", true)
love.graphics.draw(mesh, mx, my, 0, radius, radius) love.graphics.draw(mesh, mx, my, 0, radius, radius)
end end

BIN
position_normal_texture.vtx Normal file

Binary file not shown.