4 class model(Structure
):
6 _fields_
= [("identifier",c_uint32
),
7 ("vertex_count",c_uint32
),
8 ("indice_count",c_uint32
),
9 ("layer_count",c_uint32
),
10 ("marker_count",c_uint32
)]
12 class sdf_primative(Structure
):
14 _fields_
= [("origin",c_float
*4),
17 class submodel(Structure
):
19 _fields_
= [("indice_start",c_uint32
),
20 ("indice_count",c_uint32
),
21 ("vertex_start",c_uint32
),
22 ("vertex_count",c_uint32
),
23 ("bbx",(c_float
*3)*2),
25 ("sdf",sdf_primative
),
29 class marker(Structure
):
31 _fields_
= [("co",c_float
*3),
36 class model_vert(Structure
):
38 _fields_
= [("co",c_float
*3),
44 return a
[0]*b
[0] + a
[1]*b
[1] + a
[2]*b
[2] + a
[3]*a
[3]
47 return math
.sqrt( v4_dot(a
,a
) )
49 def m3x3_mul( a
, b
, d
):
68 d
[0][0] = a00
*b00
+ a10
*b01
+ a20
*b02
69 d
[0][1] = a01
*b00
+ a11
*b01
+ a21
*b02
70 d
[0][2] = a02
*b00
+ a12
*b01
+ a22
*b02
71 d
[1][0] = a00
*b10
+ a10
*b11
+ a20
*b12
72 d
[1][1] = a01
*b10
+ a11
*b11
+ a21
*b12
73 d
[1][2] = a02
*b10
+ a12
*b11
+ a22
*b12
74 d
[2][0] = a00
*b20
+ a10
*b21
+ a20
*b22
75 d
[2][1] = a01
*b20
+ a11
*b21
+ a21
*b22
76 d
[2][2] = a02
*b20
+ a12
*b21
+ a22
*b22
80 s
= 2.0 if l
> 0.0 else 0.0
90 d
[0][0] = 1.0 - yy
- zz
91 d
[1][1] = 1.0 - xx
- zz
92 d
[2][2] = 1.0 - xx
- yy
101 diag
= m
[0][0] + m
[1][1] + m
[2][2]
103 r
= math
.sqrt( 1.0 + diag
)
105 q
[0] = rinv
* (m
[1][2] - m
[2][1])
106 q
[1] = rinv
* (m
[2][0] - m
[0][2])
107 q
[2] = rinv
* (m
[0][1] - m
[1][0])
109 elif m
[0][0] >= m
[1][1] and m
[0][0] >= m
[2][2]:
110 r
= math
.sqrt( 1.0 - m
[1][1] - m
[2][2] + m
[0][0] )
113 q
[1] = rinv
* (m
[0][1] + m
[1][0])
114 q
[2] = rinv
* (m
[0][2] + m
[2][0])
115 q
[3] = rinv
* (m
[1][2] - m
[2][1])
116 elif m
[1][1] >= m
[2][2]:
117 r
= math
.sqrt( 1.0 - m
[0][0] - m
[2][2] + m
[1][1] )
119 q
[0] = rinv
* (m
[0][1] + m
[1][0])
121 q
[2] = rinv
* (m
[1][2] + m
[2][1])
122 q
[3] = rinv
* (m
[2][0] - m
[0][2])
124 r
= math
.sqrt( 1.0 - m
[0][0] - m
[1][1] + m
[2][2] )
126 q
[0] = rinv
* (m
[0][2] + m
[2][0])
127 q
[1] = rinv
* (m
[1][2] + m
[2][1])
129 q
[3] = rinv
* (m
[0][1] - m
[1][0])
131 def write_model(name
):
132 fp
= open(F
"/home/harry/Documents/carve/models/{name}.mdl", "wb")
133 collection
= bpy
.data
.collections
[name
]
136 header
.identifier
= 0xABCD0000
137 header
.vertex_count
= 0
138 header
.indice_count
= 0
139 header
.layer_count
= 0
146 for obj
in collection
.objects
:
147 if obj
.type == 'EMPTY':
149 mk
.co
[0] = obj
.location
[0]
150 mk
.co
[1] = obj
.location
[2]
151 mk
.co
[2] = -obj
.location
[1]
153 # Convert rotation quat to our space type
154 quat
= obj
.matrix_world
.to_quaternion()
160 mk
.s
[0] = obj
.scale
[0]
161 mk
.s
[1] = obj
.scale
[2]
162 mk
.s
[2] = obj
.scale
[1]
163 mk
.name
= obj
.name
.encode('utf-8')
166 header
.marker_count
+= 1
168 elif obj
.type == 'MESH':
169 dgraph
= bpy
.context
.evaluated_depsgraph_get()
170 data
= obj
.evaluated_get(dgraph
).data
171 data
.calc_loop_triangles()
172 data
.calc_normals_split()
175 sm
.indice_start
= header
.indice_count
176 sm
.vertex_start
= header
.vertex_count
177 sm
.vertex_count
= len(data
.vertices
)
178 sm
.indice_count
= len(data
.loop_triangles
)*3
180 sm
.pivot
[0] = obj
.matrix_world
.translation
[0]
181 sm
.pivot
[1] = obj
.matrix_world
.translation
[2]
182 sm
.pivot
[2] = -obj
.matrix_world
.translation
[1]
185 sm
.bbx
[0][i
] = 999999
186 sm
.bbx
[1][i
] = -999999
188 if F
"{obj.name}.sdf_cone" in bpy
.data
.objects
:
189 cone
= bpy
.data
.objects
[F
"{obj.name}.sdf_cone"]
190 sm
.sdf
.origin
[0] = cone
.location
[0]
191 sm
.sdf
.origin
[1] = cone
.location
[2] + cone
.scale
[1]*2.0
192 sm
.sdf
.origin
[2] = -cone
.location
[1]
193 sm
.sdf
.origin
[3] = 0.0
196 la
= cone
.scale
[1]*2.0
197 lh
= math
.sqrt(lo
*lo
+la
*la
)
201 sm
.sdf
.info
[2] = lo
/lh
202 sm
.sdf
.info
[3] = la
/lh
206 sm
.name
= obj
.name
.encode('utf-8')
208 for vert
in data
.vertices
:
212 v
.co
[2] = -vert
.co
[1]
220 sm
.bbx
[0][i
] = min( sm
.bbx
[0][i
], v
.co
[i
] )
221 sm
.bbx
[1][i
] = max( sm
.bbx
[1][i
], v
.co
[i
] )
224 pvert
= vertex_buffer
[l
.vertex_index
+ sm
.vertex_start
]
226 pvert
.norm
[0] = norm
[0]
227 pvert
.norm
[1] = norm
[2]
228 pvert
.norm
[2] = -norm
[1]
230 #if data.vertex_colors:
231 # colour = data.vertex_colors.active.data[ l.index ].color
232 # pvert.colour[0] = colour[0]
235 uv
= data
.uv_layers
.active
.data
[ l
.index
].uv
239 for tri
in data
.loop_triangles
:
240 indice_buffer
+= [c_uint32(tri
.vertices
[_
]) for _
in range(3)]
243 header
.layer_count
+= 1
244 header
.vertex_count
+= sm
.vertex_count
245 header
.indice_count
+= sm
.indice_count
247 fp
.write( bytearray( header
) )
249 fp
.write( bytearray(l
) )
251 fp
.write( bytearray(m
) )
252 for v
in vertex_buffer
:
253 fp
.write( bytearray(v
) )
254 for i
in indice_buffer
:
255 fp
.write( bytearray(i
) )
259 for col
in bpy
.data
.collections
["export"].children
:
260 write_model( col
.name
)