3d support continue

This commit is contained in:
Vadim Lopatin 2015-04-09 13:59:41 +03:00
parent 898e64419d
commit e028be2221
4 changed files with 90 additions and 1 deletions

View File

@ -9,25 +9,61 @@ import gl3n.math;
class Camera : Node3d {
protected mat4 _projectionMatrix;
protected mat4 _viewProjectionMatrix;
protected bool _dirtyViewProjection;
protected bool _enabled;
this() {
_enabled = true;
setPerspective(4.0f, 3.0f, 45.0f, 0.1f, 100.0f);
}
/// returns true if camera is active (enabled)
@property bool enabled() { return _enabled; }
/// activates / deactivates camera
@property void enabled(bool v) {
if (scene)
scene.activeCamera = null;
_enabled = v;
}
/// get projection matrix
@property ref mat4 projectionMatrix() {
@property ref const(mat4) projectionMatrix() {
return _projectionMatrix;
}
/// set custom projection matrix
@property void projectionMatrix(mat4 v) {
_projectionMatrix = v;
_dirtyViewProjection = true;
}
/// get projection*view matrix
@property ref const(mat4) viewProjectionMatrix() {
if (_dirtyTransform || _dirtyViewProjection) {
_viewProjectionMatrix = _projectionMatrix * matrix;
_dirtyViewProjection = false;
}
return _viewProjectionMatrix;
}
/// set orthographic projection
void setOrtho(float left, float right, float bottom, float top, float near, float far) {
_projectionMatrix = mat4.orthographic(left, right, bottom, top, near, far);
_dirtyViewProjection = true;
}
/// set perspective projection
void setPerspective(float width, float height, float fov, float near, float far) {
_projectionMatrix = mat4.perspective(width, height, fov, near, far);
_dirtyViewProjection = true;
}
~this() {
// disconnect active camera
if (scene && scene.activeCamera is this)
scene.activeCamera = null;
}
}

View File

@ -5,29 +5,50 @@ import gl3n.math;
import dlangui.graphics.scene.transform;
import dlangui.core.collections;
import dlangui.graphics.scene.scene3d;
/// 3D scene node
class Node3d : Transform {
protected Node3d _parent;
protected Scene3d _scene;
protected string _id;
protected mat4 _worldMatrix;
protected ObjectList!Node3d _children;
this() {
super();
}
/// returns scene for node
@property Scene3d scene() {
if (_scene)
return _scene;
if (_parent)
return _parent.scene;
return cast(Scene3d) this;
}
@property void scene(Scene3d v) { _scene = v; }
/// returns child node count
@property int childCount() {
return _children.count;
}
/// returns child node by index
Node3d child(int index) {
return _children[index];
}
/// add child node
void addChild(Node3d node) {
_children.add(node);
node.parent = this;
node.scene = scene;
}
/// removes and destroys child node by index
void removeChild(int index) {
destroy(_children.remove(index));
@ -37,6 +58,7 @@ class Node3d : Transform {
@property Node3d parent() {
return _parent;
}
@property Node3d parent(Node3d v) {
_parent = v;
return this;

View File

@ -1,6 +1,7 @@
module dlangui.graphics.scene.scene3d;
import dlangui.graphics.scene.node;
import dlangui.graphics.scene.camera;
import gl3n.linalg;
import gl3n.math;
@ -9,9 +10,35 @@ import gl3n.math;
class Scene3d : Node3d {
protected vec3 _ambientColor;
protected Camera _activeCamera;
/// ambient light color
@property vec3 ambientColor() { return _ambientColor; }
/// set ambient light color
@property void ambientColor(const ref vec3 v) { _ambientColor = v; }
/// active camera
@property Camera activeCamera() {
if (_activeCamera)
return _activeCamera;
// TODO: find camera in child nodes
return null;
}
/// set or clear current active camera
@property void activeCamera(Camera cam) {
_activeCamera = cam;
}
/// returns scene for node
override @property Scene3d scene() {
return this;
}
override @property void scene(Scene3d v) {
//ignore
}
}

View File

@ -12,6 +12,10 @@ class Transform {
protected mat4 _matrix;
this() {
setIdentity();
}
/// get scale vector
public @property ref const(vec3) scaling() const { return _scale; }
/// get scale X