PATH cooking bug fix

This commit is contained in:
Jack Andersen 2018-02-26 00:38:50 -10:00
parent 3acb9c9e3d
commit f2d6f643c9
3 changed files with 100 additions and 42 deletions

View File

@ -47,10 +47,9 @@ def set_height(self, val):
# Edit panel
def draw(layout, context):
layout.prop_search(context.scene, 'hecl_path_obj', context.scene, 'objects')
layout.operator('view3d.toggle_path_height_visualization', text='Toggle Height Viz', icon='MANIPUL')
layout.operator('view3d.toggle_path_background_wireframe', text='Toggle Background Wire', icon='WIRE')
hr = HeightRef()
if hr.ready:
layout.operator('view3d.toggle_path_height_visualization', text='Toggle Height Viz', icon='MANIPUL')
if HeightRef().ready:
layout.prop(context.window_manager, 'hecl_height_prop', text='Height')
# Simple AABB class
@ -126,7 +125,7 @@ def cook(writebuf, mesh_obj):
node_idx = 0
start_node = len(node_list)
start_link = len(link_list)
while cur_loop != start_loop:
while True:
node_list.append(cur_loop)
cur_loop = cur_loop.link_loop_prev
for other_face in cur_loop.edge.link_faces:
@ -134,6 +133,8 @@ def cook(writebuf, mesh_obj):
continue
link_list.append((node_idx, other_face.index, cur_loop.edge.calc_length()))
node_idx += 1
if cur_loop == start_loop:
break
region_list.append((f, range(start_node, len(node_list)), range(start_link, len(link_list))))
# Emit nodes
@ -159,7 +160,7 @@ def cook(writebuf, mesh_obj):
aabb = AABB()
for v in r[0].verts:
aabb.accumulate(v.co)
aabb.accumulate(v.co + Vector(0.0, 0.0, height))
aabb.accumulate(v.co + Vector((0.0, 0.0, height)))
ba += struct.pack('>IIIIHHffffIfffffffffI', len(r[1]), r[1].start, len(r[2]), r[2].start,
material.retro_path_idx_mask, material.retro_path_type_mask,
height, r[0].normal[0], r[0].normal[1], r[0].normal[2],
@ -170,7 +171,7 @@ def cook(writebuf, mesh_obj):
num_regions = len(region_list)
total_adjacencies = num_regions * (num_regions - 1) // 2
num_words = (total_adjacencies + 31) / 32
num_words = (total_adjacencies + 31) // 32
# Find ground adjacencies
words = [0] * num_words
@ -183,11 +184,11 @@ def cook(writebuf, mesh_obj):
i2 = j
if i1 > i2:
continue
rem_regions = num_regions - i1
rem_connections = rem_regions * (rem_regions - 1) // 2
if ground_adjacencies.has_adjacency(bm.faces[i], bm.faces[j]):
rem_regions = num_regions - i1
rem_connections = rem_regions * (rem_regions - 1) // 2
bit = total_adjacencies - rem_connections + i2 - (i1 + 1)
words[bit / 32] |= 1 << (bit % 32)
words[bit // 32] |= 1 << (bit % 32)
for w in words:
ba += struct.pack('>I', w)
@ -202,16 +203,16 @@ def cook(writebuf, mesh_obj):
i2 = j
if i1 > i2:
continue
rem_regions = num_regions - i1
rem_connections = rem_regions * (rem_regions - 1) // 2
if flyer_adjacencies.has_adjacency(bm.faces[i], bm.faces[j]):
rem_regions = num_regions - i1
rem_connections = rem_regions * (rem_regions - 1) // 2
bit = total_adjacencies - rem_connections + i2 - (i1 + 1)
words[bit / 32] |= 1 << (bit % 32)
words[bit // 32] |= 1 << (bit % 32)
for w in words:
ba += struct.pack('>I', w)
# Unused zero bits
for i in range((((num_regions * num_regions) + 31) / 32 - num_words) * 2):
for i in range((((num_regions * num_regions) + 31) // 32 - num_words) * 2):
ba += struct.pack('>I', 0)
# Empty octree (to be generated by hecl)
@ -228,6 +229,28 @@ def draw_line_3d(color, start, end):
bgl.glVertex3f(*start)
bgl.glVertex3f(*end)
# Draw RNA polygon
def draw_poly(p, obj, obj_mtx, height, top_color, side_color):
for ek in p.edge_keys:
co0 = obj_mtx * obj.data.vertices[ek[0]].co
co1 = obj_mtx * obj.data.vertices[ek[1]].co
draw_line_3d(top_color, co0 + Vector((0.0, 0.0, height)),
co1 + Vector((0.0, 0.0, height)))
for vk in p.vertices:
co = obj_mtx * obj.data.vertices[vk].co
draw_line_3d(side_color, co, co + Vector((0.0, 0.0, height)))
# Draw bmesh face
def draw_face(f, obj_mtx, height, top_color, side_color):
for e in f.edges:
co0 = obj_mtx * e.verts[0].co
co1 = obj_mtx * e.verts[1].co
draw_line_3d(top_color, co0 + Vector((0.0, 0.0, height)),
co1 + Vector((0.0, 0.0, height)))
for v in f.verts:
co = obj_mtx * v.co
draw_line_3d(side_color, co, co + Vector((0.0, 0.0, height)))
# Viewport hook callback
def draw_callback_3d(self, context):
# object locations
@ -238,32 +261,52 @@ def draw_callback_3d(self, context):
return
obj_mtx = obj.matrix_world
bm = None
height_lay = None
height_lambda = None
if obj == context.edit_object:
bm = bmesh.from_edit_mesh(obj.data)
if 'Height' in bm.faces.layers.float:
height_lay = bm.faces.layers.float['Height']
height_lambda = lambda i: bm.faces[i][height_lay]
else:
if 'Height' in obj.data.polygon_layers_float:
height_lay = obj.data.polygon_layers_float['Height']
height_lambda = lambda i: height_lay.data[i].value
for p in obj.data.polygons:
height = 1.0
if height_lay is not None:
height = height_lambda(p.index)
for ek in p.edge_keys:
co0 = obj_mtx * obj.data.vertices[ek[0]].co
co1 = obj_mtx * obj.data.vertices[ek[1]].co
draw_line_3d((0.0, 0.0, 1.0, 0.7), co0 + Vector((0.0, 0.0, height)),
co1 + Vector((0.0, 0.0, height)))
for vk in p.vertices:
co = obj_mtx * obj.data.vertices[vk].co
draw_line_3d((1.0, 0.0, 0.0, 0.7), co, co + Vector((0.0, 0.0, height)))
# Deselected colors
top_color = (0.0, 0.0, 1.0, 0.7)
side_color = (1.0, 0.0, 0.0, 0.7)
if bm is not None:
for f in bm.faces:
height = 1.0
if height_lay is not None:
selected = f.select
if selected:
continue
height = f[height_lay]
draw_face(f, obj_mtx, height, top_color, side_color)
else:
for p in obj.data.polygons:
height = 1.0
if height_lay is not None:
height = height_lay.data[p.index].value
draw_poly(p, obj, obj_mtx, height, top_color, side_color)
bgl.glEnd()
# Selected colors
if bm is not None:
top_color = (1.0, 0.0, 1.0, 0.7)
side_color = (0.0, 1.0, 0.0, 0.7)
# Avoid z-fighting on selected lines
bgl.glDepthRange(-0.001, 0.999)
for f in bm.faces:
if height_lay is not None:
selected = f.select
if not selected:
continue
height = f[height_lay]
draw_face(f, obj_mtx, height, top_color, side_color)
bgl.glEnd()
bgl.glDepthRange(0.0, 1.0)
# restore opengl defaults
bgl.glColor4f(0.0, 0.0, 0.0, 1.0)
@ -294,7 +337,6 @@ class PathHeightDrawOperator(bpy.types.Operator):
class PathBackgroundWireframeOperator(bpy.types.Operator):
bl_idname = "view3d.toggle_path_background_wireframe"
bl_label = "Toggle PATH background wireframe"
_handle_3d = None
def execute(self, context):
if context.scene.background_set:

2
hecl/extern/athena vendored

@ -1 +1 @@
Subproject commit 73a0ae0d0056c1ad3a0eb9cc3a50d284e320ec2e
Subproject commit 2381e65d0d70310e1756643aa45e1ad021a51611

View File

@ -180,13 +180,21 @@ err:
size_t Connection::_readBuf(void* buf, size_t len)
{
int ret = Read(m_readpipe[0], buf, len);
if (ret < 0)
goto err;
if (len >= 4)
if (!memcmp((char*)buf, "EXCEPTION", std::min(len, size_t(9))))
_blenderDied();
return ret;
uint8_t* cBuf = reinterpret_cast<uint8_t*>(buf);
size_t readLen = 0;
do
{
int ret = Read(m_readpipe[0], cBuf, len);
if (ret < 0)
goto err;
if (len >= 4)
if (!memcmp((char*) cBuf, "EXCEPTION", std::min(len, size_t(9))))
_blenderDied();
readLen += ret;
cBuf += ret;
len -= ret;
} while (len);
return readLen;
err:
_blenderDied();
return 0;
@ -194,10 +202,18 @@ err:
size_t Connection::_writeBuf(const void* buf, size_t len)
{
int ret = Write(m_writepipe[1], buf, len);
if (ret < 0)
goto err;
return ret;
const uint8_t* cBuf = reinterpret_cast<const uint8_t*>(buf);
size_t writeLen = 0;
do
{
int ret = Write(m_writepipe[1], cBuf, len);
if (ret < 0)
goto err;
writeLen += ret;
cBuf += ret;
len -= ret;
} while (len);
return writeLen;
err:
_blenderDied();
return 0;