Character customization fixes
This commit is contained in:
66
proto2/characters/dna_tool.gd
Normal file
66
proto2/characters/dna_tool.gd
Normal file
@@ -0,0 +1,66 @@
|
||||
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
|
||||
Reference in New Issue
Block a user