diff --git a/index.idx b/index.idx new file mode 100644 index 0000000..6963a43 Binary files /dev/null and b/index.idx differ diff --git a/main.lua b/main.lua index b40044f..082c875 100644 --- a/main.lua +++ b/main.lua @@ -17,14 +17,21 @@ local vertexcode = [[ #pragma language glsl3 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; void vertexmain() { - PixelColor = VertexColor; - love_Position = TransformProjectionMatrix * VertexPosition; + PixelColor = VertexNormal * 0.5 + 0.5; + mat4 trans = projection * view * model * model2; + love_Position = trans * vec4(VertexPosition.xyz, 1); } ]] @@ -32,53 +39,120 @@ local shader = love.graphics.newShader(pixelcode, vertexcode) local vertexformat = { { 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 = { - -0.5, -0.5, -0.5, 1, 0, 0, -- tl \| - 0.5, -0.5, -0.5, 0, 1, 0, -- tr - 0.5, 0.5, -0.5, 0, 0, 1, -- br - -0.5, 0.5, -0.5, 1, 1, 1, -- bl |\ -} +local rotation -local indexdata = { - 0, 1, 2, - 0, 3, 2, -}; +function look_at() + local m = { + 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, + } + + return m; +end + +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) + 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 indexbuffer = love.graphics.newBuffer("uint16", indexdata, { index = true, usage = "static" }) - + local indexbuffer = love.graphics.newBuffer("uint32", indexdata, { index = true, usage = "static" }) + attributelist = { { - buffer = vertexbuffer, - location = 0, - name = "VertexPosition", -- 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 = 0, + name = "VertexPosition", -- 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 = 1, + 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 = 1, - name = "VertexColor", -- 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. + 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. }, } drawmode = "triangles" - + mesh = love.graphics.newMesh(attributelist, drawmode) mesh:setIndexBuffer(indexbuffer) end -function love.draw() - local radius = 100 +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() + local radius = 100 local mx, my = love.mouse.getPosition() - love.graphics.setShader(shader) - love.graphics.draw(mesh, mx, my, 0, radius, radius) + 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.setDepthMode("less", true) + love.graphics.draw(mesh, mx, my, 0, radius, radius) end diff --git a/position_normal_texture.vtx b/position_normal_texture.vtx new file mode 100644 index 0000000..9c541fc Binary files /dev/null and b/position_normal_texture.vtx differ