-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathrender_random_test.gd
More file actions
94 lines (81 loc) · 3.1 KB
/
Copy pathrender_random_test.gd
File metadata and controls
94 lines (81 loc) · 3.1 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
89
90
91
92
93
94
## Visual test for Randomize: builds a random-preset character, saves user://render_random.png.
## Run with: godot -s res://tests/render_random_test.gd --path .
extends SceneTree
const OUT_PATH := "user://render_random.png"
func _init() -> void:
call_deferred("_run")
func _run() -> void:
randomize()
var database := SKDatabase.new()
database.open()
var library := SKPartLibrary.new()
library.scan()
var recipe := SKRecipe.new()
recipe.name = "Randomized"
for group: int in SKEnums.PART_GROUP_NAMES:
var presets := database.get_available_part_presets(
library, group, 1 if group == SKEnums.PartGroup.HEAD else -1)
if presets.is_empty():
continue
var preset: Dictionary = presets[randi_range(0, presets.size() - 1)]
print(" %s preset: %s" % [SKEnums.PART_GROUP_NAMES[group], preset.name])
for row in database.get_part_preset_rows(int(preset.id)):
var part_name := str(row.get("part_name", ""))
if not part_name.is_empty() and part_name != "None":
recipe.set_part(part_name)
# Random skin tone via the Species color group presets, like picking in the Colors tab.
var colors := SKColorEngine.new()
colors.setup()
var species_presets := database.get_color_presets(1, SKEnums.ColorGroup.SPECIES)
if not species_presets.is_empty():
var color_preset: Dictionary = species_presets[randi_range(0, species_presets.size() - 1)]
print(" Species colors: %s" % color_preset.name)
var properties := {}
for prop in database.get_color_properties():
properties[int(prop.id)] = prop
var rows: Array = []
for row in database.get_color_preset_rows(int(color_preset.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 RANDOM: build failed")
quit(1)
return
root.add_child(character)
var light := DirectionalLight3D.new()
light.rotation_degrees = Vector3(-45, 30, 0)
light.light_energy = 1.2
root.add_child(light)
var fill := DirectionalLight3D.new()
fill.rotation_degrees = Vector3(-20, -120, 0)
fill.light_energy = 0.5
root.add_child(fill)
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.7, 0.7, 0.75)
env.ambient_light_energy = 0.6
environment.environment = env
root.add_child(environment)
var camera := Camera3D.new()
camera.position = Vector3(0, 1.0, 2.6)
camera.look_at_from_position(camera.position, Vector3(0, 0.9, 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 RANDOM: saved %s" % ProjectSettings.globalize_path(OUT_PATH))
quit(0)