updated map coordinate struct/union

added callback for turning a std::map of coordinates to features into a list
develop
doomchild 2011-03-14 15:00:51 -05:00
parent 5cbc9e5918
commit e126f21e4b
1 changed files with 39 additions and 5 deletions

@ -49,13 +49,19 @@ class Position2D(Structure):
_fields_ = [("x", c_ushort), _fields_ = [("x", c_ushort),
("y", c_ushort)] ("y", c_ushort)]
class Position3d(Structure):
_fields_ = [("x", c_ushort),
("y", c_ushort),
("z", c_uint)]
class PlaneCoord(Union): class PlaneCoord(Union):
_fields_ = [("xy", c_uint), _fields_ = [("xyz", Position3D),
("dim", Position2D)] ("dim", Position2D),
("comparate", c_ulong)]
def __cmp__(self, other): def __cmp__(self, other):
if isinstance(other, PlaneCoord): if isinstance(other, PlaneCoord):
return self.xy - other.xy return self.comparate - other.comparate
else: else:
raise TypeError("argument must be of type %s" % type(self)) raise TypeError("argument must be of type %s" % type(self))
@ -66,6 +72,35 @@ class Feature(Structure):
("discovered", c_byte), ("discovered", c_byte),
("origin", c_uint)] ("origin", c_uint)]
class FeatureMapNode(Structure):
_fields_ = [("coordinate", PlaneCoord),
("features", POINTER(Feature)),
("feature_length", c_uint)]
def _alloc_featuremap_buffer_callback(ptr, fmap_list, count):
arr_list = []
arr = (FeatureMapNode * count)()
for i, v in enumerate(arr):
f_count = int(fmap_list[i])
f_arr = (Feature * f_count)()
f_p = cast(f_arr, POINTER(Feature))
v.features = f_p
arr_list.extend((f_arr, f_p))
p = cast(arr, POINTER(FeatureMapNode))
ptr[0] = p
pointer_dict[addressof(arr)] = (ptr, arr, p, arr_list)
return 1
_alloc_featuremap_buffer_functype = CFUNCTYPE(c_int, POINTER(POINTER(FeatureMapNode)), uint_ptr, c_uint)
_alloc_featuremap_buffer_func = _alloc_featuremap_buffer_functype(_alloc_featuremap_buffer_callback)
_register_callback("alloc_featuremap_buffer_callback", _alloc_featuremap_buffer_func)
class Vein(Structure): class Vein(Structure):
_fields_ = [("vtable", c_uint), _fields_ = [("vtable", c_uint),
("type", c_int), ("type", c_int),
@ -273,7 +308,7 @@ def _alloc_tree_buffer_callback(ptr, count):
return util._allocate_array(ptr, Tree, count) return util._allocate_array(ptr, Tree, count)
_alloc_tree_buffer_functype = CFUNCTYPE(c_int, POINTER(POINTER(Tree)), c_uint) _alloc_tree_buffer_functype = CFUNCTYPE(c_int, POINTER(POINTER(Tree)), c_uint)
_alloc_tree_buffer_func = _alloc_tree_buffer_functype(_alloc_tree_buffer_func) _alloc_tree_buffer_func = _alloc_tree_buffer_functype(_alloc_tree_buffer_callback)
_register_callback("alloc_tree_buffer_callback", _alloc_tree_buffer_func) _register_callback("alloc_tree_buffer_callback", _alloc_tree_buffer_func)
class Material(Structure): class Material(Structure):
@ -533,7 +568,6 @@ def _alloc_creaturetype_buffer(ptr, descriptors, count):
p = cast(c_arr, _creaturetype_ptr) p = cast(c_arr, _creaturetype_ptr)
ptr[0] = p ptr[0] = p
print ""
pointer_dict[addressof(c_arr)] = (ptr, c_arr, p, arr_list) pointer_dict[addressof(c_arr)] = (ptr, c_arr, p, arr_list)