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
95
96
97
98
|
extends Spatial
export var SIZE = 15
const Cube = preload("res://mesh/cube.obj")
const GrayMat = preload("res://gray_mat.tres")
const GlassMat = preload("res://glass.tres")
const House = preload("res://house.tscn")
const Pine = preload("res://tree_pine.tscn")
const Oak = preload("res://tree_oak.tscn")
var materials
var mass
var volume
var color
var gas_mass
var gas_volume
var gas_color
var material
var glass_material
func _enter_tree():
pass
# var pn = Pine.instance()
# pn.translate(Vector3(2,1,2))
# add_child(pn)
# var ok = Oak.instance()
# ok.translate(Vector3(-2,1,2))
# add_child(ok)
# var hs = House.instance()
# hs.translate(Vector3(0,1,2))
# hs.rotate_y(PI/2)
# add_child(hs)
func build():
_make_ball(SIZE, Vector3(0,0,0))
func _make_ball(size, center):
var blocks = []
var count = 0
for x in range(-size, size):
var line_x = []
blocks.append(line_x)
for y in range(0, -size, -1):
var line_y = []
line_x.append(line_y)
for z in range(-size, size):
var relative = Vector3(x, y, z)
var len = relative.length()
if floor(len) <= size/2 and (ceil(len) > size/2 or y == 0):
line_y.append(relative*2 + center)
count += 1
else:
line_y.append(null)
self.material = GrayMat.duplicate(true)
self.material.set_albedo(self.color)
self.glass_material = GlassMat.duplicate(true)
self.glass_material.set_albedo(self.gas_color)
get_node("CoverOther/Icosphere").set_material_override(self.glass_material)
for i in range(Cube.get_surface_count()):
Cube.surface_set_material(i, self.material)
var multi = MultiMesh.new()
multi.set_transform_format(MultiMesh.TRANSFORM_3D)
multi.set_color_format(MultiMesh.COLOR_FLOAT)
multi.set_mesh(Cube)
multi.set_instance_count(count)
var i = 0
for x in range(blocks.size()):
var line_x = blocks[x]
if line_x == null:
continue
for y in range(line_x.size()):
var line_y = line_x[y]
if line_y == null:
continue
for z in range(line_y.size()):
var pos = line_y[z]
if pos != null:
var trans = Transform()
trans = trans.translated(pos)
multi.set_instance_transform(i, trans)
multi.set_instance_color(i, self.color)
i += 1
var instance = MultiMeshInstance.new()
instance.set_multimesh(multi)
add_child(instance)
func _on_Area_input_event( camera, event, click_pos, click_normal, shape_idx ):
if event.type == InputEvent.MOUSE_BUTTON and event.button_index == BUTTON_LEFT and event.is_pressed():
var cam = get_tree().get_root().get_camera()
cam.select(self, get_node("point"))
cam.reselect()
|