1 module dlangui.graphics.scene.skybox;
2
3 public import dlangui.core.config;
4 static if (ENABLE_OPENGL):
5 static if (BACKEND_GUI):
6
7 import dlangui.core.math3d;
8 import dlangui.graphics.scene.node;
9 import dlangui.graphics.scene.model;
10 import dlangui.graphics.scene.scene3d;
11 import dlangui.graphics.scene.mesh;
12 import dlangui.graphics.scene.material;
13 import dlangui.graphics.scene.effect;
14
15 class SkyBox : Node3d {
16 private Node3d[6] _faceNodes;
17
18 enum Face {
19 Back,
20 Front,
21 Left,
22 Right,
23 Top,
24 Bottom
25 }
26
27 this(Scene3d scene) {
28 _parent = scene;
29 _scene = scene;
30 _visible = false;
31 }
32
33 void removeFace(Face face) {
34 if (_faceNodes[face]) {
35 removeChild(_faceNodes[face]);
36 _faceNodes[face] = null;
37 }
38 }
39
40 void setFaceTexture(Face face, string textureName) {
41 removeFace(face);
42 if (!textureName)
43 return;
44 Material material = new Material(EffectId("textured.vert", "textured.frag", null), textureName);
45 //material.ambientColor = vec3(0.9,0.9,0.9);
46 material.textureLinear = true;
47 Mesh mesh = new Mesh(VertexFormat(VertexElementType.POSITION, VertexElementType.COLOR, VertexElementType.TEXCOORD0));
48 const float d = 1;
49 const vec3 pos = vec3(0,0,0);
50 vec4 color = vec4(1,1,1,1);
51 auto p000 = vec3(pos.x-d, pos.y-d, pos.z-d);
52 auto p100 = vec3(pos.x+d, pos.y-d, pos.z-d);
53 auto p010 = vec3(pos.x-d, pos.y+d, pos.z-d);
54 auto p110 = vec3(pos.x+d, pos.y+d, pos.z-d);
55 auto p001 = vec3(pos.x-d, pos.y-d, pos.z+d);
56 auto p101 = vec3(pos.x+d, pos.y-d, pos.z+d);
57 auto p011 = vec3(pos.x-d, pos.y+d, pos.z+d);
58 auto p111 = vec3(pos.x+d, pos.y+d, pos.z+d);
59
60 final switch(face) with(Face) {
61 case Back:
62 mesh.addQuad(p111, p011, p001, p101, color); // back face
63 break;
64 case Front:
65 mesh.addQuad(p010, p110, p100, p000, color); // front face
66 break;
67 case Right:
68 mesh.addQuad(p110, p111, p101, p100, color); // right face
69 break;
70 case Left:
71 mesh.addQuad(p011, p010, p000, p001, color); // left face
72 break;
73 case Top:
74 mesh.addQuad(p011, p111, p110, p010, color); // top face
75 break;
76 case Bottom:
77 mesh.addQuad(p000, p100, p101, p001, color); // bottom face
78 break;
79 }
80 Model model = new Model(material, mesh);
81 model.autobindLights = false;
82 Node3d node = new Node3d();
83 node.drawable = model;
84 _faceNodes[face] = node;
85 addChild(node);
86 _visible = true;
87 }
88 }