mirror of https://github.com/mosra/magnum.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
89 lines
2.6 KiB
89 lines
2.6 KiB
/* |
|
Copyright © 2010, 2011 Vladimír Vondruš <mosra@centrum.cz> |
|
|
|
This file is part of Magnum. |
|
|
|
Magnum is free software: you can redistribute it and/or modify |
|
it under the terms of the GNU Lesser General Public License version 3 |
|
only, as published by the Free Software Foundation. |
|
|
|
Magnum is distributed in the hope that it will be useful, |
|
but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
GNU Lesser General Public License version 3 for more details. |
|
*/ |
|
|
|
#include "Scene.h" |
|
|
|
using namespace std; |
|
|
|
namespace Magnum { |
|
|
|
Scene::Scene(): Object(0), _features(0), _camera(0) { |
|
_parent = this; |
|
setClearColor(0.1f, 0.1f, 0.1f, 1.0f); |
|
|
|
/* Bind default VAO */ |
|
glGenVertexArrays(1, &vao); |
|
glBindVertexArray(vao); |
|
} |
|
|
|
void Scene::setFeature(Scene::Feature feature, bool enabled) { |
|
GLenum _feature; |
|
switch(feature) { |
|
case AlphaBlending: _feature = GL_BLEND; break; |
|
case DepthTest: _feature = GL_DEPTH_TEST; break; |
|
case FaceCulling: _feature = GL_CULL_FACE; break; |
|
default: return; |
|
} |
|
|
|
enabled ? glEnable(_feature) : glDisable(_feature); |
|
} |
|
|
|
void Scene::setClearColor(const Magnum::Vector4& color) { |
|
glClearColor(color.r(), color.g(), color.b(), color.a()); |
|
_clearColor = color; |
|
} |
|
|
|
void Scene::setCamera(Camera* camera) { |
|
/* Don't assign the same camera or camera which is not part of the scene */ |
|
if(camera == _camera || (camera && camera->scene() != this)) return; |
|
|
|
Camera* oldCamera = _camera; |
|
|
|
/* Set new camera active */ |
|
_camera = camera; |
|
if(_camera) { |
|
_camera->setViewport(viewportWidth, viewportHeight); |
|
_camera->setActive(this); |
|
} |
|
|
|
/* Set old camera inactive, if it is still active in this scene */ |
|
if(oldCamera && oldCamera->active() == this) oldCamera->setActive(0); |
|
|
|
setDirty(); |
|
} |
|
|
|
void Scene::draw() { |
|
/* No camera available, nothing to do */ |
|
if(!_camera) return; |
|
|
|
/** @todo Clear only set features */ |
|
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); |
|
|
|
/* Recursively draw child objects */ |
|
drawChildren(this, _camera->cameraMatrix()); |
|
} |
|
|
|
void Scene::drawChildren(Object* object, const Matrix4& transformationMatrix) { |
|
for(set<Object*>::const_iterator it = object->children().begin(); it != object->children().end(); ++it) { |
|
/* Transformation matrix for the object */ |
|
Matrix4 matrix = transformationMatrix*(*it)->transformation(); |
|
|
|
/* Draw the object and its children */ |
|
(*it)->draw(matrix, _camera->projectionMatrix()); |
|
drawChildren(*it, matrix); |
|
} |
|
} |
|
|
|
}
|
|
|