diff --git a/_math.lua b/_math.lua index a350a82..6c5bce5 100644 --- a/_math.lua +++ b/_math.lua @@ -144,7 +144,7 @@ mat4 = { end, translation_from_vector = function(v) - return translation(v.f[0], v.f[1], v.f[2]) + return mat4.translation(v.f[0], v.f[1], v.f[2]) end, scaling = function(x, y, z) @@ -172,7 +172,7 @@ mat4 = { end, scaling_from_vector = function(v) - return scaling(v.f[0], v.f[1], v.f[2]) + return mat4.scaling(v.f[0], v.f[1], v.f[2]) end, rotation_x = function(angle) @@ -806,4 +806,5 @@ return { scalar = scalar, mat4 = mat4, vec3 = vec3, + vec4 = vec4, } diff --git a/collada_types.lua b/collada_types.lua new file mode 100644 index 0000000..f559aae --- /dev/null +++ b/collada_types.lua @@ -0,0 +1,79 @@ +local input_format = { + FLOAT1 = {}, + FLOAT2 = {}, + FLOAT3 = {}, + FLOAT4 = {}, + INT1 = {}, + INT2 = {}, + INT3 = {}, + INT4 = {} +} + +local light_type = { + AMBIENT = {}, + DIRECTIONAL = {}, + POINT = {}, + SPOT = {} +} + +local color_or_texture_type = { + COLOR = {}, + TEXTURE = {} +} + +local effect_type = { + BLINN = {}, + LAMBERT = {}, + PHONG = {}, + CONSTANT = {} +} + +local transform_type = { + LOOKAT = {}, + MATRIX = {}, + ROTATE = {}, + SCALE = {}, + SKEW = {}, + TRANSLATE = {} +} + +local node_type = { + JOINT = {}, + NODE = {} +} + +local interpolation = { + LINEAR = {}, + BEZIER = {} +} + +local target_attribute = { + A = {}, -- alpha color component + ANGLE = {}, -- euler angle + B = {}, -- blue color component + G = {}, -- green color component + P = {}, -- third texture component + Q = {}, -- fourth texture component + R = {}, -- red color component + S = {}, -- first texture coordinate + T = {}, -- second texture coordinate + TIME = {}, -- time in seconds + U = {}, -- first generic parameter + V = {}, -- second generic parameter + W = {}, -- fourth cartesian coordinate + X = {}, -- first cartesian coordinate + Y = {}, -- second cartesian coordinate + Z = {}, -- third cartesian coordinate + ALL = {} +} + +return { + input_format = input_format, + light_type = light_type, + color_or_texture_type = color_or_texture_type, + effect_type = effect_type, + transform_type = transform_type, + node_type = node_type, + interpolation = interpolation, + target_attribute = target_attribute, +} diff --git a/main.lua b/main.lua index 3ece31a..335d4ed 100644 --- a/main.lua +++ b/main.lua @@ -1,4 +1,3 @@ -local mesh local rotation local texture @@ -6,12 +5,17 @@ local ffi = require 'ffi' local _math = require '_math' local mat4 = _math.mat4 local vec3 = _math.vec3 +local vec4 = _math.vec4 +local scalar = _math.scalar +local scene_test = require 'scene.test.test' +local collada_types = require 'collada_types' local pixelcode = [[ #pragma language glsl3 varying vec4 PixelNormal; varying vec4 PixelTexture; + varying float PixelId; uniform sampler2D texture_sampler; @@ -37,11 +41,13 @@ local vertexcode = [[ varying vec4 PixelNormal; varying vec4 PixelTexture; + varying float PixelId; void vertexmain() { PixelNormal = VertexNormal * 0.5 + 0.5; PixelTexture = VertexTexture; + PixelId = float(gl_VertexID) / (4800 * 3); love_Position = transform * vec4(VertexPosition.xyz, 1); } ]] @@ -54,48 +60,146 @@ local vertexformat = { { name = 'VertexTexture', format = 'floatvec3', location = 2 }, } +function pnt_attribute_list(vertex_buffer, offset) + return { + { + buffer = vertex_buffer, + location = 0, + name = "VertexPosition", + nameinbuffer = nil, + step = "pervertex", + startindex = 1 + offset, + }, + { + buffer = vertex_buffer, + location = 1, + name = "VertexNormal", + nameinbuffer = nil, + step = "pervertex", + startindex = 1 + offset, + }, + { + buffer = vertex_buffer, + location = 2, + name = "VertexTexture", + nameinbuffer = nil, + step = "pervertex", + startindex = 1 + offset, + }, + } +end + +local geometries_meshes = {} + +function load_geometries(vertex_buffer, index_buffer, geometries) + for _, geometry in ipairs(geometries) do + local offset = geometry.mesh.vertex_buffer_offset / (4 * 3 * 3) + local attribute_list = pnt_attribute_list(vertex_buffer, offset) + + local draw_mode = "triangles" + local mesh = love.graphics.newMesh(attribute_list, draw_mode) + mesh:setIndexBuffer(index_buffer) + + geometries_meshes[geometry] = mesh + end +end + + +local node_instances = {} + +function node_world_transform(node) + local world + if node.parent_index >= 0 then + world = node_instances[node.parent_index].world + assert(world ~= nil) + else + world = mat4.identity() + end + + for _, transform in ipairs(node.transforms) do + local m + if transform.type == collada_types.transform_type.LOOKAT then + assert(false) + elseif transform.type == collada_types.transform_type.MATRIX then + m = mat4.load_table(transform.matrix) + elseif transform.type == collada_types.transform_type.ROTATE then + local rotate = vec4.load_table(transform.rotate) + local w = rotate.f[3] + m = mat4.rotation_axis(rotate, scalar.convert_to_radians(w)) + elseif transform.type == collada_types.transform_type.SCALE then + m = mat4.scaling_from_vector(vec3.load_table(transform.scale)) + elseif transform.type == collada_types.transform_type.TRANSLATE then + m = mat4.translation_from_vector(vec3.load_table(transform.translate)) + else + assert(false) + end + + world = m * world + end + return world +end + +function load_node_world_transforms(nodes) + local node_index = 0 + for _, node in ipairs(nodes) do + world = node_world_transform(node) + node_instances[node_index] = { world = world } + node_index = node_index + 1 + end +end + function love.load(args) love.window.setMode(1024, 1024, {depth=true}) - local vertexdata = love.filesystem.newFileData("position_normal_texture.vtx") - local indexdata = love.filesystem.newFileData("index.idx") + local vertex_data = love.filesystem.newFileData("scene/test/test.vtx") + local index_data = love.filesystem.newFileData("scene/test/test.idx") - local vertexbuffer = love.graphics.newBuffer(vertexformat, vertexdata, { vertex = true, usage = "static" }) - local indexbuffer = love.graphics.newBuffer("uint32", indexdata, { index = true, usage = "static" }) + local vertex_buffer = love.graphics.newBuffer(vertexformat, vertex_data, { vertex = true, usage = "static" }) + local index_buffer = love.graphics.newBuffer("uint32", index_data, { 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 = 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 = 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" + load_geometries(vertex_buffer, index_buffer, scene_test.descriptor.geometries) + load_node_world_transforms(scene_test.descriptor.nodes) - mesh = love.graphics.newMesh(attributelist, drawmode) - mesh:setIndexBuffer(indexbuffer) + local image_data = love.image.newCompressedData('bird.dds') + texture = love.graphics.newTexture(image_data) +end - local image_data = love.image.newCompressedData('bird.dds') - texture = love.graphics.newTexture(image_data) +function draw_geometry(geometry) + local base_index_buffer_offset = geometry.mesh.index_buffer_offset / 4 + + local mesh = geometries_meshes[geometry] + for triangle_index, triangles in pairs(geometry.mesh.triangles) do + local index_offset = base_index_buffer_offset + triangles.index_offset + local index_count = triangles.count * 3 + mesh:setDrawRange(1 + index_offset, index_count) + love.graphics.draw(mesh, 0, 0, 0, 0, 0) + end +end + +function draw_node(node_index, node, transform) + if node.type ~= collada_types.node_type.NODE then + return + end + + if node.instance_geometries_count == 0 and node.instance_controllers_count == 0 then + return + end + + local world = node_instances[node_index].world + transform = world * transform + shader:send("transform", "column", transform.data) + + for _, instance_geometry in ipairs(node.instance_geometries) do + draw_geometry(instance_geometry.geometry) + end +end + +function draw_nodes(nodes, transform) + local node_index = 0 + for _, node in ipairs(nodes) do + draw_node(node_index, node, transform) + node_index = node_index + 1 + end end local rotation = 0.0 @@ -105,36 +209,27 @@ function love.draw() local mx, my = love.mouse.getPosition() width, height = love.graphics.getDimensions() - -- shader:send("projection", "column", mat4.perspective_rh(width / width * 0.25, - -- height / width * 0.25, - -- 0.1, - -- 1000.0).data) - -- shader:send("view", "column", mat4.look_at_rh(vec3(0, -2, 0), - -- vec3(0, 0, 0), - -- vec3(0, 0, 1)).data) - -- shader:send("model", "column", mat4.rotation_x(rotation).data) - -- shader:send("model2", "column", mat4.rotation_z(rotation * 0.5).data) - - local projection = mat4.perspective_rh(width / width * 0.25, - height / width * 0.25, + local projection = mat4.perspective_rh(width / width * 0.1, + height / width * 0.1, 0.1, 1000.0) - local view = mat4.look_at_rh(vec3(0, -2, 0), - vec3(0, 0, 0), + local view = mat4.look_at_rh(vec3(-88.57101, -71.71298, 104.5738), + vec3(-19.90239, -27.72767, 54.6898), vec3(0, 0, 1)) local world1 = mat4.rotation_x(rotation) local world2 = mat4.rotation_z(rotation * 0.5) - local world3 = mat4.translation(0, 0, -0.5) + --local world3 = mat4.translation(0, 0, -0.5) - local transform = world3 * world2 * world1 * view * projection - - shader:send("transform", "column", transform.data) + local transform = view * projection shader:send("texture_sampler", texture) + rotation = rotation + 0.01 + love.graphics.setShader(shader) love.graphics.setDepthMode("less", true) - love.graphics.draw(mesh, mx, my, 0, radius, radius) + + draw_nodes(scene_test.descriptor.nodes, transform) end diff --git a/scene/test/test.idx b/scene/test/test.idx new file mode 100644 index 0000000..d799029 Binary files /dev/null and b/scene/test/test.idx differ diff --git a/scene/test/test.lua b/scene/test/test.lua new file mode 100644 index 0000000..bf65fc7 --- /dev/null +++ b/scene/test/test.lua @@ -0,0 +1,610 @@ +local collada_types = require 'collada_types' + +local camera_camera_camera = { + xfov = 45.0, + yfov = 0.0, + znear = 1.0, + zfar = 1000.0, + aspect_ratio = 0.0, +} +local light_environmentambientlight = { + type = collada_types.light_type.AMBIENT, + color = {0.0, 0.0, 0.0}, +} +local images = { +} +local effect_coloreffectr228g184b153 = { + type = collada_types.effect_type.PHONG, + phong = { + emission = { + type = collada_types.color_or_texture_type.COLOR, + color = {0.0, 0.0, 0.0, 0.0}, + }, + ambient = { + type = collada_types.color_or_texture_type.COLOR, + color = {0.8941176, 0.7215686, 0.6, 1.0}, + }, + diffuse = { + type = collada_types.color_or_texture_type.COLOR, + color = {0.8941176, 0.7215686, 0.6, 1.0}, + }, + specular = { + type = collada_types.color_or_texture_type.COLOR, + color = {1.0, 1.0, 1.0, 1.0}, + }, + shininess = 10.0, + reflective = { + type = collada_types.color_or_texture_type.COLOR, + color = {0.0, 0.0, 0.0, 1.0}, + }, + reflectivity = 0.0, + transparent = { + type = collada_types.color_or_texture_type.COLOR, + color = {1.0, 1.0, 1.0, 1.0}, + }, + transparency = 1.0, + index_of_refraction = 0.0, + } +} +local effect_coloreffectr153g228b184 = { + type = collada_types.effect_type.PHONG, + phong = { + emission = { + type = collada_types.color_or_texture_type.COLOR, + color = {0.0, 0.0, 0.0, 0.0}, + }, + ambient = { + type = collada_types.color_or_texture_type.COLOR, + color = {0.6, 0.8941176, 0.7215686, 1.0}, + }, + diffuse = { + type = collada_types.color_or_texture_type.COLOR, + color = {0.6, 0.8941176, 0.7215686, 1.0}, + }, + specular = { + type = collada_types.color_or_texture_type.COLOR, + color = {1.0, 1.0, 1.0, 1.0}, + }, + shininess = 10.0, + reflective = { + type = collada_types.color_or_texture_type.COLOR, + color = {0.0, 0.0, 0.0, 1.0}, + }, + reflectivity = 0.0, + transparent = { + type = collada_types.color_or_texture_type.COLOR, + color = {1.0, 1.0, 1.0, 1.0}, + }, + transparency = 1.0, + index_of_refraction = 0.0, + } +} +local effect_coloreffectr177g26b88 = { + type = collada_types.effect_type.PHONG, + phong = { + emission = { + type = collada_types.color_or_texture_type.COLOR, + color = {0.0, 0.0, 0.0, 0.0}, + }, + ambient = { + type = collada_types.color_or_texture_type.COLOR, + color = {0.6941176, 0.1019608, 0.345098, 1.0}, + }, + diffuse = { + type = collada_types.color_or_texture_type.COLOR, + color = {0.6941176, 0.1019608, 0.345098, 1.0}, + }, + specular = { + type = collada_types.color_or_texture_type.COLOR, + color = {1.0, 1.0, 1.0, 1.0}, + }, + shininess = 10.0, + reflective = { + type = collada_types.color_or_texture_type.COLOR, + color = {0.0, 0.0, 0.0, 1.0}, + }, + reflectivity = 0.0, + transparent = { + type = collada_types.color_or_texture_type.COLOR, + color = {1.0, 1.0, 1.0, 1.0}, + }, + transparency = 1.0, + index_of_refraction = 0.0, + } +} +local effect_coloreffectr5g54b179 = { + type = collada_types.effect_type.PHONG, + phong = { + emission = { + type = collada_types.color_or_texture_type.COLOR, + color = {0.0, 0.0, 0.0, 0.0}, + }, + ambient = { + type = collada_types.color_or_texture_type.COLOR, + color = {0.01960784, 0.2117647, 0.7019608, 1.0}, + }, + diffuse = { + type = collada_types.color_or_texture_type.COLOR, + color = {0.01960784, 0.2117647, 0.7019608, 1.0}, + }, + specular = { + type = collada_types.color_or_texture_type.COLOR, + color = {1.0, 1.0, 1.0, 1.0}, + }, + shininess = 10.0, + reflective = { + type = collada_types.color_or_texture_type.COLOR, + color = {0.0, 0.0, 0.0, 1.0}, + }, + reflectivity = 0.0, + transparent = { + type = collada_types.color_or_texture_type.COLOR, + color = {1.0, 1.0, 1.0, 1.0}, + }, + transparency = 1.0, + index_of_refraction = 0.0, + } +} +local material_coloreffectr228g184b153_material = { + effect = effect_coloreffectr228g184b153, +} +local material_coloreffectr153g228b184_material = { + effect = effect_coloreffectr153g228b184, +} +local material_coloreffectr177g26b88_material = { + effect = effect_coloreffectr177g26b88, +} +local material_coloreffectr5g54b179_material = { + effect = effect_coloreffectr5g54b179, +} +local input_elements_position_0_3_normal_0_3_texcoord_0_3 = { + { + semantic = "POSITION", + semantic_index = 0, + format = collada_types.input_format.FLOAT3, + }, + { + semantic = "NORMAL", + semantic_index = 0, + format = collada_types.input_format.FLOAT3, + }, + { + semantic = "TEXCOORD", + semantic_index = 0, + format = collada_types.input_format.FLOAT3, + }, +} +local triangles_geom_plane = { + { + count = 20000, -- triangles + index_offset = 0, -- indices + inputs_index = 0, -- index into inputs_list + }, +} +local geometry_geom_plane = { + mesh = { + triangles = triangles_geom_plane, + triangles_count = 1, + + vertex_buffer_offset = 0, + vertex_buffer_size = 367236, + + index_buffer_offset = 0, + index_buffer_size = 240000, + } +} +local triangles_geom_torus_knot23 = { + { + count = 4800, -- triangles + index_offset = 0, -- indices + inputs_index = 0, -- index into inputs_list + }, +} +local geometry_geom_torus_knot23 = { + mesh = { + triangles = triangles_geom_torus_knot23, + triangles_count = 1, + + vertex_buffer_offset = 367236, + vertex_buffer_size = 94068, + + index_buffer_offset = 240000, + index_buffer_size = 57600, + } +} +local triangles_geom_torusknot25 = { + { + count = 2400, -- triangles + index_offset = 0, -- indices + inputs_index = 0, -- index into inputs_list + }, +} +local geometry_geom_torusknot25 = { + mesh = { + triangles = triangles_geom_torusknot25, + triangles_count = 1, + + vertex_buffer_offset = 461304, + vertex_buffer_size = 86832, + + index_buffer_offset = 297600, + index_buffer_size = 28800, + } +} +local geometries = { + geometry_geom_plane, + geometry_geom_torus_knot23, + geometry_geom_torusknot25, +} +local transforms_node_environmentambientlight = { +} +local instance_geometries_node_environmentambientlight = { +} +local instance_controllers_node_environmentambientlight = { +} +local instance_lights_node_environmentambientlight = { + { + light = light_environmentambientlight, + } +} +local node_channels_node_environmentambientlight = { +} +local node_node_environmentambientlight = { + parent_index = -1, + + type = collada_types.node_type.NODE, + + transforms = transforms_node_environmentambientlight, + transforms_count = 0, + + instance_geometries = instance_geometries_node_environmentambientlight, + instance_geometries_count = 0, + + instance_controllers = instance_controllers_node_environmentambientlight, + instance_controllers_count = 0, + + instance_lights = instance_lights_node_environmentambientlight, + instance_lights_count = 1, + + channels = node_channels_node_environmentambientlight, + channels_count = 0, +} +local transforms_node_plane = { +} +local instance_geometry_instance_materials_node_plane_0 = { + { + element_index = 0, -- an index into mesh.triangles + material = material_coloreffectr228g184b153_material, + + emission = { input_set = -1 }, + ambient = { input_set = -1 }, + diffuse = { input_set = -1 }, + specular = { input_set = -1 }, + }, +} +local instance_geometries_node_plane = { + { + geometry = geometry_geom_plane, + + instance_materials = instance_geometry_instance_materials_node_plane_0, + instance_materials_count = 1, + }, +} +local instance_controllers_node_plane = { +} +local instance_lights_node_plane = { +} +local node_channels_node_plane = { +} +local node_node_plane = { + parent_index = -1, + + type = collada_types.node_type.NODE, + + transforms = transforms_node_plane, + transforms_count = 0, + + instance_geometries = instance_geometries_node_plane, + instance_geometries_count = 1, + + instance_controllers = instance_controllers_node_plane, + instance_controllers_count = 0, + + instance_lights = instance_lights_node_plane, + instance_lights_count = 0, + + channels = node_channels_node_plane, + channels_count = 0, +} +local transforms_node_torus_knot23 = { + { + type = collada_types.transform_type.TRANSLATE, + translate = {-21.94384, -1.68812e-14, 45.45129}, + }, + { + type = collada_types.transform_type.ROTATE, + rotate = {-1.0, -2.22051e-16, -2.22051e-16, -90.0}, + }, + { + type = collada_types.transform_type.SCALE, + scale = {0.5458366, 0.5458366, 0.5458366}, + }, +} +local instance_geometry_instance_materials_node_torus_knot23_0 = { + { + element_index = 0, -- an index into mesh.triangles + material = material_coloreffectr153g228b184_material, + + emission = { input_set = -1 }, + ambient = { input_set = -1 }, + diffuse = { input_set = -1 }, + specular = { input_set = -1 }, + }, +} +local instance_geometries_node_torus_knot23 = { + { + geometry = geometry_geom_torus_knot23, + + instance_materials = instance_geometry_instance_materials_node_torus_knot23_0, + instance_materials_count = 1, + }, +} +local instance_controllers_node_torus_knot23 = { +} +local instance_lights_node_torus_knot23 = { +} +local node_channels_node_torus_knot23 = { +} +local node_node_torus_knot23 = { + parent_index = -1, + + type = collada_types.node_type.NODE, + + transforms = transforms_node_torus_knot23, + transforms_count = 3, + + instance_geometries = instance_geometries_node_torus_knot23, + instance_geometries_count = 1, + + instance_controllers = instance_controllers_node_torus_knot23, + instance_controllers_count = 0, + + instance_lights = instance_lights_node_torus_knot23, + instance_lights_count = 0, + + channels = node_channels_node_torus_knot23, + channels_count = 0, +} +local transforms_node_torusknot25 = { + { + type = collada_types.transform_type.TRANSLATE, + translate = {3.281013, -28.30101, 45.45129}, + }, + { + type = collada_types.transform_type.ROTATE, + rotate = {0.9075136, -0.007434183, 0.4199569, -178.1592}, + }, + { + type = collada_types.transform_type.ROTATE, + rotate = {0.9893375, 0.0, 0.1456411, -1.382112}, + }, + { + type = collada_types.transform_type.SCALE, + scale = {0.5458366, 0.5458367, 0.5458366}, + }, + { + type = collada_types.transform_type.ROTATE, + rotate = {0.9893375, 0.0, 0.1456411, 1.382112}, + }, +} +local instance_geometry_instance_materials_node_torusknot25_0 = { + { + element_index = 0, -- an index into mesh.triangles + material = material_coloreffectr177g26b88_material, + + emission = { input_set = -1 }, + ambient = { input_set = -1 }, + diffuse = { input_set = -1 }, + specular = { input_set = -1 }, + }, +} +local instance_geometries_node_torusknot25 = { + { + geometry = geometry_geom_torusknot25, + + instance_materials = instance_geometry_instance_materials_node_torusknot25_0, + instance_materials_count = 1, + }, +} +local instance_controllers_node_torusknot25 = { +} +local instance_lights_node_torusknot25 = { +} +local node_channels_node_torusknot25 = { +} +local node_node_torusknot25 = { + parent_index = -1, + + type = collada_types.node_type.NODE, + + transforms = transforms_node_torusknot25, + transforms_count = 5, + + instance_geometries = instance_geometries_node_torusknot25, + instance_geometries_count = 1, + + instance_controllers = instance_controllers_node_torusknot25, + instance_controllers_count = 0, + + instance_lights = instance_lights_node_torusknot25, + instance_lights_count = 0, + + channels = node_channels_node_torusknot25, + channels_count = 0, +} +local transforms_node_camerahelper = { + { + type = collada_types.transform_type.TRANSLATE, + translate = {-88.57101, -71.71298, 104.5738}, + }, +} +local instance_geometries_node_camerahelper = { +} +local instance_controllers_node_camerahelper = { +} +local instance_lights_node_camerahelper = { +} +local node_channels_node_camerahelper = { +} +local node_node_camerahelper = { + parent_index = -1, + + type = collada_types.node_type.NODE, + + transforms = transforms_node_camerahelper, + transforms_count = 1, + + instance_geometries = instance_geometries_node_camerahelper, + instance_geometries_count = 0, + + instance_controllers = instance_controllers_node_camerahelper, + instance_controllers_count = 0, + + instance_lights = instance_lights_node_camerahelper, + instance_lights_count = 0, + + channels = node_channels_node_camerahelper, + channels_count = 0, +} +local transforms_node_camera = { + { + type = collada_types.transform_type.MATRIX, + matrix = {0.5124585, -0.8587118, -3.72529e-08, 0.0, 0.4546754, 0.2713395, 0.848319, 0.0, -0.7284616, -0.4347285, 0.5294855, 0.0, -5.03627, 0.0, 3.688698, 1.0}, + }, +} +local instance_geometries_node_camera = { +} +local instance_controllers_node_camera = { +} +local instance_lights_node_camera = { +} +local node_channels_node_camera = { +} +local node_node_camera = { + parent_index = 4, + + type = collada_types.node_type.NODE, + + transforms = transforms_node_camera, + transforms_count = 1, + + instance_geometries = instance_geometries_node_camera, + instance_geometries_count = 0, + + instance_controllers = instance_controllers_node_camera, + instance_controllers_count = 0, + + instance_lights = instance_lights_node_camera, + instance_lights_count = 0, + + channels = node_channels_node_camera, + channels_count = 0, +} +local transforms_node_cameratargethelper = { + { + type = collada_types.transform_type.TRANSLATE, + translate = {-19.90239, -27.72767, 54.6898}, + }, +} +local instance_geometries_node_cameratargethelper = { +} +local instance_controllers_node_cameratargethelper = { +} +local instance_lights_node_cameratargethelper = { +} +local node_channels_node_cameratargethelper = { +} +local node_node_cameratargethelper = { + parent_index = -1, + + type = collada_types.node_type.NODE, + + transforms = transforms_node_cameratargethelper, + transforms_count = 1, + + instance_geometries = instance_geometries_node_cameratargethelper, + instance_geometries_count = 0, + + instance_controllers = instance_controllers_node_cameratargethelper, + instance_controllers_count = 0, + + instance_lights = instance_lights_node_cameratargethelper, + instance_lights_count = 0, + + channels = node_channels_node_cameratargethelper, + channels_count = 0, +} +local transforms_node_camera_target = { +} +local instance_geometries_node_camera_target = { +} +local instance_controllers_node_camera_target = { +} +local instance_lights_node_camera_target = { +} +local node_channels_node_camera_target = { +} +local node_node_camera_target = { + parent_index = 6, + + type = collada_types.node_type.NODE, + + transforms = transforms_node_camera_target, + transforms_count = 0, + + instance_geometries = instance_geometries_node_camera_target, + instance_geometries_count = 0, + + instance_controllers = instance_controllers_node_camera_target, + instance_controllers_count = 0, + + instance_lights = instance_lights_node_camera_target, + instance_lights_count = 0, + + channels = node_channels_node_camera_target, + channels_count = 0, +} +local nodes = { + node_node_environmentambientlight, -- 0 + node_node_plane, -- 1 + node_node_torus_knot23, -- 2 + node_node_torusknot25, -- 3 + node_node_camerahelper, -- 4 + node_node_camera, -- 5 + node_node_cameratargethelper, -- 6 + node_node_camera_target, -- 7 +} +local inputs_list = { + { + elements = input_elements_position_0_3_normal_0_3_texcoord_0_3, + elements_count = 3, + }, +} +local descriptor = { + nodes = nodes, + nodes_count = #nodes, + + geometries = geometries, + nodes_count = #geometries, + + inputs_list = inputs_list, + inputs_list_count = #inputs_list, + + images = images, + images_count = #images, + +} + +return { + descriptor = descriptor +} diff --git a/scene/test/test.mk b/scene/test/test.mk new file mode 100644 index 0000000..e69de29 diff --git a/scene/test/test.rc b/scene/test/test.rc new file mode 100644 index 0000000..5ce9187 --- /dev/null +++ b/scene/test/test.rc @@ -0,0 +1,4 @@ +RES_SCENES_TEST_VTX RCDATA "test.vtx" +RES_SCENES_TEST_VJW RCDATA "test.vjw" +RES_SCENES_TEST_IDX RCDATA "test.idx" + diff --git a/scene/test/test.vjw b/scene/test/test.vjw new file mode 100644 index 0000000..e69de29 diff --git a/scene/test/test.vtx b/scene/test/test.vtx new file mode 100644 index 0000000..c783621 Binary files /dev/null and b/scene/test/test.vtx differ