Compare commits
8 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8edfac9bfb | ||
|
|
1121b18fcb | ||
|
|
dcd8c3ea65 | ||
|
|
283a44aec5 | ||
|
|
b0aa604832 | ||
|
|
7d723fef29 | ||
|
|
04a9e65599 | ||
|
|
e0e2f83db4 |
@@ -1,3 +1,5 @@
|
||||
# io_scene_ase
|
||||
|
||||
This is a Blender addon allowing you to export static meshes to the now-defunct ASE (ASCII Scene Export) format still in use in legacy programs like Unreal Tournament 2004.
|
||||
|
||||
Check out [this video](https://www.youtube.com/watch?v=gpmBxCGHQjU) on how to install and use the addon.
|
||||
|
||||
@@ -2,7 +2,7 @@ bl_info = {
|
||||
'name': 'ASCII Scene Export',
|
||||
'description': 'Export ASE (ASCII Scene Export) files',
|
||||
'author': 'Colin Basnett (Darklight Games)',
|
||||
'version': (1, 0, 0),
|
||||
'version': (1, 0, 3),
|
||||
'blender': (2, 90, 0),
|
||||
'location': 'File > Import-Export',
|
||||
'warning': 'This add-on is under development.',
|
||||
|
||||
@@ -37,7 +37,6 @@ class ASEBuilder(object):
|
||||
if not geometry_object.is_collision and len(mesh_data.materials) == 0:
|
||||
raise ASEBuilderError(f'Mesh \'{obj.name}\' must have at least one material')
|
||||
|
||||
geometry_object.vertex_offset += len(geometry_object.vertices)
|
||||
vertex_transform = Matrix.Scale(options.scale, 4) @ Matrix.Rotation(math.pi, 4, 'Z') @ obj.matrix_world
|
||||
for vertex_index, vertex in enumerate(mesh_data.vertices):
|
||||
geometry_object.vertices.append(vertex_transform @ vertex.co)
|
||||
@@ -67,7 +66,14 @@ class ASEBuilder(object):
|
||||
face.c = geometry_object.vertex_offset + mesh_data.loops[loop_triangle.loops[2]].vertex_index
|
||||
if not geometry_object.is_collision:
|
||||
face.material_index = material_indices[loop_triangle.material_index]
|
||||
face.smoothing = poly_groups[loop_triangle.polygon_index]
|
||||
# The UT2K4 importer only accepts 32 smoothing groups. Anything past this completely mangles the
|
||||
# smoothing groups and effectively makes the whole model use sharp-edge rendering.
|
||||
# The fix is to constrain the smoothing group between 0 and 31 by applying a modulo of 32 to the actual
|
||||
# smoothing group index.
|
||||
# This may result in bad calculated normals on export in rare cases. For example, if a face with a
|
||||
# smoothing group of 3 is adjacent to a face with a smoothing group of 35 (35 % 32 == 3), those faces
|
||||
# will be treated as part of the same smoothing group.
|
||||
face.smoothing = (poly_groups[loop_triangle.polygon_index] - 1) % 32
|
||||
geometry_object.faces.append(face)
|
||||
|
||||
# Normals
|
||||
@@ -86,7 +92,6 @@ class ASEBuilder(object):
|
||||
uv_layer = mesh_data.uv_layers.active.data
|
||||
|
||||
# Texture Coordinates
|
||||
geometry_object.texture_vertex_offset += len(geometry_object.texture_vertices)
|
||||
if not geometry_object.is_collision:
|
||||
for loop_index, loop in enumerate(mesh_data.loops):
|
||||
u, v = uv_layer[loop_index].uv
|
||||
@@ -101,6 +106,10 @@ class ASEBuilder(object):
|
||||
geometry_object.texture_vertex_offset + loop_triangle.loops[2]
|
||||
))
|
||||
|
||||
# Update data offsets for next iteration
|
||||
geometry_object.texture_vertex_offset = len(geometry_object.texture_vertices)
|
||||
geometry_object.vertex_offset = len(geometry_object.vertices)
|
||||
|
||||
if len(ase.geometry_objects) == 0:
|
||||
raise ASEBuilderError('At least one mesh object must be selected')
|
||||
|
||||
|
||||
@@ -19,7 +19,7 @@ class ASE_OT_ExportOperator(bpy.types.Operator, bpy_extras.io_utils.ExportHelper
|
||||
maxlen=255, # Max internal buffer length, longer would be hilighted.
|
||||
)
|
||||
|
||||
units = EnumProperty(
|
||||
units: EnumProperty(
|
||||
items=(('M', 'Meters', ''),
|
||||
('U', 'Unreal', '')),
|
||||
name='Units'
|
||||
|
||||
Reference in New Issue
Block a user