Sirikata
liboh/plugins/ogre/CubeMap.hpp
Go to the documentation of this file.
00001 /*  Sirikata libproxyobject -- Ogre Graphics Plugin
00002  *  CubeMap.hpp
00003  *
00004  *  Copyright (c) 2009, Daniel Reiter Horn
00005  *  All rights reserved.
00006  *
00007  *  Redistribution and use in source and binary forms, with or without
00008  *  modification, are permitted provided that the following conditions are
00009  *  met:
00010  *  * Redistributions of source code must retain the above copyright
00011  *    notice, this list of conditions and the following disclaimer.
00012  *  * Redistributions in binary form must reproduce the above copyright
00013  *    notice, this list of conditions and the following disclaimer in
00014  *    the documentation and/or other materials provided with the
00015  *    distribution.
00016  *  * Neither the name of Sirikata nor the names of its contributors may
00017  *    be used to endorse or promote products derived from this software
00018  *    without specific prior written permission.
00019  *
00020  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
00021  * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
00022  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
00023  * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
00024  * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
00025  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
00026  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
00027  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
00028  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
00029  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
00030  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00031  */
00032 #ifndef _SIRIKATA_CUBE_MAP_HPP_
00033 #define _SIRIKATA_CUBE_MAP_HPP_
00034 namespace Sirikata {
00035 namespace Graphics {
00036 
00037 
00038 class CubeMap {//:public Ogre::FrameListener{
00039     Ogre::SceneManager*mCubeMapScene;
00040     Ogre::Camera*mCubeMapSceneCamera[6];
00041     OgreSystem*mParent;
00042     float mAlpha;
00043     bool mFrontbufferCloser;
00044     Ogre::TexturePtr mBackbuffer[6];
00045     Ogre::MaterialPtr mMaterials[6];
00046     struct PerCubeMapState {
00047         Ogre::TexturePtr mCubeMapTexture;
00048         Vector3f mCameraDelta;
00049         Ogre::TexturePtr mFrontbuffer[6];
00050         Ogre::Camera*mCamera;
00051         Ogre::Vector3 mLastActualPosition;
00052         Ogre::Vector3 mLastRenderedPosition;
00053         Ogre::Vector3 mFirstCameraPosition;
00054     };
00055     bool tooSmall(Ogre::Vector3 delta);
00056     std::vector<PerCubeMapState> mState;
00057     void swapBuffers();
00058     class CubeMapFace:public Ogre::RenderTargetListener{
00059     public:
00060         CubeMap*mParent;
00061         void preRenderTargetUpdate(const Ogre::RenderTargetEvent& evt);        
00062     };
00063     friend class CubeMapFace;
00064     CubeMapFace mFaces[6];
00065 
00066     int mFaceCounter;
00067     int mMapCounter;
00068     String createMaterialString(const String&materialName);
00069     enum BlendProgress{
00070       DOING_BLENDING,
00071       DONE_BLENDING
00072     };
00073     BlendProgress updateBlendState(const Ogre::FrameEvent&evt);
00074 public:
00075     CubeMap(OgreSystem*parent, const std::vector<String>&cubeMapTexture, int size, const std::vector<Vector3f> &mCameraDelta, const std::vector<float>& nearClipMapDistance);
00076     ~CubeMap();
00077     bool frameEnded(const Ogre::FrameEvent&evt);
00078     void preRenderTargetUpdate(Ogre::Camera*cam,int renderTargetIndex,const Ogre::RenderTargetEvent& evt);
00079 };
00080 }
00081 }
00082 #endif