-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathrender_head_test.gd
More file actions
88 lines (76 loc) · 2.88 KB
/
Copy pathrender_head_test.gd
File metadata and controls
88 lines (76 loc) · 2.88 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
## Visual test: bare base human head close-up with default color presets applied per
## group (the dock's default behavior). Verifies eye/sclera colors.
## Run with: godot -s res://tests/render_head_test.gd --path .
extends SceneTree
const OUT_PATH := "user://render_head.png"
func _init() -> void:
call_deferred("_run")
func _run() -> void:
var database := SKDatabase.new()
database.open()
var library := SKPartLibrary.new()
library.scan()
# Base human head parts (first BASE part per head-group type).
var recipe := SKRecipe.new()
recipe.name = "HeadTest"
for type: int in SKEnums.PART_GROUP_TYPES[SKEnums.PartGroup.HEAD]:
var base_parts := library.get_base_parts_of_type(type)
if not base_parts.is_empty():
recipe.set_part(base_parts[0])
for type: int in [SKEnums.PartType.TORSO]:
var base_parts := library.get_base_parts_of_type(type)
if not base_parts.is_empty():
recipe.set_part(base_parts[0])
# Default colors: first preset of every color group (Unity's default behavior).
var colors := SKColorEngine.new()
colors.setup()
var properties := {}
for prop in database.get_color_properties():
properties[int(prop.id)] = prop
var rows: Array = []
for group: int in SKEnums.COLOR_GROUP_NAMES:
var presets := database.get_color_presets(1 if group == SKEnums.ColorGroup.SPECIES else -1, group)
if presets.is_empty():
continue
print(" %s default: %s" % [SKEnums.COLOR_GROUP_NAMES[group], presets[0].name])
for row in database.get_color_preset_rows(int(presets[0].id)):
var prop: Dictionary = properties.get(int(row.ptr_color_property), {})
if prop.is_empty():
continue
rows.append({
"property": { "u": int(prop.u), "v": int(prop.v) },
"colors": { SKEnums.ColorType.MAIN_COLOR: SKColorEngine.parse_hex(str(row.color)) },
})
colors.apply_rows(rows)
database.close()
var builder := SKCharacterBuilder.new(library, colors)
var character := builder.build(recipe)
if character == null:
printerr("RENDER HEAD: build failed")
quit(1)
return
root.add_child(character)
var light := DirectionalLight3D.new()
light.rotation_degrees = Vector3(-30, 20, 0)
light.light_energy = 1.1
root.add_child(light)
var environment := WorldEnvironment.new()
var env := Environment.new()
env.background_mode = Environment.BG_COLOR
env.background_color = Color(0.2, 0.22, 0.25)
env.ambient_light_source = Environment.AMBIENT_SOURCE_COLOR
env.ambient_light_color = Color(0.75, 0.75, 0.8)
env.ambient_light_energy = 0.7
environment.environment = env
root.add_child(environment)
var camera := Camera3D.new()
camera.position = Vector3(0, 1.62, 0.55)
camera.look_at_from_position(camera.position, Vector3(0, 1.58, 0))
root.add_child(camera)
camera.make_current()
for i in 10:
await process_frame
var image := root.get_viewport().get_texture().get_image()
image.save_png(OUT_PATH)
print("RENDER HEAD: saved %s" % ProjectSettings.globalize_path(OUT_PATH))
quit(0)