mirror of
https://github.com/appgurueu/modlib.git
synced 2024-11-26 09:13:53 +01:00
Revert "Fix B3D reader: Don't rely on table constructor execution order"
This reverts commit fe26d4c793fd4956b2e1dda881c26736c0062b1b.
This commit is contained in:
parent
fe26d4c793
commit
95598799ee
116
b3d.lua
116
b3d.lua
@ -82,12 +82,12 @@ function read(stream)
|
|||||||
end
|
end
|
||||||
|
|
||||||
local function color()
|
local function color()
|
||||||
local color = {}
|
return {
|
||||||
color.r = float()
|
r = float(),
|
||||||
color.g = float()
|
g = float(),
|
||||||
color.b = float()
|
b = float(),
|
||||||
color.a = float()
|
a = float()
|
||||||
return color
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
local function vector3()
|
local function vector3()
|
||||||
@ -95,8 +95,7 @@ function read(stream)
|
|||||||
end
|
end
|
||||||
|
|
||||||
local function quaternion()
|
local function quaternion()
|
||||||
local w, x, y, z = float(), float(), float(), float()
|
return {[4] = float(), [1] = float(), [2] = float(), [3] = float()}
|
||||||
return {x, y, z, w}
|
|
||||||
end
|
end
|
||||||
|
|
||||||
local function content()
|
local function content()
|
||||||
@ -109,14 +108,14 @@ function read(stream)
|
|||||||
TEXS = function()
|
TEXS = function()
|
||||||
local textures = {}
|
local textures = {}
|
||||||
while content() do
|
while content() do
|
||||||
local texture = {}
|
table.insert(textures, {
|
||||||
texture.file = string()
|
file = string(),
|
||||||
texture.flags = int()
|
flags = int(),
|
||||||
texture.blend = int()
|
blend = int(),
|
||||||
texture.pos = float_array(2)
|
pos = float_array(2),
|
||||||
texture.scale = float_array(2)
|
scale = float_array(2),
|
||||||
texture.rotation = float()
|
rotation = float()
|
||||||
table.insert(textures, texture)
|
})
|
||||||
end
|
end
|
||||||
return textures
|
return textures
|
||||||
end,
|
end,
|
||||||
@ -125,13 +124,14 @@ function read(stream)
|
|||||||
brushes.n_texs = int()
|
brushes.n_texs = int()
|
||||||
assert(brushes.n_texs <= 8)
|
assert(brushes.n_texs <= 8)
|
||||||
while content() do
|
while content() do
|
||||||
local brush = {}
|
local brush = {
|
||||||
brush.name = string()
|
name = string(),
|
||||||
brush.color = color()
|
color = color(),
|
||||||
brush.shininess = float()
|
shininess = float(),
|
||||||
brush.blend = float()
|
blend = float(),
|
||||||
brush.fx = float()
|
fx = float(),
|
||||||
brush.texture_id = {}
|
texture_id = {}
|
||||||
|
}
|
||||||
for index = 1, brushes.n_texs do
|
for index = 1, brushes.n_texs do
|
||||||
brush.texture_id[index] = optional_id()
|
brush.texture_id[index] = optional_id()
|
||||||
end
|
end
|
||||||
@ -140,19 +140,21 @@ function read(stream)
|
|||||||
return brushes
|
return brushes
|
||||||
end,
|
end,
|
||||||
VRTS = function()
|
VRTS = function()
|
||||||
local vertices = {}
|
local vertices = {
|
||||||
vertices.flags = int()
|
flags = int(),
|
||||||
vertices.tex_coord_sets = int()
|
tex_coord_sets = int(),
|
||||||
vertices.tex_coord_set_size = int()
|
tex_coord_set_size = int()
|
||||||
|
}
|
||||||
assert(vertices.tex_coord_sets <= 8 and vertices.tex_coord_set_size <= 4)
|
assert(vertices.tex_coord_sets <= 8 and vertices.tex_coord_set_size <= 4)
|
||||||
local has_normal = (vertices.flags % 2 == 1) or nil
|
local has_normal = (vertices.flags % 2 == 1) or nil
|
||||||
local has_color = (math.floor(vertices.flags / 2) % 2 == 1) or nil
|
local has_color = (math.floor(vertices.flags / 2) % 2 == 1) or nil
|
||||||
while content() do
|
while content() do
|
||||||
local vertex = {}
|
local vertex = {
|
||||||
vertex.pos = vector3()
|
pos = vector3(),
|
||||||
vertex.normal = has_normal and vector3()
|
normal = has_normal and vector3(),
|
||||||
vertex.color = has_color and color()
|
color = has_color and color(),
|
||||||
vertex.tex_coords = {}
|
tex_coords = {}
|
||||||
|
}
|
||||||
for tex_coord_set = 1, vertices.tex_coord_sets do
|
for tex_coord_set = 1, vertices.tex_coord_sets do
|
||||||
local tex_coords = {}
|
local tex_coords = {}
|
||||||
for tex_coord = 1, vertices.tex_coord_set_size do
|
for tex_coord = 1, vertices.tex_coord_set_size do
|
||||||
@ -170,16 +172,15 @@ function read(stream)
|
|||||||
vertex_ids = {}
|
vertex_ids = {}
|
||||||
}
|
}
|
||||||
while content() do
|
while content() do
|
||||||
-- possibly obsolete if Lua guarantees a certain order of execution for list table constructors
|
table.insert(tris.vertex_ids, {id(), id(), id()})
|
||||||
local id_1, id_2, id_3 = id(), id(), id()
|
|
||||||
table.insert(tris.vertex_ids, {id_1, id_2, id_3})
|
|
||||||
end
|
end
|
||||||
return tris
|
return tris
|
||||||
end,
|
end,
|
||||||
MESH = function()
|
MESH = function()
|
||||||
local mesh = {}
|
local mesh = {
|
||||||
mesh.brush_id = optional_id()
|
brush_id = optional_id(),
|
||||||
mesh.vertices = chunk{VRTS = true}
|
vertices = chunk{VRTS = true}
|
||||||
|
}
|
||||||
mesh.triangle_sets = {}
|
mesh.triangle_sets = {}
|
||||||
repeat
|
repeat
|
||||||
local tris = chunk{TRIS = true}
|
local tris = chunk{TRIS = true}
|
||||||
@ -217,33 +218,34 @@ function read(stream)
|
|||||||
flags = flags
|
flags = flags
|
||||||
}
|
}
|
||||||
while content() do
|
while content() do
|
||||||
local frame = {}
|
table.insert(bone, {
|
||||||
frame.frame = int()
|
frame = int(),
|
||||||
frame.position = position and vector3() or nil
|
position = position and vector3() or nil,
|
||||||
frame.scale = scale and vector3() or nil
|
scale = scale and vector3() or nil,
|
||||||
frame.rotation = rotation and quaternion() or nil
|
rotation = rotation and quaternion() or nil
|
||||||
table.insert(bone, frame)
|
})
|
||||||
end
|
end
|
||||||
-- Ensure frames are sorted ascending
|
-- Ensure frames are sorted ascending
|
||||||
table.sort(bone, function(a, b) return a.frame < b.frame end)
|
table.sort(bone, function(a, b) return a.frame < b.frame end)
|
||||||
return bone
|
return bone
|
||||||
end,
|
end,
|
||||||
ANIM = function()
|
ANIM = function()
|
||||||
local anim = {}
|
return {
|
||||||
-- flags are unused
|
-- flags are unused
|
||||||
anim.flags = int()
|
flags = int(),
|
||||||
anim.frames = int()
|
frames = int(),
|
||||||
anim.fps = float()
|
fps = float()
|
||||||
return anim
|
}
|
||||||
end,
|
end,
|
||||||
NODE = function()
|
NODE = function()
|
||||||
local node = {}
|
local node = {
|
||||||
node.name = string()
|
name = string(),
|
||||||
node.position = vector3()
|
position = vector3(),
|
||||||
node.scale = vector3()
|
scale = vector3(),
|
||||||
node.keys = {}
|
keys = {},
|
||||||
node.rotation = quaternion()
|
rotation = quaternion(),
|
||||||
node.children = {}
|
children = {}
|
||||||
|
}
|
||||||
local node_type
|
local node_type
|
||||||
-- See https://github.com/blitz-research/blitz3d/blob/master/blitz3d/loader_b3d.cpp#L263
|
-- See https://github.com/blitz-research/blitz3d/blob/master/blitz3d/loader_b3d.cpp#L263
|
||||||
-- Order is not validated; double occurences of mutually exclusive node def are
|
-- Order is not validated; double occurences of mutually exclusive node def are
|
||||||
|
Loading…
Reference in New Issue
Block a user