MAPA/MAPU bug fixes

This commit is contained in:
Jack Andersen 2017-03-20 11:14:20 -10:00
parent 87ae8aaa57
commit ed5085e42b
5 changed files with 47 additions and 20 deletions

View File

@ -1,7 +1,8 @@
import bpy, struct
import bpy, struct, bmesh
from . import hmdl
from mathutils import Vector
VertPool = hmdl.HMDLMesh.VertPool
strip_next_loop = hmdl.HMDLMesh.strip_next_loop
def cook(writebuf, mesh_obj):
if mesh_obj.type != 'MESH':
@ -98,10 +99,14 @@ def cook(writebuf, mesh_obj):
if edge.seam:
edge_set.add(edge)
trace_edge = edge_set.pop()
if len(edge_set):
trace_edge = edge_set.pop()
else:
trace_edge = None
edge_ranges = []
edge_iter = loop_iter + loop_count
edge_count = 0
if trace_edge:
while trace_edge:
edge_count = 0
vert_pool.vert_out_map(writebuf, trace_edge.verts[0])
vert_pool.vert_out_map(writebuf, trace_edge.verts[1])
edge_count += 2
@ -117,18 +122,24 @@ def cook(writebuf, mesh_obj):
edge_count += 1
found_edge = True
break
if len(edge_set):
trace_edge = edge_set.pop()
else:
trace_edge = None
edge_ranges.append((edge_iter, edge_count))
edge_iter += edge_count
pos_avg = Vector()
norm_avg = Vector()
if len(loop_set):
for loop in loop_set:
pos_avg += loop.co
norm_avg += loop.normal
pos_avg += loop.vert.co
norm_avg += loop.vert.normal
pos_avg /= len(loop_set)
norm_avg /= len(loop_set)
norm_avg.normalize()
loop_ranges.append((loop_iter, loop_count, edge_iter, edge_count, pos_avg, norm_avg))
loop_ranges.append((loop_iter, loop_count, edge_ranges, pos_avg, norm_avg))
loop_iter += loop_count + edge_count
# No more surfaces
@ -137,9 +148,12 @@ def cook(writebuf, mesh_obj):
# Write out loop ranges and averages
writebuf(struct.pack('I', len(loop_ranges)))
for loop_range in loop_ranges:
writebuf(struct.pack('fff', loop_range[3][0], loop_range[3][1], loop_range[3][2]))
writebuf(struct.pack('fff', loop_range[4][0], loop_range[4][1], loop_range[4][2]))
writebuf(struct.pack('fff', loop_range[5][0], loop_range[5][1], loop_range[5][2]))
writebuf(struct.pack('IIII', loop_range[0], loop_range[1], loop_range[2], loop_range[3]))
writebuf(struct.pack('II', loop_range[0], loop_range[1]))
writebuf(struct.pack('I', len(loop_range[2])))
for edge_range in loop_range[2]:
writebuf(struct.pack('II', edge_range[0], edge_range[1]))
# Write out mappable objects
poi_count = 0
@ -151,7 +165,7 @@ def cook(writebuf, mesh_obj):
for obj in bpy.context.scene.objects:
if obj.retro_mappable_type != -1:
writebuf(struct.pack('III',
obj.retro_mappable_type, obj.retro_mappable_unk, obj.retro_mappable_sclyid))
obj.retro_mappable_type, obj.retro_mappable_unk, int(obj.retro_mappable_sclyid, 0)))
writebuf(struct.pack('ffffffffffffffff',
obj.matrix_world[0][0], obj.matrix_world[0][1], obj.matrix_world[0][2], obj.matrix_world[0][3],
obj.matrix_world[1][0], obj.matrix_world[1][1], obj.matrix_world[1][2], obj.matrix_world[1][3],

View File

@ -1,10 +1,10 @@
import bpy
import bpy, os, struct
def cook(writebuf):
found_lib = False
for obj in bpy.context.scene.objects:
if obj.library:
path = os.path.normpath(bpy.path.abspath(obj.library.filepath))
if obj.data and obj.data.library:
path = os.path.normpath(bpy.path.abspath(obj.data.library.filepath))
writebuf(struct.pack('I', len(path)))
writebuf(path.encode())
found_lib = True
@ -12,6 +12,12 @@ def cook(writebuf):
if not found_lib:
raise RuntimeError('No hexagon segments present')
world_count = 0
for obj in bpy.context.scene.objects:
if not obj.parent and obj.type == 'EMPTY':
world_count += 1
writebuf(struct.pack('I', world_count))
for obj in bpy.context.scene.objects:
if not obj.parent and obj.type == 'EMPTY':
writebuf(struct.pack('I', len(obj.name)))

2
hecl/extern/athena vendored

@ -1 +1 @@
Subproject commit 5df07a203939f382f66238e7d3cec417f9ec0b3e
Subproject commit f3226c6102a3f25d603f8b7ff6dcd8b358b59636

View File

@ -726,8 +726,7 @@ public:
Vector3f centerOfMass;
Index start;
Index count;
Index borderStart;
Index borderCount;
std::vector<std::pair<Index, Index>> borders;
Surface(BlenderConnection& conn);
};
std::vector<Surface> surfaces;

View File

@ -1098,7 +1098,17 @@ BlenderConnection::DataStream::MapArea::Surface::Surface(BlenderConnection& conn
{
centerOfMass.read(conn);
normal.read(conn);
conn._readBuf(&start, 16);
conn._readBuf(&start, 8);
uint32_t borderCount;
conn._readBuf(&borderCount, 4);
borders.reserve(borderCount);
for (int i=0 ; i<borderCount ; ++i)
{
borders.emplace_back();
std::pair<Index, Index>& idx = borders.back();
conn._readBuf(&idx, 8);
}
}
BlenderConnection::DataStream::MapArea::POI::POI(BlenderConnection& conn)
@ -1165,9 +1175,7 @@ BlenderConnection::DataStream::MapUniverse::World::World(BlenderConnection& conn
conn._readBuf(&path[0], pathLen);
hecl::SystemStringView sysPath(path);
SystemString pathRel =
conn.m_loadedBlend.getProject().getProjectRootPath().getProjectRelativeFromAbsolute(sysPath.sys_str());
worldPath.assign(conn.m_loadedBlend.getProject().getProjectWorkingPath(), pathRel);
worldPath.assign(conn.m_loadedBlend.getProject().getProjectWorkingPath(), sysPath.sys_str());
}
}