1 ///2 moduleisodi.object3d;
3 4 importstd.stdio;
5 importstd.string;
6 7 public {
8 9 importisodi.bind;
10 importisodi.display;
11 importisodi.position;
12 importisodi.resource;
13 14 }
15 16 17 @safe:
18 19 20 /// Represents an object that can be drawn on a 3D space.21 abstractclassObject3D {
22 23 /// Display this object is connected to.24 Displaydisplay;
25 26 /// Get the current position of the object.27 abstractconst(Position) position() const;
28 29 /// Get the current visual position of the object.30 abstractconst(Position) visualPosition() const;
31 32 /// Params:33 /// display = Display to connect to.34 this(Displaydisplay) {
35 36 this.display = display;
37 38 }
39 40 /// Add a basic implementation for the position as a property, includes a setter.41 mixintemplateImplement() {
42 43 @safe:
44 45 privatePosition_position;
46 47 /// Get the current position of the object.48 ///49 /// This returns a const value, use `positionRef` to get a reference.50 overrideconst(Position) position() const { return_position; }
51 52 /// Ditto53 overrideconst(Position) visualPosition() const { returnposition; }
54 55 /// Get a reference to the position value.56 refPositionpositionRef() { return_position; }
57 58 /// Set the new position.59 Positionposition(Positionvalue) { return_position = value; }
60 61 }
62 63 ///64 staticunittest {
65 66 classExample : Object3D {
67 68 mixinObject3D.Implement;
69 70 this() {
71 super(null);
72 }
73 74 }
75 76 autoex = newExample;
77 assert(ex.position == .position(0, 0));
78 79 ex.positionRef.x += 1;
80 assert(ex.position == .position(1, 0));
81 82 ex.position = .position(2, 2);
83 assert(ex.position == .position(2, 2));
84 85 }
86 87 /// Implement the position as a const property. `_position` and `_visualPosition` must be set in constructor.88 mixintemplateImplementConst() {
89 90 @safe:
91 92 privateconstPosition_position;
93 overrideconst(Position) position() const { return_position; }
94 95 privatePosition_visualPosition;
96 97 /// Get the position the cell is displayed on.98 overrideconst(Position) visualPosition() const {
99 100 return_visualPosition;
101 102 }
103 104 /// Set an offset for the visual position.105 ///106 /// $(B Note:) Mind that depth is initialized to 1 by default, which might cause unwanted effects. If you don't107 /// want to offset it, use `positionOff`.108 const(Position) offset(Positionvalue) {
109 110 return_visualPosition = _position.sum(value);
111 112 }
113 114 /// Reset the offset115 voidresetOffset() {
116 117 _visualPosition = _position;
118 119 }
120 121 }
122 123 }