1 module dlangui.graphics.scene.drawableobject;
2 
3 import dlangui.core.config;
4 static if (ENABLE_OPENGL):
5 static if (BACKEND_GUI):
6 
7 import dlangui.core.types;
8 
9 /// Reference counted DrawableObject
10 alias DrawableObjectRef = Ref!DrawableObject;
11 
12 /// base drawable object
13 class DrawableObject : RefCountedObject {
14 
15     import dlangui.graphics.scene.node;
16 
17     this() {
18     }
19     void draw(Node3d node, bool wireframe) {
20         /// override it
21     }
22 }
23 
24 /// base drawable object with material
25 class MaterialDrawableObject : DrawableObject {
26     import dlangui.graphics.scene.node;
27     import dlangui.graphics.scene.material;
28     import dlangui.graphics.scene.light;
29 
30     protected MaterialRef _material;
31     protected bool _autobindLights = true;
32     protected Lights _lights;
33 
34     this() {
35     }
36 
37     this(Material material) {
38         _material = material;
39     }
40 
41     @property ref MaterialRef material() { return _material; }
42 
43     @property bool autobindLights() { return _autobindLights; }
44     @property MaterialDrawableObject autobindLights(bool flg) { _autobindLights = flg; return this; }
45 
46     MaterialDrawableObject bindLight(Light light) {
47         _lights.add(light);
48         return this;
49     }
50 
51     MaterialDrawableObject unbindLight(Light light) {
52         _lights.remove(light);
53         return this;
54     }
55 
56     protected static __gshared LightParams _lightParamsBuffer;
57     @property protected LightParams * lights(Node3d node) {
58         if (!node.scene)
59             return null;
60         if (!_autobindLights)
61             return null; // TODO: allow manually bound lights
62         if (_lights.empty) {
63             if (node.scene.boundLights.empty)
64                 return null;
65             return node.scene.boundLightsPtr;
66         }
67         if (node.scene.boundLights.empty) {
68             _lightParamsBuffer.reset();
69             _lightParamsBuffer.add(_lights);
70         } else {
71             _lightParamsBuffer.reset(node.scene.boundLights);
72             _lightParamsBuffer.add(_lights);
73         }
74         return &_lightParamsBuffer;
75     }
76 
77     override void draw(Node3d node, bool wireframe) {
78         /// override it
79     }
80 }