Character customization fixes
This commit is contained in:
@@ -123,7 +123,7 @@ func modify_mesh(orig_mesh: ArrayMesh, v_indices: Dictionary) -> ArrayMesh:
|
|||||||
var offsetn: Color = maps[k].image_normal.get_pixelv(pos)
|
var offsetn: Color = maps[k].image_normal.get_pixelv(pos)
|
||||||
var pdiff: Vector3 = Vector3(offset.r, offset.g, offset.b)
|
var pdiff: Vector3 = Vector3(offset.r, offset.g, offset.b)
|
||||||
var ndiff: Vector3 = Vector3(offsetn.r, offsetn.g, offsetn.b)
|
var ndiff: Vector3 = Vector3(offsetn.r, offsetn.g, offsetn.b)
|
||||||
for u in range(2):
|
for u in range(3):
|
||||||
diff[u] = range_lerp(pdiff[u], 0.0, 1.0, min_point[u], max_point[u]) * maps[k].value
|
diff[u] = range_lerp(pdiff[u], 0.0, 1.0, min_point[u], max_point[u]) * maps[k].value
|
||||||
diffn[u] = range_lerp(ndiff[u], 0.0, 1.0, min_normal[u], max_normal[u]) * maps[k].value
|
diffn[u] = range_lerp(ndiff[u], 0.0, 1.0, min_normal[u], max_normal[u]) * maps[k].value
|
||||||
if abs(diff[u]) < 0.0001:
|
if abs(diff[u]) < 0.0001:
|
||||||
|
|||||||
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
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
extends ColorRect
|
extends ColorRect
|
||||||
|
signal drawing_finished
|
||||||
|
|
||||||
const TEX_SIZE = 512
|
const TEX_SIZE = 512
|
||||||
var triangles : Array = []
|
var triangles : Array = []
|
||||||
@@ -24,3 +25,6 @@ func _draw():
|
|||||||
colors.push_back(Color(k.shape.x, k.shape.y, k.shape.z, 1))
|
colors.push_back(Color(k.shape.x, k.shape.y, k.shape.z, 1))
|
||||||
uvs.push_back(k.uv * TEX_SIZE)
|
uvs.push_back(k.uv * TEX_SIZE)
|
||||||
draw_polygon(PoolVector2Array(uvs), PoolColorArray(colors))
|
draw_polygon(PoolVector2Array(uvs), PoolColorArray(colors))
|
||||||
|
yield(get_tree(), "idle_frame")
|
||||||
|
yield(get_tree(), "idle_frame")
|
||||||
|
emit_signal("drawing_finished")
|
||||||
|
|||||||
@@ -1,13 +1,10 @@
|
|||||||
extends Control
|
extends Control
|
||||||
|
|
||||||
const TEX_SIZE: int = 512
|
const TEX_SIZE: int = 512
|
||||||
var min_point = Vector3()
|
|
||||||
var max_point = Vector3()
|
|
||||||
var min_normal = Vector3()
|
|
||||||
var max_normal = Vector3()
|
|
||||||
var maps = {}
|
var maps = {}
|
||||||
var vert_indices = {}
|
var vert_indices = {}
|
||||||
var draw_data_list : = []
|
var draw_data_list : = []
|
||||||
|
var dnatool: DNATool
|
||||||
|
|
||||||
onready var characters = [load("res://characters/female_2018.escn"), load("res://characters/male_2018.escn")]
|
onready var characters = [load("res://characters/female_2018.escn"), load("res://characters/male_2018.escn")]
|
||||||
|
|
||||||
@@ -42,26 +39,6 @@ func find_same_verts():
|
|||||||
if !ok:
|
if !ok:
|
||||||
vert_indices[chdata][v1] = [index1]
|
vert_indices[chdata][v1] = [index1]
|
||||||
|
|
||||||
func find_min_max(mesh: ArrayMesh):
|
|
||||||
min_point = mesh.surface_get_blend_shape_arrays(0)[0][ArrayMesh.ARRAY_VERTEX][0] - mesh.surface_get_arrays(0)[ArrayMesh.ARRAY_VERTEX][0]
|
|
||||||
max_point = mesh.surface_get_blend_shape_arrays(0)[0][ArrayMesh.ARRAY_VERTEX][0] - mesh.surface_get_arrays(0)[ArrayMesh.ARRAY_VERTEX][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("min: ", min_point, "max: ", max_point)
|
|
||||||
static func check_triangle(verts: Array) -> bool:
|
static func check_triangle(verts: Array) -> bool:
|
||||||
var uv1 = verts[0].uv
|
var uv1 = verts[0].uv
|
||||||
var uv2 = verts[1].uv
|
var uv2 = verts[1].uv
|
||||||
@@ -245,26 +222,28 @@ static func _pad_morphs(morphs: Dictionary, nshapes: Dictionary, min_point: Vect
|
|||||||
var ew = morphs[mesh][m][t][v].shape[s][u] * cd + min_point[u]
|
var ew = morphs[mesh][m][t][v].shape[s][u] * cd + min_point[u]
|
||||||
assert abs(ew - d) < 0.001
|
assert abs(ew - d) < 0.001
|
||||||
morphs[mesh][m][t][v].normal[s][u] = (morphs[mesh][m][t][v].normal[s][u] - min_normal[u]) / ncd
|
morphs[mesh][m][t][v].normal[s][u] = (morphs[mesh][m][t][v].normal[s][u] - min_normal[u]) / ncd
|
||||||
func build_queue():
|
#func build_queue():
|
||||||
var scene_data : = {}
|
# var scene_data : = {}
|
||||||
for scene_no in range(common.size()):
|
# for scene_no in range(common.size()):
|
||||||
var ch: Node = common[scene_no].instance()
|
# var ch: Node = common[scene_no].instance()
|
||||||
var helper_data : = {}
|
# var helper_data : = {}
|
||||||
for mesh_name in ["base", "robe_helper", "tights_helper", "skirt_helper"]:
|
# for mesh_name in ["base", "robe_helper", "tights_helper", "skirt_helper"]:
|
||||||
helper_data[mesh_name] = {}
|
# helper_data[mesh_name] = {}
|
||||||
var mi: MeshInstance = find_mesh_name(ch, mesh_name)
|
# var mi: MeshInstance = find_mesh_name(ch, mesh_name)
|
||||||
var mesh: ArrayMesh = mi.mesh
|
# var mesh: ArrayMesh = mi.mesh
|
||||||
var morph_list = get_shape_names(mesh)
|
# var morph_list = get_shape_names(mesh)
|
||||||
var helper_shapes : = PoolStringArray()
|
# var helper_shapes : = PoolStringArray()
|
||||||
for e in morph_list:
|
# for e in morph_list:
|
||||||
if !e in helper_shapes:
|
# if !e in helper_shapes:
|
||||||
helper_shapes.push_back(e)
|
# helper_shapes.push_back(e)
|
||||||
find_min_max(mesh)
|
# dnatool.find_min_max(mesh)
|
||||||
helper_data[mesh_name].shape_list = helper_shapes
|
# helper_data[mesh_name].shape_list = helper_shapes
|
||||||
helper_data[mesh_name].morph_data = _process_morph_meshes(mesh)
|
# helper_data[mesh_name].morph_data = _process_morph_meshes(mesh)
|
||||||
scene_data[scene_no] = helper_data
|
# scene_data[scene_no] = helper_data
|
||||||
|
|
||||||
func _ready():
|
func _ready():
|
||||||
|
dnatool = DNATool.new()
|
||||||
|
$gen/drawable.connect("drawing_finished", self, "handle_drawing_finished", [$gen])
|
||||||
var morphs = {}
|
var morphs = {}
|
||||||
var morphs_helper = {}
|
var morphs_helper = {}
|
||||||
var mesh_data = {}
|
var mesh_data = {}
|
||||||
@@ -274,7 +253,7 @@ func _ready():
|
|||||||
var rects_helper = {}
|
var rects_helper = {}
|
||||||
var nshapes_helper = {}
|
var nshapes_helper = {}
|
||||||
load_data()
|
load_data()
|
||||||
build_queue()
|
# build_queue()
|
||||||
var base_shapes : = PoolStringArray()
|
var base_shapes : = PoolStringArray()
|
||||||
var file_shapes = {}
|
var file_shapes = {}
|
||||||
for mesh_no in range(common.size()):
|
for mesh_no in range(common.size()):
|
||||||
@@ -306,14 +285,14 @@ func _ready():
|
|||||||
var mesh: ArrayMesh = mi.mesh
|
var mesh: ArrayMesh = mi.mesh
|
||||||
if !mesh:
|
if !mesh:
|
||||||
return
|
return
|
||||||
find_min_max(mesh)
|
dnatool.find_min_max(mesh)
|
||||||
if !morphs.has(mesh_no):
|
if !morphs.has(mesh_no):
|
||||||
morphs[mesh_no] = {}
|
morphs[mesh_no] = {}
|
||||||
mesh_data[mesh_no] = {}
|
mesh_data[mesh_no] = {}
|
||||||
nshapes[mesh_no] = {}
|
nshapes[mesh_no] = {}
|
||||||
rects[mesh_no] = {}
|
rects[mesh_no] = {}
|
||||||
process_morph_meshes(mesh, morphs[mesh_no], rects[mesh_no], mesh_data[mesh_no], nshapes[mesh_no])
|
process_morph_meshes(mesh, morphs[mesh_no], rects[mesh_no], mesh_data[mesh_no], nshapes[mesh_no])
|
||||||
pad_morphs(morphs, nshapes, min_point, max_point, min_normal, max_normal)
|
pad_morphs(morphs, nshapes, dnatool.min_point, dnatool.max_point, dnatool.min_normal, dnatool.max_normal)
|
||||||
var draw_data: Dictionary = {}
|
var draw_data: Dictionary = {}
|
||||||
fill_draw_data(morphs, draw_data, mesh_data, nshapes, rects)
|
fill_draw_data(morphs, draw_data, mesh_data, nshapes, rects)
|
||||||
draw_data_list.push_back(draw_data)
|
draw_data_list.push_back(draw_data)
|
||||||
@@ -330,7 +309,7 @@ func _ready():
|
|||||||
mesh_data_helper[mesh_no] = {}
|
mesh_data_helper[mesh_no] = {}
|
||||||
nshapes_helper[mesh_no] = {}
|
nshapes_helper[mesh_no] = {}
|
||||||
process_morph_meshes(mesh, morphs_helper[mesh_no], rects_helper[mesh_no], mesh_data_helper[mesh_no], nshapes_helper[mesh_no])
|
process_morph_meshes(mesh, morphs_helper[mesh_no], rects_helper[mesh_no], mesh_data_helper[mesh_no], nshapes_helper[mesh_no])
|
||||||
pad_morphs(morphs_helper, nshapes_helper, min_point, max_point, min_normal, max_normal)
|
pad_morphs(morphs_helper, nshapes_helper, dnatool.min_point, dnatool.max_point, dnatool.min_normal, dnatool.max_normal)
|
||||||
var helper_draw_data: Dictionary = {}
|
var helper_draw_data: Dictionary = {}
|
||||||
fill_draw_data(morphs_helper, helper_draw_data, mesh_data_helper, nshapes, rects_helper)
|
fill_draw_data(morphs_helper, helper_draw_data, mesh_data_helper, nshapes, rects_helper)
|
||||||
draw_data_list.push_back(helper_draw_data)
|
draw_data_list.push_back(helper_draw_data)
|
||||||
@@ -343,8 +322,8 @@ func _ready():
|
|||||||
# draw_data_list.push_back(draw_data_helper)
|
# draw_data_list.push_back(draw_data_helper)
|
||||||
print("data count: ", draw_data.keys(), " ", draw_data[0].keys())
|
print("data count: ", draw_data.keys(), " ", draw_data[0].keys())
|
||||||
$gen/drawable.triangles = draw_data[0][0].triangles
|
$gen/drawable.triangles = draw_data[0][0].triangles
|
||||||
$gen/drawable.min_point = min_point
|
$gen/drawable.min_point = dnatool.min_point
|
||||||
$gen/drawable.max_point = max_point
|
$gen/drawable.max_point = dnatool.max_point
|
||||||
$gen/drawable.normals = false
|
$gen/drawable.normals = false
|
||||||
# print("done ", mesh.get_surface_count(), " ", mesh.get_blend_shape_count(), " ", min_point, " ", max_point, " added: ", ntriangles, " skipped: ", skipped)
|
# print("done ", mesh.get_surface_count(), " ", mesh.get_blend_shape_count(), " ", min_point, " ", max_point, " added: ", ntriangles, " skipped: ", skipped)
|
||||||
var helper : = 0
|
var helper : = 0
|
||||||
@@ -352,25 +331,28 @@ var surface : = 0
|
|||||||
var shape : = 0
|
var shape : = 0
|
||||||
var exit_delay : = 3.0
|
var exit_delay : = 3.0
|
||||||
var draw_delay : = 2.0
|
var draw_delay : = 2.0
|
||||||
func save_viewport(shape_name: String, rect: Rect2):
|
#func save_viewport(v: Viewport, maplist: Dictionary, shape_name: String, rect: Rect2, normals: bool):
|
||||||
var viewport: Viewport = $gen
|
## v.set_clear_mode(Viewport.CLEAR_MODE_ONLY_NEXT_FRAME)
|
||||||
var vtex : = viewport.get_texture()
|
## yield(get_tree(), "idle_frame")
|
||||||
var tex_img : = vtex.get_data()
|
## yield(get_tree(), "idle_frame")
|
||||||
var fn = ""
|
# var viewport: Viewport = v
|
||||||
if !maps.has(shape_name):
|
# var vtex : = viewport.get_texture()
|
||||||
maps[shape_name] = {}
|
# var tex_img : = vtex.get_data()
|
||||||
maps[shape_name].width = tex_img.get_width()
|
# var fn = ""
|
||||||
maps[shape_name].height = tex_img.get_height()
|
# if !maplist.has(shape_name):
|
||||||
maps[shape_name].format = tex_img.get_format()
|
# maplist[shape_name] = {}
|
||||||
var byte_data = tex_img.duplicate(true).get_data()
|
# maplist[shape_name].width = tex_img.get_width()
|
||||||
var image_size = byte_data.size()
|
# maplist[shape_name].height = tex_img.get_height()
|
||||||
if $gen/drawable.normals:
|
# maplist[shape_name].format = tex_img.get_format()
|
||||||
maps[shape_name].image_normal_data = byte_data.compress(File.COMPRESSION_FASTLZ)
|
# var byte_data = tex_img.duplicate(true).get_data()
|
||||||
maps[shape_name].image_normal_size = image_size
|
# var image_size = byte_data.size()
|
||||||
else:
|
# if normals:
|
||||||
maps[shape_name].image_data = byte_data.compress(File.COMPRESSION_FASTLZ)
|
# maplist[shape_name].image_normal_data = byte_data.compress(File.COMPRESSION_FASTLZ)
|
||||||
maps[shape_name].rect = rect.grow(0.003)
|
# maplist[shape_name].image_normal_size = image_size
|
||||||
maps[shape_name].image_size = image_size
|
# else:
|
||||||
|
# maplist[shape_name].image_data = byte_data.compress(File.COMPRESSION_FASTLZ)
|
||||||
|
# maplist[shape_name].rect = rect.grow(0.003)
|
||||||
|
# maplist[shape_name].image_size = image_size
|
||||||
|
|
||||||
var helpers_prefix = ["", "robe_", "tights_", "skirt_"]
|
var helpers_prefix = ["", "robe_", "tights_", "skirt_"]
|
||||||
func finish_map_gen():
|
func finish_map_gen():
|
||||||
@@ -378,13 +360,14 @@ func finish_map_gen():
|
|||||||
find_same_verts()
|
find_same_verts()
|
||||||
var fd = File.new()
|
var fd = File.new()
|
||||||
fd.open("res://characters/common/config.bin", File.WRITE)
|
fd.open("res://characters/common/config.bin", File.WRITE)
|
||||||
fd.store_var(min_point)
|
fd.store_var(dnatool.min_point)
|
||||||
fd.store_var(max_point)
|
fd.store_var(dnatool.max_point)
|
||||||
fd.store_var(min_normal)
|
fd.store_var(dnatool.min_normal)
|
||||||
fd.store_var(max_normal)
|
fd.store_var(dnatool.max_normal)
|
||||||
fd.store_var(maps)
|
fd.store_var(maps)
|
||||||
fd.store_var(vert_indices)
|
fd.store_var(vert_indices)
|
||||||
fd.close()
|
fd.close()
|
||||||
|
save_images()
|
||||||
get_tree().quit()
|
get_tree().quit()
|
||||||
# get_tree().change_scene("res://map_test.tscn")
|
# get_tree().change_scene("res://map_test.tscn")
|
||||||
func next_surface():
|
func next_surface():
|
||||||
@@ -404,13 +387,46 @@ func next_helper():
|
|||||||
func setup_draw():
|
func setup_draw():
|
||||||
$gen/drawable.normals = !$gen/drawable.normals
|
$gen/drawable.normals = !$gen/drawable.normals
|
||||||
if $gen/drawable.normals:
|
if $gen/drawable.normals:
|
||||||
$gen/drawable.min_point = min_normal
|
$gen/drawable.min_point = dnatool.min_normal
|
||||||
$gen/drawable.max_point = max_normal
|
$gen/drawable.max_point = dnatool.max_normal
|
||||||
else:
|
else:
|
||||||
$gen/drawable.min_point = min_point
|
$gen/drawable.min_point = dnatool.min_point
|
||||||
$gen/drawable.max_point = max_point
|
$gen/drawable.max_point = dnatool.max_point
|
||||||
$gen/drawable.triangles = draw_data_list[helper][surface][shape].triangles
|
$gen/drawable.triangles = draw_data_list[helper][surface][shape].triangles
|
||||||
$gen/drawable.update()
|
$gen/drawable.update()
|
||||||
|
|
||||||
|
func save_images():
|
||||||
|
for k in maps.keys():
|
||||||
|
for e in ["diffuse", "normal"]:
|
||||||
|
var fn = "res://characters/common/" + k + "_" + e + "_orig.png"
|
||||||
|
var data: PoolByteArray
|
||||||
|
var size: int
|
||||||
|
if e == "diffuse":
|
||||||
|
data = maps[k].image_data
|
||||||
|
size = maps[k].image_size
|
||||||
|
elif e == "normal":
|
||||||
|
data = maps[k].image_normal_data
|
||||||
|
size = maps[k].image_normal_size
|
||||||
|
var image_data = data.decompress(size, File.COMPRESSION_FASTLZ)
|
||||||
|
var img = Image.new()
|
||||||
|
img.create_from_data(maps[k].width, maps[k].height, false, maps[k].format, image_data)
|
||||||
|
print("saving ", fn)
|
||||||
|
img.save_png(fn)
|
||||||
|
var fd = File.new()
|
||||||
|
var outj = {}
|
||||||
|
outj.min_point = dnatool.min_point
|
||||||
|
outj.max_point = dnatool.max_point
|
||||||
|
outj.min_normal = dnatool.min_normal
|
||||||
|
outj.max_normal = dnatool.max_normal
|
||||||
|
outj.maps = maps
|
||||||
|
outj.vert_indices = vert_indices
|
||||||
|
fd.open("res://characters/common/debug-data-orig.json", File.WRITE)
|
||||||
|
fd.store_string(JSON.print(outj, "\t", true))
|
||||||
|
fd.close()
|
||||||
|
|
||||||
|
func handle_drawing_finished(viewport):
|
||||||
|
print_debug("drawing finished")
|
||||||
|
|
||||||
func _process(delta):
|
func _process(delta):
|
||||||
if surface == draw_data_list[helper].size():
|
if surface == draw_data_list[helper].size():
|
||||||
if exit_delay > 0:
|
if exit_delay > 0:
|
||||||
@@ -426,7 +442,8 @@ func _process(delta):
|
|||||||
if draw_delay > 0:
|
if draw_delay > 0:
|
||||||
draw_delay -= delta
|
draw_delay -= delta
|
||||||
else:
|
else:
|
||||||
save_viewport(helpers_prefix[helper] + draw_data_list[helper][surface][shape].name, draw_data_list[helper][surface][shape].rect)
|
dnatool.save_viewport($gen, maps, helpers_prefix[helper] + draw_data_list[helper][surface][shape].name, draw_data_list[helper][surface][shape].rect, $gen/drawable.normals)
|
||||||
|
# save_viewport($gen, maps, helpers_prefix[helper] + draw_data_list[helper][surface][shape].name, draw_data_list[helper][surface][shape].rect, $gen/drawable.normals)
|
||||||
if $gen/drawable.normals:
|
if $gen/drawable.normals:
|
||||||
shape += 1
|
shape += 1
|
||||||
draw_delay = 1.0
|
draw_delay = 1.0
|
||||||
|
|||||||
@@ -1,12 +1,10 @@
|
|||||||
extends Control
|
extends Control
|
||||||
|
signal draw_finished
|
||||||
|
|
||||||
var common = []
|
var common = []
|
||||||
var common_path = "characters/common"
|
var common_path = "characters/common"
|
||||||
|
|
||||||
var min_point = Vector3()
|
var dnatool: DNATool
|
||||||
var max_point = Vector3()
|
|
||||||
var min_normal = Vector3()
|
|
||||||
var max_normal = Vector3()
|
|
||||||
|
|
||||||
const TEX_SIZE: int = 512
|
const TEX_SIZE: int = 512
|
||||||
|
|
||||||
@@ -59,34 +57,6 @@ func get_mesh(base: Node, mesh_name: String) -> ArrayMesh:
|
|||||||
queue.push_back(c)
|
queue.push_back(c)
|
||||||
return mesh
|
return mesh
|
||||||
|
|
||||||
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("min: ", min_point, "max: ", max_point)
|
|
||||||
|
|
||||||
static func check_triangle(verts: Array, vs: Array, ns: Array) -> bool:
|
static func check_triangle(verts: Array, vs: Array, ns: Array) -> bool:
|
||||||
var uv1 = verts[0]
|
var uv1 = verts[0]
|
||||||
@@ -108,17 +78,18 @@ static func check_triangle(verts: Array, vs: Array, ns: Array) -> bool:
|
|||||||
|
|
||||||
func compress_points(v: PoolVector3Array, vmin: Vector3, vmax: Vector3) -> PoolVector3Array:
|
func compress_points(v: PoolVector3Array, vmin: Vector3, vmax: Vector3) -> PoolVector3Array:
|
||||||
var cd = vmax - vmin
|
var cd = vmax - vmin
|
||||||
var ret: PoolVector3Array = v
|
var ret: PoolVector3Array = PoolVector3Array(v)
|
||||||
for e in range(v.size()):
|
for e in range(v.size()):
|
||||||
ret[e] = v[e] - vmin
|
|
||||||
for h in range(3):
|
for h in range(3):
|
||||||
ret[e][h] = ret[e][h] / cd[h]
|
assert cd[h] > 0.0
|
||||||
|
ret[e][h] = (v[e][h] - vmin[h]) / cd[h]
|
||||||
|
assert ret[e][h] <= 1.0 && ret[e][h] >= 0.0
|
||||||
return ret
|
return ret
|
||||||
func build_triangles(mesh: ArrayMesh, diffmap: Dictionary):
|
func build_triangles(mesh: ArrayMesh, diffmap: Dictionary):
|
||||||
assert mesh
|
assert mesh
|
||||||
assert max_point != min_point
|
assert dnatool.max_point != dnatool.min_point
|
||||||
var cd = max_point - min_point
|
var cd = dnatool.max_point - dnatool.min_point
|
||||||
var ncd = max_normal - min_normal
|
var ncd = dnatool.max_normal - dnatool.min_normal
|
||||||
for sc in range(mesh.get_surface_count()):
|
for sc in range(mesh.get_surface_count()):
|
||||||
var shape_arrays = mesh.surface_get_blend_shape_arrays(sc)
|
var shape_arrays = mesh.surface_get_blend_shape_arrays(sc)
|
||||||
var surf_arrays = mesh.surface_get_arrays(sc)
|
var surf_arrays = mesh.surface_get_arrays(sc)
|
||||||
@@ -130,8 +101,8 @@ func build_triangles(mesh: ArrayMesh, diffmap: Dictionary):
|
|||||||
diffmap[bs_name].shape_v = []
|
diffmap[bs_name].shape_v = []
|
||||||
diffmap[bs_name].triangles = []
|
diffmap[bs_name].triangles = []
|
||||||
diffmap[bs_name].triangles_uv = []
|
diffmap[bs_name].triangles_uv = []
|
||||||
diffmap[bs_name].triangles_v = PoolVector3Array()
|
diffmap[bs_name].triangles_v = []
|
||||||
diffmap[bs_name].triangles_n = PoolVector3Array()
|
diffmap[bs_name].triangles_n = []
|
||||||
for vid in range(0, surf_arrays[ArrayMesh.ARRAY_INDEX].size(), 3):
|
for vid in range(0, surf_arrays[ArrayMesh.ARRAY_INDEX].size(), 3):
|
||||||
var p1_index = surf_arrays[ArrayMesh.ARRAY_INDEX][vid + 0]
|
var p1_index = surf_arrays[ArrayMesh.ARRAY_INDEX][vid + 0]
|
||||||
var p2_index = surf_arrays[ArrayMesh.ARRAY_INDEX][vid + 1]
|
var p2_index = surf_arrays[ArrayMesh.ARRAY_INDEX][vid + 1]
|
||||||
@@ -161,8 +132,8 @@ func build_triangles(mesh: ArrayMesh, diffmap: Dictionary):
|
|||||||
var triangle_uv = [p1, p2, p3]
|
var triangle_uv = [p1, p2, p3]
|
||||||
# var triangle_v = compress_points([d1, d2, d3], min_point, max_point)
|
# var triangle_v = compress_points([d1, d2, d3], min_point, max_point)
|
||||||
# var triangle_n = compress_points([nd1, nd2, nd3], min_normal, max_normal)
|
# var triangle_n = compress_points([nd1, nd2, nd3], min_normal, max_normal)
|
||||||
var triangle_v = PoolVector3Array([d1, d2, d3])
|
var triangle_v = [d1, d2, d3]
|
||||||
var triangle_n = PoolVector3Array([nd1, nd2, nd3])
|
var triangle_n = [nd1, nd2, nd3]
|
||||||
if check_triangle(triangle_uv, triangle_v, triangle_n):
|
if check_triangle(triangle_uv, triangle_v, triangle_n):
|
||||||
diffmap[bs_name].triangles += triangle
|
diffmap[bs_name].triangles += triangle
|
||||||
diffmap[bs_name].base_v += [base_v1, base_v2, base_v3]
|
diffmap[bs_name].base_v += [base_v1, base_v2, base_v3]
|
||||||
@@ -176,7 +147,7 @@ func build_triangles(mesh: ArrayMesh, diffmap: Dictionary):
|
|||||||
func convert_triangles(base: Dictionary, helper: Dictionary):
|
func convert_triangles(base: Dictionary, helper: Dictionary):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
enum {STATE_DRAW, STATE_CHECK, STATE_FINISH}
|
enum {STATE_DRAW, STATE_CHECK, STATE_FINISH, STATE_IDLE}
|
||||||
|
|
||||||
var draw_queue = []
|
var draw_queue = []
|
||||||
|
|
||||||
@@ -195,6 +166,9 @@ func create_queue(diffmap: Dictionary):
|
|||||||
data.triangles_v = diffmap[k][map_name].triangles_v
|
data.triangles_v = diffmap[k][map_name].triangles_v
|
||||||
data.rect = diffmap[k][map_name].rect
|
data.rect = diffmap[k][map_name].rect
|
||||||
draw_queue.push_back(data)
|
draw_queue.push_back(data)
|
||||||
|
if data.map == "ankle_depth_minus":
|
||||||
|
print("ankle:t: ", diffmap[k][map_name].triangles_v)
|
||||||
|
print("ankle:tuc: ", diffmap[k][map_name].triangles_v_uc)
|
||||||
data = {}
|
data = {}
|
||||||
data.map = map_key
|
data.map = map_key
|
||||||
data.normals = true
|
data.normals = true
|
||||||
@@ -202,8 +176,11 @@ func create_queue(diffmap: Dictionary):
|
|||||||
data.triangles_v = diffmap[k][map_name].triangles_n
|
data.triangles_v = diffmap[k][map_name].triangles_n
|
||||||
data.rect = diffmap[k][map_name].rect
|
data.rect = diffmap[k][map_name].rect
|
||||||
draw_queue.push_back(data)
|
draw_queue.push_back(data)
|
||||||
|
# for k in data.triangles_v:
|
||||||
|
# print(k.z)
|
||||||
|
|
||||||
func _ready():
|
func _ready():
|
||||||
|
dnatool = DNATool.new()
|
||||||
load_data()
|
load_data()
|
||||||
var base_mesh = "base"
|
var base_mesh = "base"
|
||||||
var helper_meshes = ["robe_helper", "tights_helper", "skirt_helper"]
|
var helper_meshes = ["robe_helper", "tights_helper", "skirt_helper"]
|
||||||
@@ -212,7 +189,10 @@ func _ready():
|
|||||||
for mesh_name in [base_mesh] + helper_meshes:
|
for mesh_name in [base_mesh] + helper_meshes:
|
||||||
var obj = c.instance()
|
var obj = c.instance()
|
||||||
var mesh = get_mesh(obj, mesh_name)
|
var mesh = get_mesh(obj, mesh_name)
|
||||||
find_min_max(mesh)
|
dnatool.find_min_max(mesh)
|
||||||
|
var cd = dnatool.max_point - dnatool.min_point
|
||||||
|
var ncd = dnatool.max_normal - dnatool.min_normal
|
||||||
|
assert cd.x > 0.0 && cd.y > 0.0 && cd.z > 0.0
|
||||||
for c in common:
|
for c in common:
|
||||||
var obj = c.instance()
|
var obj = c.instance()
|
||||||
if !diffmap.has(base_mesh):
|
if !diffmap.has(base_mesh):
|
||||||
@@ -228,10 +208,15 @@ func _ready():
|
|||||||
convert_triangles(diffmap[base_mesh], diffmap[mesh_name])
|
convert_triangles(diffmap[base_mesh], diffmap[mesh_name])
|
||||||
print("scene: ", c, "mesh: ", mesh_name, " done")
|
print("scene: ", c, "mesh: ", mesh_name, " done")
|
||||||
print("scene: ", c, " done")
|
print("scene: ", c, " done")
|
||||||
|
print("min: point: ", dnatool.min_point, " normal: ", dnatool.min_normal)
|
||||||
|
print("max: point: ", dnatool.max_point, " normal: ", dnatool.max_normal)
|
||||||
|
print("cd: ", cd, " ncd: ", ncd)
|
||||||
for e in diffmap.keys():
|
for e in diffmap.keys():
|
||||||
for k in diffmap[e].keys():
|
for k in diffmap[e].keys():
|
||||||
diffmap[e][k].triangles_v = compress_points(diffmap[e][k].triangles_v, min_point, max_point)
|
diffmap[e][k].triangles_v_uc = diffmap[e][k].triangles_v
|
||||||
diffmap[e][k].triangles_n = compress_points(diffmap[e][k].triangles_n, min_point, max_point)
|
diffmap[e][k].triangles_n_uc = diffmap[e][k].triangles_n
|
||||||
|
diffmap[e][k].triangles_v = compress_points(PoolVector3Array(diffmap[e][k].triangles_v), dnatool.min_point, dnatool.max_point)
|
||||||
|
diffmap[e][k].triangles_n = compress_points(PoolVector3Array(diffmap[e][k].triangles_n), dnatool.min_normal, dnatool.max_normal)
|
||||||
print_debug("mesh:", e, "shape: ", k, " triangle: ",
|
print_debug("mesh:", e, "shape: ", k, " triangle: ",
|
||||||
diffmap[e][k].triangles_uv.size() / 3)
|
diffmap[e][k].triangles_uv.size() / 3)
|
||||||
if diffmap[e][k].triangles_uv.size() > 0:
|
if diffmap[e][k].triangles_uv.size() > 0:
|
||||||
@@ -247,32 +232,11 @@ func _ready():
|
|||||||
print("prep done, ", draw_queue.size())
|
print("prep done, ", draw_queue.size())
|
||||||
$gen/drawable.connect("draw", self, "draw_viewport")
|
$gen/drawable.connect("draw", self, "draw_viewport")
|
||||||
total_count = draw_queue.size()
|
total_count = draw_queue.size()
|
||||||
|
$gen_maps/ProgressBar.value = 0.0
|
||||||
|
connect("draw_finished", self, "draw_finished")
|
||||||
|
|
||||||
var total_count : = 0
|
var total_count : = 0
|
||||||
|
|
||||||
func save_viewport(shape_name: String, rect: Rect2, draw_normals: bool):
|
|
||||||
var viewport: Viewport = $gen
|
|
||||||
viewport.set_clear_mode(Viewport.CLEAR_MODE_ONLY_NEXT_FRAME)
|
|
||||||
yield(get_tree(), "idle_frame")
|
|
||||||
yield(get_tree(), "idle_frame")
|
|
||||||
var vtex : = viewport.get_texture()
|
|
||||||
var tex_img : = vtex.get_data()
|
|
||||||
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
|
|
||||||
|
|
||||||
func draw_viewport():
|
func draw_viewport():
|
||||||
var draw_obj = $gen/drawable
|
var draw_obj = $gen/drawable
|
||||||
if draw_queue.size() == 0:
|
if draw_queue.size() == 0:
|
||||||
@@ -283,11 +247,11 @@ func draw_viewport():
|
|||||||
var _min_point: Vector3
|
var _min_point: Vector3
|
||||||
var _max_point: Vector3
|
var _max_point: Vector3
|
||||||
if item.normals:
|
if item.normals:
|
||||||
_min_point = min_normal
|
_min_point = dnatool.min_normal
|
||||||
_max_point = max_normal
|
_max_point = dnatool.max_normal
|
||||||
else:
|
else:
|
||||||
_min_point = min_point
|
_min_point = dnatool.min_point
|
||||||
_max_point = max_point
|
_max_point = dnatool.max_point
|
||||||
default_color.r = range_lerp(0, _min_point.x, _max_point.x, 0.0, 1.0)
|
default_color.r = range_lerp(0, _min_point.x, _max_point.x, 0.0, 1.0)
|
||||||
default_color.g = range_lerp(0, _min_point.y, _max_point.y, 0.0, 1.0)
|
default_color.g = range_lerp(0, _min_point.y, _max_point.y, 0.0, 1.0)
|
||||||
default_color.b = range_lerp(0, _min_point.z, _max_point.z, 0.0, 1.0)
|
default_color.b = range_lerp(0, _min_point.z, _max_point.z, 0.0, 1.0)
|
||||||
@@ -310,15 +274,21 @@ func draw_viewport():
|
|||||||
var pt = (uv - midp).normalized() * 3.5
|
var pt = (uv - midp).normalized() * 3.5
|
||||||
uvs.push_back(uv * TEX_SIZE + pt)
|
uvs.push_back(uv * TEX_SIZE + pt)
|
||||||
draw_obj.draw_polygon(PoolVector2Array(uvs), PoolColorArray(colors))
|
draw_obj.draw_polygon(PoolVector2Array(uvs), PoolColorArray(colors))
|
||||||
|
# print(colors)
|
||||||
|
yield(draw_obj.get_tree(), "idle_frame")
|
||||||
|
yield(draw_obj.get_tree(), "idle_frame")
|
||||||
|
yield(draw_obj.get_tree(), "idle_frame")
|
||||||
|
yield(draw_obj.get_tree(), "idle_frame")
|
||||||
|
emit_signal("draw_finished")
|
||||||
|
|
||||||
|
|
||||||
var _state = STATE_DRAW
|
var _state = STATE_DRAW
|
||||||
var draw_delay: float = 0.1
|
var draw_delay: float = 0.1
|
||||||
var save_pngs : = false
|
var save_pngs : = true
|
||||||
func save_images():
|
func save_images():
|
||||||
for k in maps.keys():
|
for k in maps.keys():
|
||||||
for e in ["diffuse", "normal"]:
|
for e in ["diffuse", "normal"]:
|
||||||
var fn = "res://characters/common/" + k + "_" + e + ".png"
|
var fn = "res://characters/common/" + k + "_" + e + "_new.png"
|
||||||
var data: PoolByteArray
|
var data: PoolByteArray
|
||||||
var size: int
|
var size: int
|
||||||
if e == "diffuse":
|
if e == "diffuse":
|
||||||
@@ -332,31 +302,55 @@ func save_images():
|
|||||||
img.create_from_data(maps[k].width, maps[k].height, false, maps[k].format, image_data)
|
img.create_from_data(maps[k].width, maps[k].height, false, maps[k].format, image_data)
|
||||||
print("saving ", fn)
|
print("saving ", fn)
|
||||||
img.save_png(fn)
|
img.save_png(fn)
|
||||||
|
var outj = {}
|
||||||
|
outj.min_point = dnatool.min_point
|
||||||
|
outj.max_point = dnatool.max_point
|
||||||
|
outj.min_normal = dnatool.min_normal
|
||||||
|
outj.max_normal = dnatool.max_normal
|
||||||
|
outj.maps = maps
|
||||||
|
outj.vert_indices = vert_indices
|
||||||
|
var fd = File.new()
|
||||||
|
fd.open("res://characters/common/debug-data-new.json", File.WRITE)
|
||||||
|
fd.store_string(JSON.print(outj, "\t", true))
|
||||||
|
fd.close()
|
||||||
|
|
||||||
|
func draw_finished():
|
||||||
|
print("draw_finished")
|
||||||
|
draw_delay += 0.01
|
||||||
|
_state = STATE_CHECK
|
||||||
|
|
||||||
func _process(delta):
|
func _process(delta):
|
||||||
match(_state):
|
match(_state):
|
||||||
|
STATE_IDLE:
|
||||||
|
pass
|
||||||
STATE_CHECK:
|
STATE_CHECK:
|
||||||
if draw_delay > 0.0:
|
if draw_delay > 0.0:
|
||||||
draw_delay -= delta
|
draw_delay -= delta
|
||||||
elif draw_queue.size() > 0:
|
|
||||||
save_viewport(draw_queue[0].map, draw_queue[0].rect, draw_queue[0].normals)
|
|
||||||
print("drawing complete: ", draw_queue.size())
|
|
||||||
draw_queue.pop_front()
|
|
||||||
_state = STATE_DRAW
|
|
||||||
else:
|
else:
|
||||||
_state = STATE_FINISH
|
print("drawing complete: ", draw_queue.size())
|
||||||
|
if draw_queue.size() > 0:
|
||||||
|
dnatool.save_viewport($gen, maps, draw_queue[0].map, draw_queue[0].rect, draw_queue[0].normals)
|
||||||
|
draw_queue.pop_front()
|
||||||
|
$gen_maps/ProgressBar.value = 50.0 + 50.0 * (1.0 - float(draw_queue.size()) / float(total_count))
|
||||||
|
if draw_queue.size() > 0:
|
||||||
|
_state = STATE_DRAW
|
||||||
|
else:
|
||||||
|
_state = STATE_FINISH
|
||||||
STATE_DRAW:
|
STATE_DRAW:
|
||||||
|
print("triggering draw ", draw_queue.size())
|
||||||
|
$gen.render_target_update_mode = Viewport.UPDATE_ONCE
|
||||||
$gen/drawable.update()
|
$gen/drawable.update()
|
||||||
draw_delay = 0.05
|
draw_delay += 0.01
|
||||||
_state = STATE_CHECK
|
_state = STATE_IDLE
|
||||||
STATE_FINISH:
|
STATE_FINISH:
|
||||||
print("generating same vert indices...")
|
print("generating same vert indices...")
|
||||||
find_same_verts()
|
find_same_verts()
|
||||||
var fd = File.new()
|
var fd = File.new()
|
||||||
fd.open("res://characters/common/config.bin", File.WRITE)
|
fd.open("res://characters/common/config.bin", File.WRITE)
|
||||||
fd.store_var(min_point)
|
fd.store_var(dnatool.min_point)
|
||||||
fd.store_var(max_point)
|
fd.store_var(dnatool.max_point)
|
||||||
fd.store_var(min_normal)
|
fd.store_var(dnatool.min_normal)
|
||||||
fd.store_var(max_normal)
|
fd.store_var(dnatool.max_normal)
|
||||||
fd.store_var(maps)
|
fd.store_var(maps)
|
||||||
fd.store_var(vert_indices)
|
fd.store_var(vert_indices)
|
||||||
fd.close()
|
fd.close()
|
||||||
|
|||||||
@@ -147,11 +147,13 @@ func update_slider(value: float, control: String, slider: HSlider):
|
|||||||
var modifier = ""
|
var modifier = ""
|
||||||
if value >= 0:
|
if value >= 0:
|
||||||
modifier = controls[control].plus
|
modifier = controls[control].plus
|
||||||
dna.set_modifier_value(controls[control].minus, 0.0)
|
if controls[control].has("minus"):
|
||||||
|
dna.set_modifier_value(controls[control].minus, 0.0)
|
||||||
else:
|
else:
|
||||||
value = -value
|
value = -value
|
||||||
modifier = controls[control].minus
|
modifier = controls[control].minus
|
||||||
dna.set_modifier_value(controls[control].plus, 0.0)
|
if controls[control].has("plus"):
|
||||||
|
dna.set_modifier_value(controls[control].plus, 0.0)
|
||||||
update_modifier(value, modifier)
|
update_modifier(value, modifier)
|
||||||
var ch: Node
|
var ch: Node
|
||||||
func rebuild_clothes_menu():
|
func rebuild_clothes_menu():
|
||||||
@@ -217,12 +219,12 @@ func _ready():
|
|||||||
var state : = 0
|
var state : = 0
|
||||||
func build_contols():
|
func build_contols():
|
||||||
for k in dna.get_modifier_list():
|
for k in dna.get_modifier_list():
|
||||||
if k.ends_with("_plus"):
|
if k.ends_with("_plus") && false:
|
||||||
var cname = k.replace("_plus", "")
|
var cname = k.replace("_plus", "")
|
||||||
if !controls.has(cname):
|
if !controls.has(cname):
|
||||||
controls[cname] = {}
|
controls[cname] = {}
|
||||||
controls[cname].plus = k
|
controls[cname].plus = k
|
||||||
elif k.ends_with("_minus"):
|
elif k.ends_with("_minus") && false:
|
||||||
var cname = k.replace("_minus", "")
|
var cname = k.replace("_minus", "")
|
||||||
if !controls.has(cname):
|
if !controls.has(cname):
|
||||||
controls[cname] = {}
|
controls[cname] = {}
|
||||||
@@ -245,7 +247,8 @@ func build_contols():
|
|||||||
var slider : = HSlider.new()
|
var slider : = HSlider.new()
|
||||||
slider.rect_min_size = Vector2(180, 30)
|
slider.rect_min_size = Vector2(180, 30)
|
||||||
print(controls[k])
|
print(controls[k])
|
||||||
if controls[k].plus && controls[k].minus:
|
|
||||||
|
if controls[k].has("minus") && controls[k].has("plus"):
|
||||||
slider.min_value = -100
|
slider.min_value = -100
|
||||||
slider.max_value = 100
|
slider.max_value = 100
|
||||||
else:
|
else:
|
||||||
|
|||||||
@@ -25,6 +25,11 @@ _global_script_classes=[ {
|
|||||||
"path": "res://characters/dna.gd"
|
"path": "res://characters/dna.gd"
|
||||||
}, {
|
}, {
|
||||||
"base": "Reference",
|
"base": "Reference",
|
||||||
|
"class": "DNATool",
|
||||||
|
"language": "GDScript",
|
||||||
|
"path": "res://characters/dna_tool.gd"
|
||||||
|
}, {
|
||||||
|
"base": "Reference",
|
||||||
"class": "GridRule",
|
"class": "GridRule",
|
||||||
"language": "GDScript",
|
"language": "GDScript",
|
||||||
"path": "res://growth_rules/grid.gd"
|
"path": "res://growth_rules/grid.gd"
|
||||||
@@ -58,6 +63,7 @@ _global_script_class_icons={
|
|||||||
"BallGameAI": "",
|
"BallGameAI": "",
|
||||||
"BallGameAI3D": "",
|
"BallGameAI3D": "",
|
||||||
"DNA": "",
|
"DNA": "",
|
||||||
|
"DNATool": "",
|
||||||
"GridRule": "",
|
"GridRule": "",
|
||||||
"Item": "",
|
"Item": "",
|
||||||
"Quest": "",
|
"Quest": "",
|
||||||
|
|||||||
Reference in New Issue
Block a user