From e65a9f9dbf04880c55e2fc3af84100e25bf48aff Mon Sep 17 00:00:00 2001 From: Segey Lapin Date: Thu, 22 Aug 2019 23:56:07 +0300 Subject: [PATCH] Character customization fixes --- proto2/characters/dna.gd | 2 +- proto2/characters/dna_tool.gd | 66 ++++++++++ proto2/characters/drawable.gd | 4 + proto2/characters/generate_maps.gd | 169 ++++++++++++++----------- proto2/characters/generate_maps2.gd | 168 ++++++++++++------------ proto2/characters/map_test/map_test.gd | 13 +- proto2/project.godot | 6 + 7 files changed, 259 insertions(+), 169 deletions(-) create mode 100644 proto2/characters/dna_tool.gd diff --git a/proto2/characters/dna.gd b/proto2/characters/dna.gd index 29db09d..7fb27be 100644 --- a/proto2/characters/dna.gd +++ b/proto2/characters/dna.gd @@ -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 pdiff: Vector3 = Vector3(offset.r, offset.g, offset.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 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: diff --git a/proto2/characters/dna_tool.gd b/proto2/characters/dna_tool.gd new file mode 100644 index 0000000..57c820c --- /dev/null +++ b/proto2/characters/dna_tool.gd @@ -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 diff --git a/proto2/characters/drawable.gd b/proto2/characters/drawable.gd index ff3e7f7..ae58a79 100644 --- a/proto2/characters/drawable.gd +++ b/proto2/characters/drawable.gd @@ -1,4 +1,5 @@ extends ColorRect +signal drawing_finished const TEX_SIZE = 512 var triangles : Array = [] @@ -24,3 +25,6 @@ func _draw(): colors.push_back(Color(k.shape.x, k.shape.y, k.shape.z, 1)) uvs.push_back(k.uv * TEX_SIZE) draw_polygon(PoolVector2Array(uvs), PoolColorArray(colors)) + yield(get_tree(), "idle_frame") + yield(get_tree(), "idle_frame") + emit_signal("drawing_finished") diff --git a/proto2/characters/generate_maps.gd b/proto2/characters/generate_maps.gd index e8e2502..b1c646d 100644 --- a/proto2/characters/generate_maps.gd +++ b/proto2/characters/generate_maps.gd @@ -1,13 +1,10 @@ extends Control const TEX_SIZE: int = 512 -var min_point = Vector3() -var max_point = Vector3() -var min_normal = Vector3() -var max_normal = Vector3() var maps = {} var vert_indices = {} var draw_data_list : = [] +var dnatool: DNATool 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: 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: var uv1 = verts[0].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] 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 -func build_queue(): - var scene_data : = {} - for scene_no in range(common.size()): - var ch: Node = common[scene_no].instance() - var helper_data : = {} - for mesh_name in ["base", "robe_helper", "tights_helper", "skirt_helper"]: - helper_data[mesh_name] = {} - var mi: MeshInstance = find_mesh_name(ch, mesh_name) - var mesh: ArrayMesh = mi.mesh - var morph_list = get_shape_names(mesh) - var helper_shapes : = PoolStringArray() - for e in morph_list: - if !e in helper_shapes: - helper_shapes.push_back(e) - find_min_max(mesh) - helper_data[mesh_name].shape_list = helper_shapes - helper_data[mesh_name].morph_data = _process_morph_meshes(mesh) - scene_data[scene_no] = helper_data +#func build_queue(): +# var scene_data : = {} +# for scene_no in range(common.size()): +# var ch: Node = common[scene_no].instance() +# var helper_data : = {} +# for mesh_name in ["base", "robe_helper", "tights_helper", "skirt_helper"]: +# helper_data[mesh_name] = {} +# var mi: MeshInstance = find_mesh_name(ch, mesh_name) +# var mesh: ArrayMesh = mi.mesh +# var morph_list = get_shape_names(mesh) +# var helper_shapes : = PoolStringArray() +# for e in morph_list: +# if !e in helper_shapes: +# helper_shapes.push_back(e) +# dnatool.find_min_max(mesh) +# helper_data[mesh_name].shape_list = helper_shapes +# helper_data[mesh_name].morph_data = _process_morph_meshes(mesh) +# scene_data[scene_no] = helper_data func _ready(): + dnatool = DNATool.new() + $gen/drawable.connect("drawing_finished", self, "handle_drawing_finished", [$gen]) var morphs = {} var morphs_helper = {} var mesh_data = {} @@ -274,7 +253,7 @@ func _ready(): var rects_helper = {} var nshapes_helper = {} load_data() - build_queue() +# build_queue() var base_shapes : = PoolStringArray() var file_shapes = {} for mesh_no in range(common.size()): @@ -306,14 +285,14 @@ func _ready(): var mesh: ArrayMesh = mi.mesh if !mesh: return - find_min_max(mesh) + dnatool.find_min_max(mesh) if !morphs.has(mesh_no): morphs[mesh_no] = {} mesh_data[mesh_no] = {} nshapes[mesh_no] = {} rects[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 = {} fill_draw_data(morphs, draw_data, mesh_data, nshapes, rects) draw_data_list.push_back(draw_data) @@ -330,7 +309,7 @@ func _ready(): 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 = {} fill_draw_data(morphs_helper, helper_draw_data, mesh_data_helper, nshapes, rects_helper) draw_data_list.push_back(helper_draw_data) @@ -343,8 +322,8 @@ func _ready(): # draw_data_list.push_back(draw_data_helper) print("data count: ", draw_data.keys(), " ", draw_data[0].keys()) $gen/drawable.triangles = draw_data[0][0].triangles - $gen/drawable.min_point = min_point - $gen/drawable.max_point = max_point + $gen/drawable.min_point = dnatool.min_point + $gen/drawable.max_point = dnatool.max_point $gen/drawable.normals = false # print("done ", mesh.get_surface_count(), " ", mesh.get_blend_shape_count(), " ", min_point, " ", max_point, " added: ", ntriangles, " skipped: ", skipped) var helper : = 0 @@ -352,25 +331,28 @@ var surface : = 0 var shape : = 0 var exit_delay : = 3.0 var draw_delay : = 2.0 -func save_viewport(shape_name: String, rect: Rect2): - var viewport: Viewport = $gen - 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 $gen/drawable.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 save_viewport(v: Viewport, maplist: Dictionary, shape_name: String, rect: Rect2, normals: bool): +## v.set_clear_mode(Viewport.CLEAR_MODE_ONLY_NEXT_FRAME) +## yield(get_tree(), "idle_frame") +## yield(get_tree(), "idle_frame") +# var viewport: Viewport = v +# var vtex : = viewport.get_texture() +# var tex_img : = vtex.get_data() +# var fn = "" +# if !maplist.has(shape_name): +# maplist[shape_name] = {} +# maplist[shape_name].width = tex_img.get_width() +# maplist[shape_name].height = tex_img.get_height() +# maplist[shape_name].format = tex_img.get_format() +# var byte_data = tex_img.duplicate(true).get_data() +# var image_size = byte_data.size() +# if normals: +# maplist[shape_name].image_normal_data = byte_data.compress(File.COMPRESSION_FASTLZ) +# maplist[shape_name].image_normal_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_"] func finish_map_gen(): @@ -378,13 +360,14 @@ func finish_map_gen(): find_same_verts() var fd = File.new() fd.open("res://characters/common/config.bin", File.WRITE) - fd.store_var(min_point) - fd.store_var(max_point) - fd.store_var(min_normal) - fd.store_var(max_normal) + fd.store_var(dnatool.min_point) + fd.store_var(dnatool.max_point) + fd.store_var(dnatool.min_normal) + fd.store_var(dnatool.max_normal) fd.store_var(maps) fd.store_var(vert_indices) fd.close() + save_images() get_tree().quit() # get_tree().change_scene("res://map_test.tscn") func next_surface(): @@ -404,13 +387,46 @@ func next_helper(): func setup_draw(): $gen/drawable.normals = !$gen/drawable.normals if $gen/drawable.normals: - $gen/drawable.min_point = min_normal - $gen/drawable.max_point = max_normal + $gen/drawable.min_point = dnatool.min_normal + $gen/drawable.max_point = dnatool.max_normal else: - $gen/drawable.min_point = min_point - $gen/drawable.max_point = max_point + $gen/drawable.min_point = dnatool.min_point + $gen/drawable.max_point = dnatool.max_point $gen/drawable.triangles = draw_data_list[helper][surface][shape].triangles $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): if surface == draw_data_list[helper].size(): if exit_delay > 0: @@ -426,7 +442,8 @@ func _process(delta): if draw_delay > 0: draw_delay -= delta 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: shape += 1 draw_delay = 1.0 diff --git a/proto2/characters/generate_maps2.gd b/proto2/characters/generate_maps2.gd index 81e80e9..d092aec 100644 --- a/proto2/characters/generate_maps2.gd +++ b/proto2/characters/generate_maps2.gd @@ -1,12 +1,10 @@ extends Control +signal draw_finished var common = [] var common_path = "characters/common" -var min_point = Vector3() -var max_point = Vector3() -var min_normal = Vector3() -var max_normal = Vector3() +var dnatool: DNATool const TEX_SIZE: int = 512 @@ -59,34 +57,6 @@ func get_mesh(base: Node, mesh_name: String) -> ArrayMesh: queue.push_back(c) 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: 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: var cd = vmax - vmin - var ret: PoolVector3Array = v + var ret: PoolVector3Array = PoolVector3Array(v) for e in range(v.size()): - ret[e] = v[e] - vmin 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 func build_triangles(mesh: ArrayMesh, diffmap: Dictionary): assert mesh - assert max_point != min_point - var cd = max_point - min_point - var ncd = max_normal - min_normal + assert dnatool.max_point != dnatool.min_point + var cd = dnatool.max_point - dnatool.min_point + var ncd = dnatool.max_normal - dnatool.min_normal for sc in range(mesh.get_surface_count()): var shape_arrays = mesh.surface_get_blend_shape_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].triangles = [] diffmap[bs_name].triangles_uv = [] - diffmap[bs_name].triangles_v = PoolVector3Array() - diffmap[bs_name].triangles_n = PoolVector3Array() + diffmap[bs_name].triangles_v = [] + diffmap[bs_name].triangles_n = [] for vid in range(0, surf_arrays[ArrayMesh.ARRAY_INDEX].size(), 3): var p1_index = surf_arrays[ArrayMesh.ARRAY_INDEX][vid + 0] 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_v = compress_points([d1, d2, d3], min_point, max_point) # var triangle_n = compress_points([nd1, nd2, nd3], min_normal, max_normal) - var triangle_v = PoolVector3Array([d1, d2, d3]) - var triangle_n = PoolVector3Array([nd1, nd2, nd3]) + var triangle_v = [d1, d2, d3] + var triangle_n = [nd1, nd2, nd3] if check_triangle(triangle_uv, triangle_v, triangle_n): diffmap[bs_name].triangles += triangle 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): pass -enum {STATE_DRAW, STATE_CHECK, STATE_FINISH} +enum {STATE_DRAW, STATE_CHECK, STATE_FINISH, STATE_IDLE} var draw_queue = [] @@ -195,6 +166,9 @@ func create_queue(diffmap: Dictionary): data.triangles_v = diffmap[k][map_name].triangles_v data.rect = diffmap[k][map_name].rect 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.map = map_key data.normals = true @@ -202,8 +176,11 @@ func create_queue(diffmap: Dictionary): data.triangles_v = diffmap[k][map_name].triangles_n data.rect = diffmap[k][map_name].rect draw_queue.push_back(data) +# for k in data.triangles_v: +# print(k.z) func _ready(): + dnatool = DNATool.new() load_data() var base_mesh = "base" var helper_meshes = ["robe_helper", "tights_helper", "skirt_helper"] @@ -212,7 +189,10 @@ func _ready(): for mesh_name in [base_mesh] + helper_meshes: var obj = c.instance() 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: var obj = c.instance() if !diffmap.has(base_mesh): @@ -228,10 +208,15 @@ func _ready(): convert_triangles(diffmap[base_mesh], diffmap[mesh_name]) print("scene: ", c, "mesh: ", mesh_name, " 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 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_n = compress_points(diffmap[e][k].triangles_n, min_point, max_point) + diffmap[e][k].triangles_v_uc = diffmap[e][k].triangles_v + 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: ", diffmap[e][k].triangles_uv.size() / 3) if diffmap[e][k].triangles_uv.size() > 0: @@ -247,32 +232,11 @@ func _ready(): print("prep done, ", draw_queue.size()) $gen/drawable.connect("draw", self, "draw_viewport") total_count = draw_queue.size() + $gen_maps/ProgressBar.value = 0.0 + connect("draw_finished", self, "draw_finished") 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(): var draw_obj = $gen/drawable if draw_queue.size() == 0: @@ -283,11 +247,11 @@ func draw_viewport(): var _min_point: Vector3 var _max_point: Vector3 if item.normals: - _min_point = min_normal - _max_point = max_normal + _min_point = dnatool.min_normal + _max_point = dnatool.max_normal else: - _min_point = min_point - _max_point = max_point + _min_point = dnatool.min_point + _max_point = dnatool.max_point 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.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 uvs.push_back(uv * TEX_SIZE + pt) 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 draw_delay: float = 0.1 -var save_pngs : = false +var save_pngs : = true func save_images(): for k in maps.keys(): 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 size: int 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) print("saving ", 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): match(_state): + STATE_IDLE: + pass STATE_CHECK: if draw_delay > 0.0: 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: - _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: + print("triggering draw ", draw_queue.size()) + $gen.render_target_update_mode = Viewport.UPDATE_ONCE $gen/drawable.update() - draw_delay = 0.05 - _state = STATE_CHECK + draw_delay += 0.01 + _state = STATE_IDLE STATE_FINISH: print("generating same vert indices...") find_same_verts() var fd = File.new() fd.open("res://characters/common/config.bin", File.WRITE) - fd.store_var(min_point) - fd.store_var(max_point) - fd.store_var(min_normal) - fd.store_var(max_normal) + fd.store_var(dnatool.min_point) + fd.store_var(dnatool.max_point) + fd.store_var(dnatool.min_normal) + fd.store_var(dnatool.max_normal) fd.store_var(maps) fd.store_var(vert_indices) fd.close() diff --git a/proto2/characters/map_test/map_test.gd b/proto2/characters/map_test/map_test.gd index 6c8cbd8..6840b11 100644 --- a/proto2/characters/map_test/map_test.gd +++ b/proto2/characters/map_test/map_test.gd @@ -147,11 +147,13 @@ func update_slider(value: float, control: String, slider: HSlider): var modifier = "" if value >= 0: 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: value = -value 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) var ch: Node func rebuild_clothes_menu(): @@ -217,12 +219,12 @@ func _ready(): var state : = 0 func build_contols(): for k in dna.get_modifier_list(): - if k.ends_with("_plus"): + if k.ends_with("_plus") && false: var cname = k.replace("_plus", "") if !controls.has(cname): controls[cname] = {} controls[cname].plus = k - elif k.ends_with("_minus"): + elif k.ends_with("_minus") && false: var cname = k.replace("_minus", "") if !controls.has(cname): controls[cname] = {} @@ -245,7 +247,8 @@ func build_contols(): var slider : = HSlider.new() slider.rect_min_size = Vector2(180, 30) print(controls[k]) - if controls[k].plus && controls[k].minus: + + if controls[k].has("minus") && controls[k].has("plus"): slider.min_value = -100 slider.max_value = 100 else: diff --git a/proto2/project.godot b/proto2/project.godot index e07407f..9ac473d 100644 --- a/proto2/project.godot +++ b/proto2/project.godot @@ -25,6 +25,11 @@ _global_script_classes=[ { "path": "res://characters/dna.gd" }, { "base": "Reference", +"class": "DNATool", +"language": "GDScript", +"path": "res://characters/dna_tool.gd" +}, { +"base": "Reference", "class": "GridRule", "language": "GDScript", "path": "res://growth_rules/grid.gd" @@ -58,6 +63,7 @@ _global_script_class_icons={ "BallGameAI": "", "BallGameAI3D": "", "DNA": "", +"DNATool": "", "GridRule": "", "Item": "", "Quest": "",