fix objects with parent transforms not exporting correctly
This commit is contained in:
parent
0fab83cfa1
commit
78237e7eec
|
@ -52,10 +52,6 @@ Saving polygons also will make any hypothetical importer work better, since quad
|
||||||
|
|
||||||
The triangle strips are generated using a brute-force method that seams to give decent results.
|
The triangle strips are generated using a brute-force method that seams to give decent results.
|
||||||
|
|
||||||
#### Delta transforms are combined with regular transforms on export.
|
|
||||||
Unsurprisingly Blender's delta transforms have no meaningful representation in .msh files.
|
|
||||||
So they are combined with the regular transform during export.
|
|
||||||
|
|
||||||
#### If a scene has no materials a default one will be added to the resulting .msh file.
|
#### If a scene has no materials a default one will be added to the resulting .msh file.
|
||||||
Can't imagine this coming up much (Maybe if you're model is just for collisions or shadows?) but that's how it works.
|
Can't imagine this coming up much (Maybe if you're model is just for collisions or shadows?) but that's how it works.
|
||||||
|
|
||||||
|
|
|
@ -24,8 +24,8 @@ class CollisionPrimitiveShape(Enum):
|
||||||
class ModelTransform:
|
class ModelTransform:
|
||||||
""" Class representing a `TRAN` section in a .msh file. """
|
""" Class representing a `TRAN` section in a .msh file. """
|
||||||
|
|
||||||
translation: Vector = Vector((0.0, 0.0, 0.0))
|
translation: Vector = field(default_factory=Vector)
|
||||||
rotation: Quaternion = Quaternion((1.0, 0.0, 0.0, 0.0))
|
rotation: Quaternion = field(default_factory=Quaternion)
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
class GeometrySegment:
|
class GeometrySegment:
|
||||||
|
|
|
@ -27,12 +27,14 @@ def gather_models() -> List[Model]:
|
||||||
|
|
||||||
obj = uneval_obj.evaluated_get(depsgraph)
|
obj = uneval_obj.evaluated_get(depsgraph)
|
||||||
|
|
||||||
|
local_translation, local_rotation, _ = obj.matrix_local.decompose()
|
||||||
|
|
||||||
model = Model()
|
model = Model()
|
||||||
model.name = obj.name
|
model.name = obj.name
|
||||||
model.model_type = get_model_type(obj)
|
model.model_type = get_model_type(obj)
|
||||||
model.hidden = get_is_model_hidden(obj)
|
model.hidden = get_is_model_hidden(obj)
|
||||||
model.transform.rotation = convert_rotation_space(obj.rotation_quaternion @ obj.delta_rotation_quaternion)
|
model.transform.rotation = convert_rotation_space(local_rotation)
|
||||||
model.transform.translation = convert_vector_space(add_vec(obj.location, obj.delta_location))
|
model.transform.translation = convert_vector_space(local_translation)
|
||||||
|
|
||||||
if obj.parent is not None:
|
if obj.parent is not None:
|
||||||
model.parent = obj.parent.name
|
model.parent = obj.parent.name
|
||||||
|
@ -42,8 +44,9 @@ def gather_models() -> List[Model]:
|
||||||
model.geometry = create_mesh_geometry(mesh)
|
model.geometry = create_mesh_geometry(mesh)
|
||||||
obj.to_mesh_clear()
|
obj.to_mesh_clear()
|
||||||
|
|
||||||
mesh_scale = convert_vector_space(get_object_worldspace_scale(obj))
|
_, _, world_scale = obj.matrix_world.decompose()
|
||||||
scale_segments(mesh_scale, model.geometry)
|
world_scale = convert_scale_space(world_scale)
|
||||||
|
scale_segments(world_scale, model.geometry)
|
||||||
|
|
||||||
if get_is_collision_primitive(obj):
|
if get_is_collision_primitive(obj):
|
||||||
model.collisionprimitive = get_collision_primitive(obj)
|
model.collisionprimitive = get_collision_primitive(obj)
|
||||||
|
@ -131,17 +134,6 @@ def create_mesh_geometry(mesh: bpy.types.Mesh) -> List[GeometrySegment]:
|
||||||
|
|
||||||
return segments
|
return segments
|
||||||
|
|
||||||
def get_object_worldspace_scale(obj: bpy.types.Object) -> Vector:
|
|
||||||
""" Get the worldspace scale transform for a Blender object. """
|
|
||||||
|
|
||||||
scale = mul_vec(obj.scale, obj.delta_scale)
|
|
||||||
|
|
||||||
while obj.parent is not None:
|
|
||||||
obj = obj.parent
|
|
||||||
scale = mul_vec(scale, mul_vec(obj.scale, obj.delta_scale))
|
|
||||||
|
|
||||||
return scale
|
|
||||||
|
|
||||||
def get_model_type(obj: bpy.types.Object) -> ModelType:
|
def get_model_type(obj: bpy.types.Object) -> ModelType:
|
||||||
""" Get the ModelType for a Blender object. """
|
""" Get the ModelType for a Blender object. """
|
||||||
# TODO: Skinning support, etc
|
# TODO: Skinning support, etc
|
||||||
|
@ -194,7 +186,7 @@ def get_collision_primitive(obj: bpy.types.Object) -> CollisionPrimitive:
|
||||||
raise RuntimeError(f"Object '{obj.name}' is being used as a cylinder collision "
|
raise RuntimeError(f"Object '{obj.name}' is being used as a cylinder collision "
|
||||||
f"primitive but it's X and Y dimensions are not uniform!")
|
f"primitive but it's X and Y dimensions are not uniform!")
|
||||||
primitive.radius = obj.dimensions[0] * 0.5
|
primitive.radius = obj.dimensions[0] * 0.5
|
||||||
primitive.height = obj.dimensions[2] * 0.5
|
primitive.height = obj.dimensions[2]
|
||||||
elif primitive.shape == CollisionPrimitiveShape.BOX:
|
elif primitive.shape == CollisionPrimitiveShape.BOX:
|
||||||
primitive.radius = obj.dimensions[0] * 0.5
|
primitive.radius = obj.dimensions[0] * 0.5
|
||||||
primitive.height = obj.dimensions[2] * 0.5
|
primitive.height = obj.dimensions[2] * 0.5
|
||||||
|
@ -212,7 +204,7 @@ def get_collision_primitive_shape(obj: bpy.types.Object) -> CollisionPrimitiveSh
|
||||||
return CollisionPrimitiveShape.SPHERE
|
return CollisionPrimitiveShape.SPHERE
|
||||||
if "cylinder" in name or "cyln" in name or "cyl" in name:
|
if "cylinder" in name or "cyln" in name or "cyl" in name:
|
||||||
return CollisionPrimitiveShape.CYLINDER
|
return CollisionPrimitiveShape.CYLINDER
|
||||||
if "box" in name:
|
if "box" in name: # TODO: Accept cube, cuboid
|
||||||
return CollisionPrimitiveShape.BOX
|
return CollisionPrimitiveShape.BOX
|
||||||
|
|
||||||
raise RuntimeError(f"Object '{obj.name}' has no primitive type specified in it's name!")
|
raise RuntimeError(f"Object '{obj.name}' has no primitive type specified in it's name!")
|
||||||
|
|
Loading…
Reference in New Issue