diff options
Diffstat (limited to 'src/scene-refract.h')
-rw-r--r-- | src/scene-refract.h | 106 |
1 files changed, 106 insertions, 0 deletions
diff --git a/src/scene-refract.h b/src/scene-refract.h new file mode 100644 index 0000000..660678b --- /dev/null +++ b/src/scene-refract.h @@ -0,0 +1,106 @@ +// +// Copyright © 2012 Linaro Limited +// +// This file is part of the glmark2 OpenGL (ES) 2.0 benchmark. +// +// glmark2 is free software: you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the Free Software +// Foundation, either version 3 of the License, or (at your option) any later +// version. +// +// glmark2 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 General Public License for more +// details. +// +// You should have received a copy of the GNU General Public License along with +// glmark2. If not, see <http://www.gnu.org/licenses/>. +// +// Authors: +// Jesse Barker +// +#ifndef SCENE_REFRACT_ +#define SCENE_REFRACT_ + +#include "scene.h" +#include "stack.h" + +// +// To create a shadow map, we need a framebuffer object set up for a +// depth-only pass. The render target can then be bound as a texture, +// and the depth values sampled from that texture can be used in the +// distance-from-light computations when rendering the shadow on the +// ground below the rendered object. +// +class DistanceRenderTarget +{ + enum + { + DEPTH = 0, + COLOR + }; + Program program_; + unsigned int canvas_width_; + unsigned int canvas_height_; + unsigned int width_; + unsigned int height_; + unsigned int tex_[2]; + unsigned int fbo_; +public: + DistanceRenderTarget() : + canvas_width_(0), + canvas_height_(0), + width_(0), + height_(0), + fbo_(0) + { + tex_[DEPTH] = tex_[COLOR] = 0; + } + ~DistanceRenderTarget() {} + bool setup(unsigned int width, unsigned int height); + void teardown(); + void enable(const LibMatrix::mat4& mvp); + void disable(); + unsigned int depthTexture() { return tex_[DEPTH]; } + unsigned int colorTexture() { return tex_[COLOR]; } + Program& program() { return program_; } +}; + +class RefractPrivate +{ + Canvas& canvas_; + DistanceRenderTarget depthTarget_; + Program program_; + LibMatrix::Stack4 modelview_; + LibMatrix::Stack4 projection_; + LibMatrix::mat4 light_; + Mesh mesh_; + LibMatrix::vec3 centerVec_; + bool orientModel_; + float orientationAngle_; + LibMatrix::vec3 orientationVec_; + float radius_; + float rotation_; + float rotationSpeed_; + unsigned int texture_; + bool useVbo_; + +public: + RefractPrivate(Canvas& canvas) : + canvas_(canvas), + orientModel_(false), + orientationAngle_(0.0), + radius_(0.0), + rotation_(0.0), + rotationSpeed_(36.0), + texture_(0), + useVbo_(true) {} + ~RefractPrivate() {} + + bool setup(std::map<std::string, Scene::Option>& options); + void teardown(); + void update(double elapsedTime); + void draw(); +}; + +#endif // SCENE_REFRACT_ |