67 lines
2.7 KiB
GDScript
67 lines
2.7 KiB
GDScript
extends Reference
|
|
class_name DNATool
|
|
|
|
var min_point = Vector3()
|
|
var max_point = Vector3()
|
|
var min_normal = Vector3()
|
|
var max_normal = Vector3()
|
|
|
|
func find_min_max(mesh: ArrayMesh):
|
|
var shape_arrays = mesh.surface_get_blend_shape_arrays(0)
|
|
var surf_arrays = mesh.surface_get_arrays(0)
|
|
if min_point.length() == 0.0:
|
|
min_point = shape_arrays[0][ArrayMesh.ARRAY_VERTEX][0] - surf_arrays[ArrayMesh.ARRAY_VERTEX][0]
|
|
if min_normal.length() == 0.0:
|
|
min_normal = shape_arrays[0][ArrayMesh.ARRAY_NORMAL][0] - surf_arrays[ArrayMesh.ARRAY_NORMAL][0]
|
|
if max_point.length() == 0.0:
|
|
max_point = shape_arrays[0][ArrayMesh.ARRAY_VERTEX][0] - surf_arrays[ArrayMesh.ARRAY_VERTEX][0]
|
|
if max_normal.length() == 0.0:
|
|
max_point = shape_arrays[0][ArrayMesh.ARRAY_NORMAL][0] - surf_arrays[ArrayMesh.ARRAY_NORMAL][0]
|
|
for sc in range(mesh.get_surface_count()):
|
|
var bshapes: Array = mesh.surface_get_blend_shape_arrays(sc).duplicate(true)
|
|
var arrays: Array = mesh.surface_get_arrays(sc).duplicate(true)
|
|
for src in bshapes:
|
|
for index in range(arrays[ArrayMesh.ARRAY_VERTEX].size()):
|
|
var v: Vector3 = src[ArrayMesh.ARRAY_VERTEX][index] - arrays[ArrayMesh.ARRAY_VERTEX][index]
|
|
var n: Vector3 = src[ArrayMesh.ARRAY_NORMAL][index] - arrays[ArrayMesh.ARRAY_NORMAL][index]
|
|
for ipos in range(3):
|
|
if min_point[ipos] > v[ipos]:
|
|
min_point[ipos] = v[ipos]
|
|
if max_point[ipos] < v[ipos]:
|
|
max_point[ipos] = v[ipos]
|
|
if min_normal[ipos] > n[ipos]:
|
|
min_normal[ipos] = n[ipos]
|
|
if max_normal[ipos] < n[ipos]:
|
|
max_normal[ipos] = n[ipos]
|
|
print("mesh: ", mesh.resource_name, "/", mesh, "min: ", min_point, "max: ", max_point)
|
|
|
|
func get_cd():
|
|
return max_point - min_point
|
|
|
|
func get_ncd():
|
|
return max_normal - min_normal
|
|
|
|
func save_viewport(v: Viewport, maps: Dictionary, shape_name: String, rect: Rect2, draw_normals: bool):
|
|
var viewport: Viewport = v
|
|
# viewport.set_clear_mode(Viewport.CLEAR_MODE_ONLY_NEXT_FRAME)
|
|
# yield(viewport.get_tree(), "idle_frame")
|
|
# yield(viewport.get_tree(), "idle_frame")
|
|
var vtex : = viewport.get_texture()
|
|
var tex_img : = vtex.get_data()
|
|
# tex_img.flip_y()
|
|
var fn = ""
|
|
if !maps.has(shape_name):
|
|
maps[shape_name] = {}
|
|
maps[shape_name].width = tex_img.get_width()
|
|
maps[shape_name].height = tex_img.get_height()
|
|
maps[shape_name].format = tex_img.get_format()
|
|
var byte_data = tex_img.duplicate(true).get_data()
|
|
var image_size = byte_data.size()
|
|
if draw_normals:
|
|
maps[shape_name].image_normal_data = byte_data.compress(File.COMPRESSION_FASTLZ)
|
|
maps[shape_name].image_normal_size = image_size
|
|
else:
|
|
maps[shape_name].image_data = byte_data.compress(File.COMPRESSION_FASTLZ)
|
|
maps[shape_name].rect = rect.grow(0.003)
|
|
maps[shape_name].image_size = image_size
|