From 896e809db2fb17c9a0a5b8046ae528fadbbc4764 Mon Sep 17 00:00:00 2001 From: Reuben Chao Date: Sat, 21 Feb 2015 22:43:20 +0800 Subject: [PATCH] fix link error --- build/proj_mac/OpenGLView.h | 2 +- build/proj_mac/OpenGLView.mm | 2 +- build/proj_mac/TinyMacRenderWindow.h | 2 +- build/proj_mac/TinyMacRenderWindow.mm | 3 +- build/proj_mac/TinyResourceManager_mac.mm | 5 +- .../proj_mac.xcodeproj/project.pbxproj | 4 +- .../UserInterfaceState.xcuserstate | Bin 92143 -> 98572 bytes .../xcdebugger/Breakpoints_v2.xcbkptlist | 582 +++++++++++++++++- external/kazmath/kazmath.h | 1 + sample/sample_ocean/OceanDelegate.cpp | 39 +- tiny3d_main/TinyCamera.cpp | 5 + tiny3d_main/TinyCamera.h | 1 + tiny3d_main/TinyCommon.h | 43 +- tiny3d_main/TinyEntity.cpp | 33 +- tiny3d_main/TinyEntity.h | 12 +- tiny3d_main/TinyEntityFactory.cpp | 7 +- tiny3d_main/TinyEntityFactory.h | 6 +- tiny3d_main/TinyGPUProgram.cpp | 48 +- tiny3d_main/TinyGPUProgram.h | 5 +- tiny3d_main/TinyGPUProgramManager.cpp | 13 +- tiny3d_main/TinyGPUProgramManager.h | 6 +- tiny3d_main/TinyHardWareBuffer.cpp | 4 +- tiny3d_main/TinyHardWareBuffer.h | 2 +- tiny3d_main/TinyKeyboard.cpp | 5 + tiny3d_main/TinyMaterialManager.cpp | 2 +- tiny3d_main/TinyMaterialManager.h | 5 +- tiny3d_main/TinyMath.cpp | 20 + tiny3d_main/TinyMath.h | 2 + tiny3d_main/TinyMesh.cpp | 15 +- tiny3d_main/TinyMesh.h | 10 +- tiny3d_main/TinyMeshManager.h | 1 + tiny3d_main/TinyMouse.cpp | 5 + tiny3d_main/TinyMovableObject.cpp | 5 +- tiny3d_main/TinyMovableObject.h | 12 +- tiny3d_main/TinyMovableObjectFactory.cpp | 4 +- tiny3d_main/TinyMovableObjectFactory.h | 14 +- tiny3d_main/TinyNode.cpp | 57 +- tiny3d_main/TinyNode.h | 15 +- tiny3d_main/TinyPlatform.h | 5 +- tiny3d_main/TinyRenderOperation.h | 10 +- tiny3d_main/TinyRenderQueue.cpp | 24 +- tiny3d_main/TinyRenderSystem.cpp | 43 +- tiny3d_main/TinyRenderSystem.h | 4 +- tiny3d_main/TinyRenderTarget.cpp | 6 +- tiny3d_main/TinyRenderTarget.h | 2 +- tiny3d_main/TinyRenderTexture.cpp | 5 +- tiny3d_main/TinyRenderTexture.h | 8 +- tiny3d_main/TinyRenderWindow.cpp | 1 + tiny3d_main/TinyRenderable.cpp | 6 +- tiny3d_main/TinyRoot.h | 4 +- tiny3d_main/TinySceneManager.cpp | 7 + tiny3d_main/TinySceneManager.h | 6 +- tiny3d_main/TinySceneNode.cpp | 16 +- tiny3d_main/TinySceneNode.h | 2 +- tiny3d_main/TinySingleton.h | 19 +- tiny3d_main/TinySubEntity.cpp | 3 +- tiny3d_main/TinySubMesh.cpp | 9 +- tiny3d_main/TinyTexture.cpp | 28 +- tiny3d_main/TinyTexture.h | 2 +- tiny3d_main/TinyTextureManager.cpp | 16 +- tiny3d_main/TinyTextureManager.h | 13 +- tiny3d_main/TinyViewPort.cpp | 3 +- tiny3d_main/TinyViewPort.h | 3 +- 63 files changed, 995 insertions(+), 247 deletions(-) diff --git a/build/proj_mac/OpenGLView.h b/build/proj_mac/OpenGLView.h index 9316ad2..eef9fe2 100644 --- a/build/proj_mac/OpenGLView.h +++ b/build/proj_mac/OpenGLView.h @@ -9,7 +9,7 @@ #ifndef proj_mac_TinyOpenGLView_h #define proj_mac_TinyOpenGLView_h -#import +#import #import #import #include "TinyMouse.h" diff --git a/build/proj_mac/OpenGLView.mm b/build/proj_mac/OpenGLView.mm index 854508a..1a5aea9 100644 --- a/build/proj_mac/OpenGLView.mm +++ b/build/proj_mac/OpenGLView.mm @@ -1,4 +1,4 @@ -// + // // OpenGLView.m // proj_mac // diff --git a/build/proj_mac/TinyMacRenderWindow.h b/build/proj_mac/TinyMacRenderWindow.h index f36860b..8528b22 100644 --- a/build/proj_mac/TinyMacRenderWindow.h +++ b/build/proj_mac/TinyMacRenderWindow.h @@ -22,7 +22,7 @@ namespace Tiny TinyMacRenderWindow(OpenGLView* glView); ~TinyMacRenderWindow(); virtual void preRender(); - virtual void swapBuffers(); + virtual void swapBuffer(); protected: OpenGLView* mGLView; }; diff --git a/build/proj_mac/TinyMacRenderWindow.mm b/build/proj_mac/TinyMacRenderWindow.mm index f6b6798..54aaee8 100644 --- a/build/proj_mac/TinyMacRenderWindow.mm +++ b/build/proj_mac/TinyMacRenderWindow.mm @@ -21,8 +21,9 @@ } - void TinyMacRenderWindow::swapBuffers() + void TinyMacRenderWindow::swapBuffer() { + TINYLOG("swap buffer"); [[mGLView openGLContext] flushBuffer]; } diff --git a/build/proj_mac/TinyResourceManager_mac.mm b/build/proj_mac/TinyResourceManager_mac.mm index f0d0368..cdca96c 100644 --- a/build/proj_mac/TinyResourceManager_mac.mm +++ b/build/proj_mac/TinyResourceManager_mac.mm @@ -6,9 +6,9 @@ // Copyright (c) 2015 reuben chao. All rights reserved. // -#include -#include "TinyResourceManager.h" +#include #import +#include "TinyResourceManager.h" #include "TinyPlatform.h" namespace Tiny @@ -32,7 +32,6 @@ uint8* bytes = (uint8*)[fileData bytes]; memcpy(*data, bytes, dataLength); *data[dataLength] = '\0'; - free(fileData); } } } \ No newline at end of file diff --git a/build/proj_mac/proj_mac.xcodeproj/project.pbxproj b/build/proj_mac/proj_mac.xcodeproj/project.pbxproj index a1403ac..72d3826 100644 --- a/build/proj_mac/proj_mac.xcodeproj/project.pbxproj +++ b/build/proj_mac/proj_mac.xcodeproj/project.pbxproj @@ -643,7 +643,7 @@ "$(PROJECT_DIR)/../../sample", "$(PROJECT_DIR)", ); - INFOPLIST_FILE = proj_mac/Info.plist; + INFOPLIST_FILE = "$(SRCROOT)/Info.plist"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; PRODUCT_NAME = "$(TARGET_NAME)"; }; @@ -663,7 +663,7 @@ "$(PROJECT_DIR)/../../sample", "$(PROJECT_DIR)", ); - INFOPLIST_FILE = proj_mac/Info.plist; + INFOPLIST_FILE = "$(SRCROOT)/Info.plist"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; PRODUCT_NAME = "$(TARGET_NAME)"; }; diff --git a/build/proj_mac/proj_mac.xcodeproj/project.xcworkspace/xcuserdata/reuben.xcuserdatad/UserInterfaceState.xcuserstate b/build/proj_mac/proj_mac.xcodeproj/project.xcworkspace/xcuserdata/reuben.xcuserdatad/UserInterfaceState.xcuserstate index 82ebb89fe60418757bddcc491a43e9fd553bca0b..e4dc2139955d15e35c5141e50cb6afbfb6bfa7a4 100644 GIT binary patch literal 98572 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 literal 92143 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
    Qzr2F==(g+| zDj!8(mCk$tomBdwi;4~^BN@#YbWzboMHiK;nTk0p_PgR;D&D2?Zw_%7GgUss9hLv$ zO)BQ9n5$y0in*%o=s-u#M2_lE^jdw0M{$02CwuVyRCQLBz3Mxvy07ZKs{5+$s~+Jv zC(viLL@fx~8aNH_-{y|Cu5_b2J?VqF+XkYuHuJWP}ohWhe(h%}ljUxTDq^=hg=Eb%rvWQ8Y4%t8hon9W{5M-C6bd+`*mvlqJYrzmL^C$XeF%Fk5+??K}}^ zkWO@=E8TdFL%hp-d=NA=e1kE3hjEN&E4z7~J?!Og{GEUBI&X5Aqr}Klrj1(QKj5MR z9XSITB0cC$e}*!W(YQZyITM(~WTtZi3s}e^7PE}IxrbG(VFO$EGcWKG`*;O2N92th tK<3EXm_K6v$Z<{}eb$7{XeS%YP$dc diff --git a/build/proj_mac/proj_mac.xcodeproj/xcuserdata/reuben.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/build/proj_mac/proj_mac.xcodeproj/xcuserdata/reuben.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist index f4151b5..7d964b1 100644 --- a/build/proj_mac/proj_mac.xcodeproj/xcuserdata/reuben.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +++ b/build/proj_mac/proj_mac.xcodeproj/xcuserdata/reuben.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist @@ -10,11 +10,11 @@ ignoreCount = "0" continueAfterRunningActions = "No" filePath = "../../tiny3d_main/TinyMouse.cpp" - timestampString = "444741898.99632" + timestampString = "446192157.727939" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "44" - endingLineNumber = "44"> + startingLineNumber = "49" + endingLineNumber = "49"> @@ -56,11 +56,11 @@ ignoreCount = "0" continueAfterRunningActions = "No" filePath = "../../tiny3d_main/TinyRenderTarget.h" - timestampString = "444812581.671203" + timestampString = "446192157.727939" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "19" - endingLineNumber = "19"> + startingLineNumber = "20" + endingLineNumber = "20"> + startingLineNumber = "14" + endingLineNumber = "14"> @@ -100,11 +100,11 @@ ignoreCount = "0" continueAfterRunningActions = "No" filePath = "../../tiny3d_main/TinyRoot.cpp" - timestampString = "444825188.211632" + timestampString = "446192157.727939" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "20" - endingLineNumber = "20" + startingLineNumber = "21" + endingLineNumber = "21" landmarkName = "TinyRoot::TinyRoot()" landmarkType = "5"> @@ -116,11 +116,11 @@ ignoreCount = "0" continueAfterRunningActions = "No" filePath = "../../tiny3d_main/TinyRenderSystem.cpp" - timestampString = "444901123.066328" + timestampString = "446220396.051367" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "49" - endingLineNumber = "49" + startingLineNumber = "58" + endingLineNumber = "58" landmarkName = "TinyRenderSystem::setRenderTarget(TinyRenderTarget *target)" landmarkType = "5"> @@ -146,11 +146,11 @@ ignoreCount = "0" continueAfterRunningActions = "No" filePath = "../../tiny3d_main/TinyRenderSystem.cpp" - timestampString = "444905206.536551" + timestampString = "446220396.051367" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "58" - endingLineNumber = "58"> + startingLineNumber = "68" + endingLineNumber = "68"> @@ -243,5 +243,537 @@ landmarkType = "2"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/external/kazmath/kazmath.h b/external/kazmath/kazmath.h index ef09870..fcd63b4 100755 --- a/external/kazmath/kazmath.h +++ b/external/kazmath/kazmath.h @@ -28,6 +28,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "vec2.h" #include "vec3.h" +#include "vec4.h" #include "mat3.h" #include "mat4.h" #include "utility.h" diff --git a/sample/sample_ocean/OceanDelegate.cpp b/sample/sample_ocean/OceanDelegate.cpp index 3008088..02d449d 100644 --- a/sample/sample_ocean/OceanDelegate.cpp +++ b/sample/sample_ocean/OceanDelegate.cpp @@ -12,19 +12,25 @@ #include "TinySceneManager.h" #include "TinyDelegate.h" #include "TinyPlatform.h" -#include "TinyTextureManager.h"; +#include "TinyTextureManager.h" #include "TinyRenderWindow.h" #include "kazmath/kazmath.h" #include "TinyEntityFactory.h" -#include "TinyEntity.h"; +#include "TinyEntity.h" #include "TinyMath.h" +#include "TinyGPUProgramManager.h" +#include "TinyMaterialManager.h" +#include "TinyInputManager.h" namespace Tiny { void TinyDelegate::initialize() { //Create TinyRoot. - TinyRoot* root = TINY_NEW TinyRoot(); + TinyRoot* root = TinyRoot::getSingleton(); + + Tiny::TinyInputManager::getSingleton()->createInputObject(Tiny::InputDevice::Mouse); + Tiny::TinyInputManager::getSingleton()->createInputObject(Tiny::InputDevice::Keyboard); //Create render window. TinyRenderWindow* mainWindow = tinyCreateRenderWindow(0, 0); @@ -37,34 +43,39 @@ namespace Tiny TinySceneNode* entityNode = rootNode->createChildSceneNode(); kmVec3 entityNodePosition = kmVec3Make(0, 0, -0.5); entityNode->setPosition(entityNodePosition); - rootNode->addChild(entityNode); //Camera node. TinySceneNode* cameraNode = rootNode->createChildSceneNode(); kmVec3 cameraNodePosition = kmVec3Make(0, 0, 0); cameraNode->setPosition(cameraNodePosition); - rootNode->addChild(cameraNode); //Create an entity and attach it to our scene graph. - TinyEntityFactory* factory = root->getMovableObjectFactory("Entity"); - TinyEntity* entity = factory->createInstance(); + std::string entityFactoryNameStr("Entity"); + TinyEntityFactory* factory = dynamic_cast(root->getMovableObjectFactory(entityFactoryNameStr)); + TinyNameValuePairList params; + const int8* meshName = "first_mesh.obj"; + params["mesh"] = meshName; + std::string entityNameStr("first_entity"); + TinyEntity* entity = dynamic_cast(factory->createInstance(entityNameStr, params)); entityNode->attachObject(entity); //Create camera. - TinyCamera* camera = TINY_NEW TinyCamera(); - mainWindow->addViewPort(camera); + std::string cameraNameStr("camera"); + TinyCamera* camera = TINY_NEW TinyCamera(cameraNameStr, sceneMgr); + mainWindow->addViewPort(camera, 0, 0, 0, 1, 1); cameraNode->attachObject(camera); //Create a diffuse texture. - TinyTexture* texture = TinyTextureManager::getSingleton()->load("first_demo.png"); + std::string textureName("first_demo.png"); + TinyTexture* texture = TinyTextureManager::getSingleton()->load(textureName); //Create a gpu program, set diffuse texture to our program as parameter. - TinyProgram* program = TinyProgramManager::getSingleton()->load("first_demo.vs", "first_demo.fs"); + TinyGPUProgram* program = TinyGPUProgramManager::getSingleton()->load("first_demo.vs", "first_demo.fs"); TinyGPUProgramParameter param; - param.mName = "diffuseTexture" - param.mType = GP_SAMPLER + param.mName = "diffuseTexture"; + param.mType = GP_SAMPLER; param.mBindData = texture->getHandlerPtr(); - program->setParameter(const TinyGPUProgramParameter& value); + program->setParameter(param); //Create material with gpu program. TODO assemble program form script. TinyMaterial* material = TinyMaterialManager::getSingleton()->load("first_demo.material"); diff --git a/tiny3d_main/TinyCamera.cpp b/tiny3d_main/TinyCamera.cpp index e6abbaa..f100a22 100755 --- a/tiny3d_main/TinyCamera.cpp +++ b/tiny3d_main/TinyCamera.cpp @@ -74,6 +74,11 @@ namespace Tiny { kmMat4PerspectiveProjection(&ret, mFov, mAspect, mNear, mFar); } + + void TinyCamera::updateRenderQueue(TinyCamera* cam, TinyRenderQueue* queue) + { + // + } } //- (void)updateInput:(NSTimeInterval)timeInterval diff --git a/tiny3d_main/TinyCamera.h b/tiny3d_main/TinyCamera.h index b4f56c6..b396095 100755 --- a/tiny3d_main/TinyCamera.h +++ b/tiny3d_main/TinyCamera.h @@ -30,6 +30,7 @@ namespace Tiny TinyViewPort *getViewPort(); void getViewMatrix(kmMat4& ret); void getProjectionMatrix(kmMat4& ret); + void updateRenderQueue(TinyCamera* cam, TinyRenderQueue* queue); private: TinyViewPort *mLastViewPort; TinySceneManager *mSceneMgr; diff --git a/tiny3d_main/TinyCommon.h b/tiny3d_main/TinyCommon.h index dec5992..b712f12 100644 --- a/tiny3d_main/TinyCommon.h +++ b/tiny3d_main/TinyCommon.h @@ -10,11 +10,52 @@ #define proj_mac_TinyCommon_h #include +#include #include +#include namespace Tiny { - typedef std::map TinyNameValuePairList; + typedef std::map TinyNameValuePairList; + + class TinyNameGenerator + { + protected: + std::string mPrefix; + unsigned long long int mNext; + public: +// TinyNameGenerator(const TinyNameGenerator& rhs) +// : mPrefix(rhs.mPrefix), mNext(rhs.mNext) {} + + TinyNameGenerator(const std::string prefix) : mPrefix(prefix), mNext(1) {} + + /// Generate a new name + std::string generate() + { + std::ostringstream s; + s << mPrefix << mNext++; + return s.str(); + } + + /// Reset the internal counter + void reset() + { + mNext = 1ULL; + } + + /// Manually set the internal counter (use caution) + void setNext(unsigned long long int val) + { + mNext = val; + } + + /// Get the internal counter + unsigned long long int getNext() const + { + // lock even on get because 64-bit may not be atomic read + return mNext; + } + }; } #endif diff --git a/tiny3d_main/TinyEntity.cpp b/tiny3d_main/TinyEntity.cpp index 86867b0..691ef2c 100644 --- a/tiny3d_main/TinyEntity.cpp +++ b/tiny3d_main/TinyEntity.cpp @@ -7,21 +7,30 @@ // #include +#include "TinyEntity.h" #include "TinyMovableObject.h" +#include "TinyRenderQueue.h" +#include "TinySubEntity.h" +#include "TinyMesh.h" +#include "TinyMemoryAlloc.h" namespace Tiny { TinyEntity::TinyEntity(std::string& name, TinyMesh* mesh) : TinyMovableObject(name) { - mName = name; mMesh = mesh; initialize(); } TinyEntity::~TinyEntity() { - + auto iter = mSubEntitys.begin(); + for (; iter <= mSubEntitys.end(); iter ++) + { + TinySubEntity* subEnt = *iter; + TINY_DELETE subEnt; + } } void TinyEntity::initialize() @@ -43,9 +52,9 @@ namespace Tiny void TinyEntity::updateRenderQueue(TinyCamera* cam, TinyRenderQueue* queue) { auto iter = mSubEntitys.begin(); - for (; iter <= mSubEntitys.end(); iter ++) + for (; iter != mSubEntitys.end(); iter ++) { - queue->addRenderable(iter->second, mRenderQueueGroupID, mRenderPriority); + queue->addRenderable(*iter, mRenderQueueGroupID, mRenderPriority); } } @@ -58,4 +67,18 @@ namespace Tiny { mRenderPriority = priority; } -} \ No newline at end of file + + void TinyEntity::setMaterial(TinyMaterial* material) + { + mMaterial = material; + auto iter = mSubEntitys.begin(); + for (; iter != mSubEntitys.end(); iter ++) + { + TinySubEntity* subEnt = *iter; + subEnt->setMaterial(mMaterial); + } + } +} + + + diff --git a/tiny3d_main/TinyEntity.h b/tiny3d_main/TinyEntity.h index bc8dd1d..86eef0f 100644 --- a/tiny3d_main/TinyEntity.h +++ b/tiny3d_main/TinyEntity.h @@ -9,16 +9,19 @@ #ifndef proj_mac_TinyEntity_h #define proj_mac_TinyEntity_h -#include "TinyObject.h" -#include "TinyRenderQueue.h" -#include "TinyMovableObject.h" -#include "TinySubEntity.h" #include #include +#include "TinyObject.h" #include "TinyPlatform.h" +#include "TinyMovableObject.h" namespace Tiny { + class TinyRenderQueue; + class TinySubEntity; + class TinyMesh; + class TinyMaterial; + class TinyEntity : public TinyMovableObject { public: @@ -36,6 +39,7 @@ namespace Tiny uint8 mRenderQueueGroupID; uint8 mRenderPriority; TinyMesh* mMesh; + TinyMaterial* mMaterial; }; } diff --git a/tiny3d_main/TinyEntityFactory.cpp b/tiny3d_main/TinyEntityFactory.cpp index 1329189..f390cde 100644 --- a/tiny3d_main/TinyEntityFactory.cpp +++ b/tiny3d_main/TinyEntityFactory.cpp @@ -8,10 +8,12 @@ #include "TinyEntityFactory.h" #include "TinyMeshManager.h" +#include "TinyMemoryAlloc.h" +#include "TinyEntity.h" namespace Tiny { - std::string TinyEntityFactory::mType = "Entity" + std::string TinyEntityFactory::mType = "Entity"; std::string& TinyEntityFactory::getType() { @@ -23,7 +25,8 @@ namespace Tiny auto iter = params.find("mesh"); if (iter != params.end()) { - TinyMesh* mesh = TinyMeshManager::getSingleton()->load(iter->second); + auto nameStr = std::string((char*)iter->second); + TinyMesh* mesh = TinyMeshManager::getSingleton()->load(nameStr); return TINY_NEW TinyEntity(name, mesh); } else diff --git a/tiny3d_main/TinyEntityFactory.h b/tiny3d_main/TinyEntityFactory.h index 2704d3c..a08a1f3 100644 --- a/tiny3d_main/TinyEntityFactory.h +++ b/tiny3d_main/TinyEntityFactory.h @@ -10,17 +10,19 @@ #define __proj_mac__TinyEntityFactory__ #include +#include #include "TinyMovableObjectFactory.h" #include "TinyMesh.h" #include "TinySubMesh.h" -#include +#include "TinyCommon.h" +#include "TinySubEntity.h" namespace Tiny { class TinyEntityFactory : public TinyMovableObjectFactory { public: - std::string& getType(); + virtual std::string& getType(); static std::string mType; virtual TinyMovableObject* createInstanceImpl(std::string& name, TinyNameValuePairList& params); protected: diff --git a/tiny3d_main/TinyGPUProgram.cpp b/tiny3d_main/TinyGPUProgram.cpp index 4a6b03f..95e3e18 100644 --- a/tiny3d_main/TinyGPUProgram.cpp +++ b/tiny3d_main/TinyGPUProgram.cpp @@ -13,10 +13,10 @@ namespace Tiny { TinyGPUProgram::TinyGPUProgram(std::string& vs, std::string& fs) - : mParams(TINY_NEW TinyGPUProgramParameters()), + : mParams(TINY_NEW TinyGPUProgramParameters()) , mHandler(0) - , mVertexShaderSource(vs); - , mFragmentShaderSource(fs); + , mVertexShaderSource(vs) + , mFragmentShaderSource(fs) { // } @@ -38,13 +38,15 @@ namespace Tiny char *programInfoMessage = nullptr; // Compile Vertex Shader - glShaderSource(vertexShader, 1, &mVertexShaderSource , NULL); + const char* vSourceStr = mVertexShaderSource.c_str(); + glShaderSource(vertexShader, 1, &vSourceStr, NULL); glCompileShader(vertexShader); // Check Vertex Shader glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &result); glGetShaderiv(vertexShader, GL_INFO_LOG_LENGTH, &infoLogLength); - if (infoLogLength > 0) { + if (infoLogLength > 0) + { shaderInfoMessage = (char *)malloc(infoLogLength + 1); glGetShaderInfoLog(vertexShader, infoLogLength, NULL, shaderInfoMessage); TINYLOG("vertex shder info: %s", shaderInfoMessage); @@ -52,7 +54,8 @@ namespace Tiny } // Compile Fragment Shader - glShaderSource(fragmentShader, 1, &mFragmentShaderSource , NULL); + const char* fSourceStr = mFragmentShaderSource.c_str(); + glShaderSource(fragmentShader, 1, &fSourceStr , NULL); glCompileShader(fragmentShader); // Check Fragment Shader @@ -130,64 +133,65 @@ namespace Tiny { case GP_FLOAT1: { - glUniform1fv(location, 1, iter->second.mBindData); + glUniform1fv(location, 1, (GLfloat*)iter->second.mBindData); break; } case GP_FLOAT2: { - glUniform2fv(location, 1, iter->second.mBindData); + glUniform2fv(location, 1, (GLfloat*)iter->second.mBindData); break; } case GP_FLOAT3: { - glUniform3fv(location, 1, iter->second.mBindData); + glUniform3fv(location, 1, (GLfloat*)iter->second.mBindData); break; } case GP_FLOAT4: { - glUniform14v(location, 1, iter->second.mBindData); + glUniform4fv(location, 1, (GLfloat*)iter->second.mBindData); break; } case GP_INT1: { - glUniform1iv(location, 1, iter->second.mBindData); + glUniform1iv(location, 1, (GLint*)iter->second.mBindData); break; } case GP_INT2: { - glUniform2iv(location, 1, iter->second.mBindData); + glUniform2iv(location, 1, (GLint*)iter->second.mBindData); break; } case GP_INT3: { - glUniform3iv(location, 1, iter->second.mBindData); + glUniform3iv(location, 1, (GLint*)iter->second.mBindData); break; } case GP_INT4: { - glUniform4iv(location, 1, iter->second.mBindData); + glUniform4iv(location, 1, (GLint*)iter->second.mBindData); break; } case GP_MATRIX_2X2: { - glUniformMatrix2fv(location, 1, GL_FALSE, iter->second.mBindData); + glUniformMatrix2fv(location, 1, GL_FALSE, (GLfloat*)iter->second.mBindData); break; } case GP_MATRIX_3X3: { - glUniformMatrix3fv(location, 1, GL_FALSE, iter->second.mBindData); + glUniformMatrix3fv(location, 1, GL_FALSE, (GLfloat*)iter->second.mBindData); break; } case GP_MATRIX_4X4: { - glUniformMatrix4fv(location, 1, GL_FALSE, iter->second.mBindData); + glUniformMatrix4fv(location, 1, GL_FALSE, (GLfloat*)iter->second.mBindData); break; } case GP_SAMPLER: { glActiveTexture(GL_TEXTURE0 + textureCnter); - glEnable(GL_TEXTURE_MAP); - glBindTexture(GL_TEXTURE_MAP, cubeTexture); + glEnable(GL_TEXTURE_2D); + auto textureID = *(GLuint*)iter->second.mBindData; + glBindTexture(GL_TEXTURE_2D, textureID); glUniform1i(location, textureCnter); ++ textureCnter; break; @@ -196,7 +200,8 @@ namespace Tiny { glActiveTexture(GL_TEXTURE0 + textureCnter); glEnable(GL_TEXTURE_CUBE_MAP); - glBindTexture(GL_TEXTURE_CUBE_MAP, cubeTexture); + auto textureID = *(GLuint*)iter->second.mBindData; + glBindTexture(GL_TEXTURE_CUBE_MAP, textureID); glUniform1i(location, textureCnter); ++ textureCnter; break; @@ -209,7 +214,8 @@ namespace Tiny void TinyGPUProgramParameter::calcLocation(GLuint program) { - mLocation = glGetUniformLocation(program, mName); + const GLchar* nameStr = mName.c_str(); + mLocation = glGetUniformLocation(program, nameStr); } } diff --git a/tiny3d_main/TinyGPUProgram.h b/tiny3d_main/TinyGPUProgram.h index c570aec..44f2b4b 100644 --- a/tiny3d_main/TinyGPUProgram.h +++ b/tiny3d_main/TinyGPUProgram.h @@ -9,10 +9,11 @@ #ifndef __proj_mac__TinyGPUProgram__ #define __proj_mac__TinyGPUProgram__ -#include -#include "TinyObject.h" +#include +#include #include #include +#include "TinyObject.h" #include "TinyPlatform.h" namespace Tiny diff --git a/tiny3d_main/TinyGPUProgramManager.cpp b/tiny3d_main/TinyGPUProgramManager.cpp index e37ed1e..69a1705 100755 --- a/tiny3d_main/TinyGPUProgramManager.cpp +++ b/tiny3d_main/TinyGPUProgramManager.cpp @@ -7,6 +7,7 @@ // #include "TinyGPUProgramManager.h" +#include "TinyMemoryAlloc.h" #include namespace Tiny @@ -21,15 +22,17 @@ namespace Tiny } - TinyGPUProgram* TinyGPUProgramManager::load(std::string& vFileName, std::string& fFileName) + TinyGPUProgram* TinyGPUProgramManager::load(std::string vFileName, std::string fFileName) { - uint8* vData, fData; - uint32 vLength, fLength; + uint8* vData; + uint8* fData; + uint32 vLength; + uint32 fLength; getFileData(vFileName, &vData, vLength); getFileData(fFileName, &fData, fLength); - std::string vStrData = vData; - std::string fStrData = fData; + std::string vStrData = std::string((char*)vData); + std::string fStrData = std::string((char*)fData); auto program = TINY_NEW TinyGPUProgram(vStrData, fStrData); program->load(); return program; diff --git a/tiny3d_main/TinyGPUProgramManager.h b/tiny3d_main/TinyGPUProgramManager.h index f72c91d..7997f4d 100755 --- a/tiny3d_main/TinyGPUProgramManager.h +++ b/tiny3d_main/TinyGPUProgramManager.h @@ -16,12 +16,14 @@ namespace Tiny { - class TinyGPUProgramManager : public TinyResourceManager, public TinySingleton + class TinyMeshManager; + + class TinyGPUProgramManager : public TinyResourceManager, public TinySingleton { public: TinyGPUProgramManager(); ~TinyGPUProgramManager(); - TinyGPUProgram* load(std::string& vFileName, std::string& fFileName); + TinyGPUProgram* load(std::string vFileName, std::string fFileName); protected: }; } diff --git a/tiny3d_main/TinyHardWareBuffer.cpp b/tiny3d_main/TinyHardWareBuffer.cpp index 157b011..aac915b 100644 --- a/tiny3d_main/TinyHardWareBuffer.cpp +++ b/tiny3d_main/TinyHardWareBuffer.cpp @@ -21,10 +21,10 @@ namespace Tiny } - void TinyHardwareBuffer::readData(unsigned char* data, uint32 length, GLenum target, GLenum usage) + void TinyHardwareBuffer::readData(const uint8* data, uint32 length, GLenum target, GLenum usage) { glBindBuffer(target, mHandler); - glBufferData(target, &length, data, usage); + glBufferData(target, length, data, usage); } GLuint TinyHardwareBuffer::getHandler() diff --git a/tiny3d_main/TinyHardWareBuffer.h b/tiny3d_main/TinyHardWareBuffer.h index ff6cee2..c52c726 100644 --- a/tiny3d_main/TinyHardWareBuffer.h +++ b/tiny3d_main/TinyHardWareBuffer.h @@ -20,7 +20,7 @@ namespace Tiny public: TinyHardwareBuffer(); ~TinyHardwareBuffer(); - virtual void readData(unsigned char* data, uint32 length, GLenum target, GLenum usage); + virtual void readData(const uint8* data, uint32 length, GLenum target, GLenum usage); GLuint getHandler(); protected: GLuint mHandler; diff --git a/tiny3d_main/TinyKeyboard.cpp b/tiny3d_main/TinyKeyboard.cpp index 8d6b1b2..02b675a 100644 --- a/tiny3d_main/TinyKeyboard.cpp +++ b/tiny3d_main/TinyKeyboard.cpp @@ -29,6 +29,11 @@ namespace Tiny return ret; } + void TinyKeyboard::initialize() + { + + } + void TinyKeyboard::addEventCallBack(TinyKeyListener* listener) { auto listenerIter = mListeners.find(listener); diff --git a/tiny3d_main/TinyMaterialManager.cpp b/tiny3d_main/TinyMaterialManager.cpp index bc8c5bd..95279aa 100644 --- a/tiny3d_main/TinyMaterialManager.cpp +++ b/tiny3d_main/TinyMaterialManager.cpp @@ -11,7 +11,7 @@ namespace Tiny { - TinyMaterial* TinyMaterialManager::load(std::string& fileName) + TinyMaterial* TinyMaterialManager::load(std::string fileName) { //TODO return TINY_NEW TinyMaterial(); diff --git a/tiny3d_main/TinyMaterialManager.h b/tiny3d_main/TinyMaterialManager.h index 69e0601..f150b14 100644 --- a/tiny3d_main/TinyMaterialManager.h +++ b/tiny3d_main/TinyMaterialManager.h @@ -17,9 +17,10 @@ namespace Tiny { - class TinyMaterialManager : public TinyResourceManager, public TinySingleton + class TinyMaterialManager : public TinyResourceManager, public TinySingleton { - TinyMaterial* load(std::string& fileName); + public: + TinyMaterial* load(std::string fileName); }; } diff --git a/tiny3d_main/TinyMath.cpp b/tiny3d_main/TinyMath.cpp index 79f6de7..e9c0ceb 100644 --- a/tiny3d_main/TinyMath.cpp +++ b/tiny3d_main/TinyMath.cpp @@ -10,6 +10,16 @@ namespace Tiny { + kmVec4 kmVec4Make(float x, float y, float z, float w) + { + kmVec4 ret; + ret.x = x; + ret.y = y; + ret.z = z; + ret.w = w; + return ret; + } + kmVec3 kmVec3Make(float x, float y, float z) { kmVec3 ret; @@ -26,4 +36,14 @@ namespace Tiny ret.y = y; return ret; } + + kmQuaternion kmQuaternionMake(float x, float y, float z, float w) + { + kmQuaternion ret; + ret.x = x; + ret.y = y; + ret.z = z; + ret.w = w; + return ret; + } } \ No newline at end of file diff --git a/tiny3d_main/TinyMath.h b/tiny3d_main/TinyMath.h index c305375..1ce715c 100644 --- a/tiny3d_main/TinyMath.h +++ b/tiny3d_main/TinyMath.h @@ -15,6 +15,8 @@ namespace Tiny { + kmQuaternion kmQuaternionMake(float x, float y, float z, float w); + kmVec4 kmVec4Make(float x, float y, float z, float w); kmVec3 kmVec3Make(float x, float y, float z); kmVec2 kmVec2Make(float x, float y); const float kTinyPI = 4 * atan(1); diff --git a/tiny3d_main/TinyMesh.cpp b/tiny3d_main/TinyMesh.cpp index 4ce61a8..fc56b29 100644 --- a/tiny3d_main/TinyMesh.cpp +++ b/tiny3d_main/TinyMesh.cpp @@ -17,12 +17,13 @@ namespace Tiny } - virtual TinyMesh::~TinyMesh() + TinyMesh::~TinyMesh() { - auto iter = subMesh.begin(); - for (; iter != subMesh.end(); iter ++) + auto iter = mSubMeshs.begin(); + for (; iter != mSubMeshs.end(); iter ++) { - TINY_DELETE iter->second; + TinySubMesh* subMesh = *iter; + TINY_DELETE subMesh; } } @@ -30,7 +31,7 @@ namespace Tiny { uint8* data = nullptr;//TODO load from file - auto subMesh = TINY_NEW TinySubMesh(this); + TinySubMesh* subMesh = TINY_NEW TinySubMesh(); uint32 offset = 0; for (int i = 0; i < 1; i ++) { @@ -39,8 +40,8 @@ namespace Tiny } } - VectorIteratorWrapper TinyMesh::getSubmeshIterator() + VectorIteratorWrapper TinyMesh::getSubmeshIterator() { - return VectorIteratorWrapper(mSubMeshs.begin(), mSubMeshs.end()); + return VectorIteratorWrapper(mSubMeshs.begin(), mSubMeshs.end()); } } \ No newline at end of file diff --git a/tiny3d_main/TinyMesh.h b/tiny3d_main/TinyMesh.h index 4fa6c40..a26535d 100644 --- a/tiny3d_main/TinyMesh.h +++ b/tiny3d_main/TinyMesh.h @@ -9,23 +9,23 @@ #ifndef proj_mac_TinyMesh_h #define proj_mac_TinyMesh_h -#include "TinyObject.h" -#include "TinySubMesh.h" #include -#include "TinyIteratorWrapper.h" #include +#include "TinyObject.h" +#include "TinyIteratorWrapper.h" #include "TinyPlatform.h" +#include "TinySubMesh.h" namespace Tiny { - typedef std::vector SubMeshList; class TinyMesh : public TinyObject { public: + typedef std::vector SubMeshList; TinyMesh(std::string& fileName); virtual ~TinyMesh(); void load(); - VectorIteratorWrapper::iterator > getSubmeshIterator(); + VectorIteratorWrapper getSubmeshIterator(); public: SubMeshList mSubMeshs; std::string mFileName; diff --git a/tiny3d_main/TinyMeshManager.h b/tiny3d_main/TinyMeshManager.h index 11de4de..f1bbc1a 100644 --- a/tiny3d_main/TinyMeshManager.h +++ b/tiny3d_main/TinyMeshManager.h @@ -18,6 +18,7 @@ namespace Tiny { class TinyMeshManager : public TinyResourceManager, public TinySingleton { + public: virtual TinyMesh* load(std::string& fileName); }; } diff --git a/tiny3d_main/TinyMouse.cpp b/tiny3d_main/TinyMouse.cpp index 28fa8c8..3f5cb31 100644 --- a/tiny3d_main/TinyMouse.cpp +++ b/tiny3d_main/TinyMouse.cpp @@ -36,6 +36,11 @@ namespace Tiny return ret; } + void TinyMouse::initialize() + { + // + } + void TinyMouse::setLocation(kmVec2 *location) { mLocation.x = location->x; diff --git a/tiny3d_main/TinyMovableObject.cpp b/tiny3d_main/TinyMovableObject.cpp index 960d826..d06637b 100644 --- a/tiny3d_main/TinyMovableObject.cpp +++ b/tiny3d_main/TinyMovableObject.cpp @@ -7,12 +7,15 @@ // #include "TinyMovableObject.h" +#include "TinyCamera.h" +#include "TinyRenderQueue.h" +#include "TinyNode.h" namespace Tiny { TinyMovableObject::TinyMovableObject(std::string& name) : mParentNode(nullptr) - : mName(name) + , mName(name) { } diff --git a/tiny3d_main/TinyMovableObject.h b/tiny3d_main/TinyMovableObject.h index e854713..d29c4cc 100644 --- a/tiny3d_main/TinyMovableObject.h +++ b/tiny3d_main/TinyMovableObject.h @@ -10,14 +10,16 @@ #define __proj_mac__TinyMovableObject__ #include -#include "TinyObject.h" #include +#include "TinyObject.h" #include "kazmath/kazmath.h" -#include "TinyCamera.h" - -class TinyNode; -namespace Tiny { +namespace Tiny +{ + class TinyNode; + class TinyRenderQueue; + class TinyCamera; + class TinyMovableObject : public TinyObject { public: diff --git a/tiny3d_main/TinyMovableObjectFactory.cpp b/tiny3d_main/TinyMovableObjectFactory.cpp index a41bf19..f0c062a 100644 --- a/tiny3d_main/TinyMovableObjectFactory.cpp +++ b/tiny3d_main/TinyMovableObjectFactory.cpp @@ -20,8 +20,8 @@ namespace Tiny } - TinyMovableObject* TinyMovableObjectFactory::createInstance() + TinyMovableObject* TinyMovableObjectFactory::createInstance(std::string& name, TinyNameValuePairList& params) { - return createInstanceImpl(); + return createInstanceImpl(name, params); } } \ No newline at end of file diff --git a/tiny3d_main/TinyMovableObjectFactory.h b/tiny3d_main/TinyMovableObjectFactory.h index 119ce42..d2664a0 100644 --- a/tiny3d_main/TinyMovableObjectFactory.h +++ b/tiny3d_main/TinyMovableObjectFactory.h @@ -6,25 +6,27 @@ // Copyright (c) 2015 reuben chao. All rights reserved. // -#ifndef __proj_mac__MovableObjectFactory__ -#define __proj_mac__MovableObjectFactory__ +#ifndef __proj_mac__TinyMovableObjectFactory__ +#define __proj_mac__TinyMovableObjectFactory__ #include #include +#include "TinyObject.h" #include "TinyMovableObject.h" +#include "TinyCommon.h" namespace Tiny { - class TinyMovableObjectFactory() + class TinyMovableObjectFactory : public TinyObject { public: TinyMovableObjectFactory(); virtual ~TinyMovableObjectFactory(); virtual std::string& getType() = 0; - virtual TinyMovableObject* createInstance(); - virtual TinyMovableObject* createInstanceImpl() = 0; + virtual TinyMovableObject* createInstance(std::string& name, TinyNameValuePairList& params); + virtual TinyMovableObject* createInstanceImpl(std::string& name, TinyNameValuePairList& params) = 0; protected: - } + }; } #endif /* defined(__proj_mac__MovableObjectFactory__) */ diff --git a/tiny3d_main/TinyNode.cpp b/tiny3d_main/TinyNode.cpp index e2eccc7..ab546c7 100644 --- a/tiny3d_main/TinyNode.cpp +++ b/tiny3d_main/TinyNode.cpp @@ -8,16 +8,19 @@ #include "TinyNode.h" #include "TinyMemoryAlloc.h" +#include "TinyMath.h" namespace Tiny { - TinyNode::TinyNode(std::string &name) - : mPosition(0, 0, 0) - , mDerivedPosition(0, 0, 0) - , mOrientation(0, 0, 0, 1) - , mDerivedOrientation(0, 0, 0, 1) - , mScale(0, 0, 0) - , mDerivedScale(0, 0, 0) + TinyNameGenerator TinyNode::mNameGenerator("node"); + + TinyNode::TinyNode(std::string name) + : mPosition(kmVec3Make(0, 0, 0)) + , mDerivedPosition(kmVec3Make(0, 0, 0)) + , mOrientation(kmQuaternionMake(0, 0, 0, 1)) + , mDerivedOrientation(kmQuaternionMake(0, 0, 0, 1)) + , mScale(kmVec3Make(0, 0, 0)) + , mDerivedScale(kmVec3Make(0, 0, 0)) , mParent(nullptr) , mName(name) { @@ -31,36 +34,30 @@ namespace Tiny TinyNode* TinyNode::createChild() { - auto child = TINY_NEW TinyNode(); - addChild(node); - return node; + auto child = TINY_NEW TinyNode(mNameGenerator.generate()); + addChild(child); + return child; } void TinyNode::addChild(TinyNode *node) { - if (node->getParent()) - { - assert(result.second && "Child was not added because it has already added to a parent"); - } - else - { - auto result = mChildren->insert(std::pair(node->getName(), node)); - assert(result.second && "Child was not added because of a doublicate name."); - node->setParent(this); - } + assert(!node->getParent()&& "Child was not added because it has already added to a parent"); + auto result = mChildren.insert(std::pair(node->getName(), node)); + assert(result.second && "Child was not added because of a doublicate name."); + node->setParent(this); } void TinyNode::removeChild(TinyNode *node) { - mChildren->erase(node->getname()); + mChildren.erase(node->getName()); node->setParent(nullptr); } - void TinyNode::getChild(std::string& name) + TinyNode* TinyNode::getChild(std::string name) { TinyNode* ret = nullptr; - auto iter = mChildren->find(name); - if (iter != mChildren->end()) + auto iter = mChildren.find(name); + if (iter != mChildren.end()) { ret = iter->second; } @@ -72,13 +69,15 @@ namespace Tiny if (mParent) { auto parentDerivedPosition = mParent->getDerivedPosition(); - mDerivedPosition = parentDerivedPosition + mPosition; + kmVec3Add(&mDerivedPosition, &parentDerivedPosition, &mPosition); auto parentDerivedOrientation = mParent->getDerivedOrientation(); kmQuaternionMultiply(&mDerivedOrientation, &parentDerivedOrientation, &mOrientation); auto parentDerivedScale = mParent->getScale(); - kmVec3Dot(&mDerivedScale, &parentDerivedScale, &mScale); + mDerivedScale.x = parentDerivedScale.x * mScale.x; + mDerivedScale.y = parentDerivedScale.y * mScale.y; + mDerivedScale.z = parentDerivedScale.z * mScale.z; } else { @@ -91,8 +90,8 @@ namespace Tiny void TinyNode::update() { updateFromParent(); - auto iter = mChildren->begin(); - for (; iter != mChildren->end(); iter ++) + auto iter = mChildren.begin(); + for (; iter != mChildren.end(); iter ++) { iter->second->update(); } @@ -123,7 +122,7 @@ namespace Tiny return mScale; } - kmVec3& TinyNode::getOrientation() + kmQuaternion& TinyNode::getOrientation() { return mOrientation; } diff --git a/tiny3d_main/TinyNode.h b/tiny3d_main/TinyNode.h index 2852db2..10838ed 100644 --- a/tiny3d_main/TinyNode.h +++ b/tiny3d_main/TinyNode.h @@ -10,10 +10,12 @@ #define __proj_mac__TinyNode__ #include -#include "TinyObject.h" #include #include #include +#include "kazmath/kazmath.h" +#include "TinyObject.h" +#include "TinyCommon.h" namespace Tiny { @@ -21,12 +23,12 @@ namespace Tiny class TinyNode : public TinyObject { public: - TinyNode(std::string &name); - ~TinyNode(); + TinyNode(std::string name); + virtual ~TinyNode(); TinyNode* createChild(); void addChild(TinyNode* node); void removeChild(TinyNode* node); - void getChild(std::string& name); + TinyNode* getChild(std::string name); void update(); void setPosition(kmVec3 &pos); void setScale(kmVec3 &scale); @@ -34,7 +36,7 @@ namespace Tiny void updateFromParent(); kmVec3& getPosition(); kmVec3& getScale(); - kmVec3& getOrientation(); + kmQuaternion& getOrientation(); kmVec3& getDerivedPosition(); kmVec3& getDerivedScale(); kmQuaternion& getDerivedOrientation(); @@ -48,9 +50,10 @@ namespace Tiny kmQuaternion mDerivedOrientation; kmVec3 mScale; kmVec3 mDerivedScale; - TinyNode* parent; + TinyNode* mParent; std::map mChildren; std::string mName; + static TinyNameGenerator mNameGenerator; }; } #endif /* defined(__proj_mac__TinyNode__) */ diff --git a/tiny3d_main/TinyPlatform.h b/tiny3d_main/TinyPlatform.h index a4cbcde..5b4a182 100644 --- a/tiny3d_main/TinyPlatform.h +++ b/tiny3d_main/TinyPlatform.h @@ -11,17 +11,16 @@ #include #include -#include #include #include #define TINYLOG tinyLog -class TinyRenderWindow; - namespace Tiny { + class TinyRenderWindow; + typedef unsigned int uint32; typedef unsigned short uint16; typedef unsigned char uint8; diff --git a/tiny3d_main/TinyRenderOperation.h b/tiny3d_main/TinyRenderOperation.h index 327be17..33ff849 100644 --- a/tiny3d_main/TinyRenderOperation.h +++ b/tiny3d_main/TinyRenderOperation.h @@ -12,12 +12,12 @@ #include #include "TinyVertexIndexData.h" -class TinyRenderable; -class TinyMaterial; -class TinyGpuProgram; - namespace Tiny { + class TinyRenderable; + class TinyMaterial; + class TinyGPUProgram; + class TinyRenderOperation { public: @@ -28,7 +28,7 @@ namespace Tiny TinyVertexData* mVertexData; TinyIndexData* mIndexData; TinyMaterial* mMaterial; - TinyGpuProgram* mProgram; + TinyGPUProgram* mProgram; }; } diff --git a/tiny3d_main/TinyRenderQueue.cpp b/tiny3d_main/TinyRenderQueue.cpp index 293fea7..c833c4f 100644 --- a/tiny3d_main/TinyRenderQueue.cpp +++ b/tiny3d_main/TinyRenderQueue.cpp @@ -33,9 +33,9 @@ namespace Tiny group->addRenderable(renderable, priority); } - MapIterator TinyRenderQueue::getQueueGroupIterator(); + MapIterator TinyRenderQueue::getQueueGroupIterator() { - return MapIterator(mRenderQueueGroups.begin(); mRenderQueueGroups.end()); + return MapIterator(mRenderQueueGroups.begin(), mRenderQueueGroups.end()); } TinyRenderQueueGroup* TinyRenderQueue::getQueueGroup(uint8 groupID) @@ -44,12 +44,12 @@ namespace Tiny TinyRenderQueueGroup* group; if (iter == mRenderQueueGroups.end()) { - group = TINY_NEW TinyQueueGroup(); + group = TINY_NEW TinyRenderQueueGroup(); mRenderQueueGroups.insert(std::pair(groupID, group)); } else { - gourp = iter->second; + group = iter->second; } return group; } @@ -71,8 +71,18 @@ namespace Tiny void TinyRenderQueueGroup::addRenderable(TinyRenderable* renderable, uint8 priority) { - auto group = mRenderPriorityGroups->find(priority); - gourp->addRenderable(renderable); + auto group = mRenderPriorityGroups.find(priority); + TinyRenderPriorityGroup* priorityGroup; + if (group == mRenderPriorityGroups.end()) + { + priorityGroup = TINY_NEW TinyRenderPriorityGroup(); + mRenderPriorityGroups.insert(RenderPriorityGroupMap::value_type(priority, priorityGroup)); + } + else + { + priorityGroup = group->second; + } + priorityGroup->addRenderable(renderable); } MapIterator TinyRenderQueueGroup::getPriorityGroupIterator() @@ -91,7 +101,7 @@ namespace Tiny } else { - gourp = iter->second; + group = iter->second; } return group; } diff --git a/tiny3d_main/TinyRenderSystem.cpp b/tiny3d_main/TinyRenderSystem.cpp index 3969232..90f6a1c 100644 --- a/tiny3d_main/TinyRenderSystem.cpp +++ b/tiny3d_main/TinyRenderSystem.cpp @@ -9,6 +9,7 @@ #include "TinyRenderSystem.h" #include "kazmath/kazmath.h" #include "TinyHardwareBuffer.h" +#include "TinyPlatform.h" namespace Tiny { @@ -39,15 +40,24 @@ namespace Tiny kmVec2 vpSize = vp->getViewPortSize(); glViewport(vpPosition.x, vpPosition.y, vpSize.x, vpSize.y); glScissor(vpPosition.x, vpPosition.y, vpSize.x, vpSize.y); + TINYLOG("glViewport (%f, %f) (%f, %f)", vpPosition.x, vpPosition.y, vpSize.x, vpSize.y); } } + void TinyRenderSystem::clearBg() + { + glClearColor(0.0, 0.0, 0.0, 1.0); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + TINYLOG("glClear"); + } + void TinyRenderSystem::setRenderTarget(TinyRenderTarget *target) { mActiveRenderTarget = target; if (target) { - glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, target->getFBO()); + TINYLOG("glBindFramebuffer %d", target->getFBO()); + glBindFramebuffer(GL_FRAMEBUFFER, target->getFBO()); } } @@ -70,36 +80,45 @@ namespace Tiny TinyRenderTargetMap::iterator iter = mPrioritisedRenderTargets.begin(); for (; iter != mPrioritisedRenderTargets.end(); iter ++) { - iter->second->swapBuffers(); + iter->second->swapBuffer(); } } void TinyRenderSystem::render(TinyRenderOperation* ro) { - glUseProgram(ro->mProgram->getHandler()); + //switch states + glEnable(GL_DEPTH_TEST); + glEnable(GL_CULL_FACE); + TINYLOG("glEnable and glDisable"); + + //bind uniform + TinyGPUProgram* program = ro->mProgram; + program->useProgram(); + TINYLOG("glUseProgram"); //bind vertexAttr auto iter = ro->mVertexData->getBufferIterator(); while (iter.hasMoreElements()) { - auto key = iter->first; - TinyVertexElement* element = iter->second; + auto key = iter.peekNextKey(); + TinyVertexElement* element = iter.getNext(); TinyHardwareBuffer* hardwareBuffer = element->mBuffer; glBindBuffer(GL_ARRAY_BUFFER, hardwareBuffer->getHandler()); + TINYLOG("glBindBuffer %d", hardwareBuffer->getHandler()); glEnableVertexAttribArray(key); + TINYLOG("glEnableVertexAttribArray %d", key); glVertexAttribPointer(key, element->mSize, GL_FLOAT, GL_FALSE, 0, (GLvoid *)0); + TINYLOG("glVertexAttribPointer %d, %d", key, element->mSize); } //bind index - TinyIndexData indexData = ro->mIndexData; - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexData->getBuffer()); - - //bind uniform - TinyGPUProgram* program = ro->mProgram; - program->useProgram(); + TinyIndexData* indexData = ro->mIndexData; + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexData->getBuffer()->getHandler()); + TINYLOG("glBindBuffer indexbuffer %d", indexData->getBuffer()->getHandler()); //draw glDrawElements(GL_TRIANGLES, indexData->getVertexSize(), GL_UNSIGNED_SHORT, 0); + TINYLOG("glDrawElements"); } void TinyRenderSystem::attachRenderTarget(TinyRenderTarget *target) @@ -114,7 +133,7 @@ namespace Tiny { mActiveRenderTarget = nullptr; } - std::map iter = mPrioritisedRenderTargets.begin(); + TinyRenderTargetMap::iterator iter = mPrioritisedRenderTargets.begin(); for (; iter != mPrioritisedRenderTargets.end(); iter ++) { if (iter->second == target) diff --git a/tiny3d_main/TinyRenderSystem.h b/tiny3d_main/TinyRenderSystem.h index 7c0e506..b6ab8f2 100644 --- a/tiny3d_main/TinyRenderSystem.h +++ b/tiny3d_main/TinyRenderSystem.h @@ -10,9 +10,8 @@ #define __proj_mac__TinyRenderSystem__ #include - -#include "TinyObject.h" #include +#include "TinyObject.h" #include "TinyRenderTarget.h" #include "TinyGPUProgram.h" #include "TinyViewPort.h" @@ -36,6 +35,7 @@ namespace Tiny void setViewMatrix(kmMat4& matrix); void attachRenderTarget(TinyRenderTarget *target); void detachRenderTarget(TinyRenderTarget *target); + void clearBg(); private: typedef std::map TinyRenderTargetMap; TinyRenderTargetMap mPrioritisedRenderTargets; diff --git a/tiny3d_main/TinyRenderTarget.cpp b/tiny3d_main/TinyRenderTarget.cpp index 80dff3e..f07f916 100644 --- a/tiny3d_main/TinyRenderTarget.cpp +++ b/tiny3d_main/TinyRenderTarget.cpp @@ -12,7 +12,7 @@ namespace Tiny { TinyRenderTarget::TinyRenderTarget(uint32 width, uint32 height) - : mPriority(TINY_DEFAULT_RT_GROUP), + : mPriority(TINY_DEFAULT_RT_GROUP) , mFbo(0) , mWidth(width) , mHeight(height) @@ -36,7 +36,7 @@ namespace Tiny updateImpl(); if (swap) { - swapBuffers(); + swapBuffer(); } } @@ -57,7 +57,7 @@ namespace Tiny auto iter = mViewPorts.find(zOrder); if (iter == mViewPorts.end()) { - TinyViewPort *vp = TINY_NEW TinyViewPort(cam, this, left, bottom, width, height); + TinyViewPort *vp = TINY_NEW TinyViewPort(cam, this, left, bottom, width, height, 0); mViewPorts[zOrder] = vp; } } diff --git a/tiny3d_main/TinyRenderTarget.h b/tiny3d_main/TinyRenderTarget.h index b48f327..90455ab 100644 --- a/tiny3d_main/TinyRenderTarget.h +++ b/tiny3d_main/TinyRenderTarget.h @@ -39,7 +39,7 @@ namespace Tiny void updateViewPorts(); //swapBuffer. - virtual void swapBuffers() = 0; + virtual void swapBuffer() = 0; virtual kmVec2 getSize(); diff --git a/tiny3d_main/TinyRenderTexture.cpp b/tiny3d_main/TinyRenderTexture.cpp index 6ad926d..8cca23c 100644 --- a/tiny3d_main/TinyRenderTexture.cpp +++ b/tiny3d_main/TinyRenderTexture.cpp @@ -10,7 +10,8 @@ namespace Tiny { - TinyRenderTexture::TinyRenderTexture() + TinyRenderTexture::TinyRenderTexture(uint32 width, uint32 height) + : TinyRenderTarget(width, height) { mPriority = TINY_REND_TO_TEX_RT_GROUP; } @@ -20,7 +21,7 @@ namespace Tiny // } - void TinyRenderTexture::swapBuffers() + void TinyRenderTexture::swapBuffer() { //Nothing to do. } diff --git a/tiny3d_main/TinyRenderTexture.h b/tiny3d_main/TinyRenderTexture.h index 892d4fb..dc8ec15 100644 --- a/tiny3d_main/TinyRenderTexture.h +++ b/tiny3d_main/TinyRenderTexture.h @@ -9,18 +9,18 @@ #ifndef __proj_mac__TinyRenderTexture__ #define __proj_mac__TinyRenderTexture__ -#include "TinyRenderTarget.h" - #include +#include "TinyRenderTarget.h" +#include "TinyPlatform.h" namespace Tiny { class TinyRenderTexture : public TinyRenderTarget { public: - TinyRenderTexture(); + TinyRenderTexture(uint32 width, uint32 height); ~TinyRenderTexture(); - virtual void swapBuffers(); + virtual void swapBuffer(); }; } diff --git a/tiny3d_main/TinyRenderWindow.cpp b/tiny3d_main/TinyRenderWindow.cpp index 26d0c6d..d71b8fa 100644 --- a/tiny3d_main/TinyRenderWindow.cpp +++ b/tiny3d_main/TinyRenderWindow.cpp @@ -11,6 +11,7 @@ namespace Tiny { TinyRenderWindow::TinyRenderWindow(uint32 width, uint32 height) + : TinyRenderTarget(width, height) { mPriority = TINY_DEFAULT_RT_GROUP; } diff --git a/tiny3d_main/TinyRenderable.cpp b/tiny3d_main/TinyRenderable.cpp index c15a89e..ff9f358 100644 --- a/tiny3d_main/TinyRenderable.cpp +++ b/tiny3d_main/TinyRenderable.cpp @@ -16,17 +16,17 @@ namespace Tiny } - virtual TinyRenderable::~TinyRenderable() + TinyRenderable::~TinyRenderable() { } - void TinyEntity::setMaterial(TinyMaterial* material) + void TinyRenderable::setMaterial(TinyMaterial* material) { mMaterial = material; } - TinyMaterial* TinyEntity::getMaterial() + TinyMaterial* TinyRenderable::getMaterial() { return mMaterial; } diff --git a/tiny3d_main/TinyRoot.h b/tiny3d_main/TinyRoot.h index 3db57ed..e7dc09f 100644 --- a/tiny3d_main/TinyRoot.h +++ b/tiny3d_main/TinyRoot.h @@ -9,13 +9,13 @@ #ifndef proj_mac_TinyRoot_h #define proj_mac_TinyRoot_h +#include #include "TinyObject.h" #include "TinyRenderSystem.h" #include "TinySingleton.h" #include "TinySceneManager.h" #include "TinyRenderWindow.h" -#incluee "TinyMovableObjectFactory.h" -#include +#include "TinyMovableObjectFactory.h" namespace Tiny diff --git a/tiny3d_main/TinySceneManager.cpp b/tiny3d_main/TinySceneManager.cpp index c83d789..482b407 100644 --- a/tiny3d_main/TinySceneManager.cpp +++ b/tiny3d_main/TinySceneManager.cpp @@ -10,6 +10,7 @@ #include "TinyMemoryAlloc.h" #include "TinyIteratorWrapper.h" #include "TinyRenderOperation.h" +#include "TinyRenderSystem.h" namespace Tiny { @@ -36,12 +37,18 @@ namespace Tiny kmMat4 viewMatrix; cam->getViewMatrix(viewMatrix); setViewPort(cam->getViewPort()); + clearBg(); setViewMatrix(viewMatrix); updateSceneGraph(); findVisibleObjects(cam); renderVisibleObjects(); } + void TinySceneManager::clearBg() + { + mDestRenderSystem->clearBg(); + } + TinySceneNode* TinySceneManager::getRootSceneNode() { if (! mSceneRoot) diff --git a/tiny3d_main/TinySceneManager.h b/tiny3d_main/TinySceneManager.h index 80770bc..16a9c5a 100644 --- a/tiny3d_main/TinySceneManager.h +++ b/tiny3d_main/TinySceneManager.h @@ -12,15 +12,14 @@ #include "TinyObject.h" #include "TinyCamera.h" #include "TinyViewPort.h" -#include "TinyRenderSystem.h" #include "TinyRenderTarget.h" -#include "TinySingleton.h" #include "TinySceneNode.h" #include "TinyRenderQueue.h" namespace Tiny { - class TinySceneManager : public TinyObject, public TinySingleton + class TinyRenderSystem; + class TinySceneManager : public TinyObject { public: TinySceneManager(); @@ -36,6 +35,7 @@ namespace Tiny void setViewMatrix(kmMat4& matrix); TinySceneNode* getRootSceneNode(); TinyRenderQueue* getRenderQueue(); + void clearBg(); private: TinyViewPort *mCurrentViewPort; TinyCamera *mCameraInProgress; diff --git a/tiny3d_main/TinySceneNode.cpp b/tiny3d_main/TinySceneNode.cpp index a43251c..15b17dc 100644 --- a/tiny3d_main/TinySceneNode.cpp +++ b/tiny3d_main/TinySceneNode.cpp @@ -7,10 +7,11 @@ // #include "TinySceneNode.h" +#include "TinyMemoryAlloc.h" namespace Tiny { - TinySceneNode::TinySceneNode(std::string& name) + TinySceneNode::TinySceneNode(std::string name) : TinyNode(name) { @@ -24,13 +25,13 @@ namespace Tiny void TinySceneNode::attachObject(TinyMovableObject* obj) { assert(!obj->isAttached() && "Obj was already attached to an node."); - auto result = mAttachedObjects->insert(std::pair(obj->getName(), obj)); + auto result = mAttachedObjects.insert(std::pair(obj->getName(), obj)); assert(result.second && "Objects was not attached because an object of the same name was" "already attached to this node."); obj->notifyAttached(this); } - void TinySceneNode::findVisibleObjects(TinyCamera* cam, RenderQueue* queue) + void TinySceneNode::findVisibleObjects(TinyCamera* cam, TinyRenderQueue* queue) { auto iter = mAttachedObjects.begin(); for (; iter != mAttachedObjects.end(); iter ++) @@ -40,14 +41,15 @@ namespace Tiny auto nodeIter = mChildren.begin(); for (; nodeIter != mChildren.end(); nodeIter ++) { - nodeIter->second->findVisibleObjects(cam, queue); + TinySceneNode* node = dynamic_cast(nodeIter->second); + node->findVisibleObjects(cam, queue); } } TinySceneNode* TinySceneNode::createChildSceneNode() { - auto child = TINY_NEW TinySceneNode(); - addChild(node); - return node; + auto child = TINY_NEW TinySceneNode(mNameGenerator.generate()); + addChild(child); + return child; } } \ No newline at end of file diff --git a/tiny3d_main/TinySceneNode.h b/tiny3d_main/TinySceneNode.h index 6ea6d9d..383bdd9 100644 --- a/tiny3d_main/TinySceneNode.h +++ b/tiny3d_main/TinySceneNode.h @@ -23,7 +23,7 @@ namespace Tiny class TinySceneNode : public TinyNode { public: - TinySceneNode(std::string& name); + TinySceneNode(std::string name); virtual ~TinySceneNode(); void attachObject(TinyMovableObject* obj); void detattchObject(TinyMovableObject* obj); diff --git a/tiny3d_main/TinySingleton.h b/tiny3d_main/TinySingleton.h index ac00702..3145625 100644 --- a/tiny3d_main/TinySingleton.h +++ b/tiny3d_main/TinySingleton.h @@ -9,6 +9,8 @@ #ifndef proj_mac_TinySingleton_h #define proj_mac_TinySingleton_h +#include + namespace Tiny { template class TinySingleton @@ -27,14 +29,23 @@ namespace Tiny public: TinySingleton( void ) { - assert( !msSingleton ); - msSingleton = static_cast< T* >( this ); + //assert( !msSingleton ); + //msSingleton = static_cast< T* >( this ); } ~TinySingleton( void ) - { assert( msSingleton ); msSingleton = 0; } + { assert( msSingleton ); msSingleton = nullptr; } static T* getSingleton( void ) - { return msSingleton; } + { + if (msSingleton == nullptr) + { + msSingleton = new T(); + } + return msSingleton; + } }; + + template + T* TinySingleton::msSingleton = nullptr; /** @} */ /** @} */ } diff --git a/tiny3d_main/TinySubEntity.cpp b/tiny3d_main/TinySubEntity.cpp index 9bfdef7..9a2df32 100644 --- a/tiny3d_main/TinySubEntity.cpp +++ b/tiny3d_main/TinySubEntity.cpp @@ -26,6 +26,7 @@ namespace Tiny ro->mIndexData = mSubMesh->mIndexData; ro->mRenderable = this; ro->mMaterial = getMaterial(); - ro->mProgram = ro->mMaterial->getProgram(); + TinyGPUProgram* program = ro->mMaterial->getProgram(); + ro->mProgram = program; } } \ No newline at end of file diff --git a/tiny3d_main/TinySubMesh.cpp b/tiny3d_main/TinySubMesh.cpp index 98fcc10..73a2860 100644 --- a/tiny3d_main/TinySubMesh.cpp +++ b/tiny3d_main/TinySubMesh.cpp @@ -7,6 +7,9 @@ // #include "TinySubMesh.h" +#include "TinyMesh.h" +#include "TinyMemoryAlloc.h" +#include "kazmath/kazmath.h" namespace Tiny { @@ -18,6 +21,7 @@ namespace Tiny TinySubMesh::~TinySubMesh() { + TINY_DELETE mVertexData; TINY_DELETE mIndexData; } @@ -32,7 +36,8 @@ namespace Tiny {1, 0, 0} }; GLushort idata[] = {0, 1, 2}; - mVertexData->load(vdata, sizeof(vdata), VERTEX_LOCATION_POSITION); - mIndexData->load(idata, sizeof(idata)); + mVertexData->load((uint8*)vdata, sizeof(vdata), sizeof(float), VERTEX_LOCATION_POSITION); + mIndexData->load((uint8*)idata, sizeof(idata), sizeof(uint32)); + return 0; } } \ No newline at end of file diff --git a/tiny3d_main/TinyTexture.cpp b/tiny3d_main/TinyTexture.cpp index eade021..3ae368d 100644 --- a/tiny3d_main/TinyTexture.cpp +++ b/tiny3d_main/TinyTexture.cpp @@ -30,15 +30,15 @@ namespace Tiny TINY_DELETE image; } - void TinyTexture::load(vector& datas, vector& lengths) + void TinyTexture::load(std::vector& datas, std::vector& lengths) { - uint32 length = datas.size(); - std::vector images + uint32 length = (uint32)datas.size(); + std::vector images; for (int i = 0; i < length; i ++) { TinyImage* image = TINY_NEW TinyImage(); image->initWithData(datas[i], lengths[i], true); - images.push_back(image) + images.push_back(image); } initWithImages(images); for (int i = 0; i < length; i ++) @@ -51,8 +51,8 @@ namespace Tiny { if (mHandler == 0) { - DataList& dataList = image->mDataList; - SizeList& sizeList = image->mSizeList; + TinyImage::DataList& dataList = image->mDataList; + TinyImage::SizeList& sizeList = image->mSizeList; //glPixelStorei(GL_UNPACK_ALIGNMENT,4); glGenTextures(1, &mHandler); @@ -60,7 +60,7 @@ namespace Tiny glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, mHandler); - int mipMapCount = image->mDataList.size(); + uint32 mipMapCount = (uint32)image->mDataList.size(); for (int i = 0; i < mipMapCount; i ++) { uint32 width = sizeList[i].x; @@ -71,7 +71,7 @@ namespace Tiny glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - if (image.mIsMapmap == false) + if (image->mIsMipmap == false) { glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); } @@ -84,7 +84,7 @@ namespace Tiny } } - void TinyTexture::initWithImages(std::vector images) + void TinyTexture::initWithImages(std::vector& images) { if (mHandler == 0) { @@ -95,7 +95,7 @@ namespace Tiny glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE); - bool isMapmap = images[0].mIsMapmap; + bool isMapmap = images[0]->mIsMipmap; if (isMapmap == false) { glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_NEAREST); @@ -110,10 +110,10 @@ namespace Tiny for (int cubeIdx = 0; cubeIdx < 6; cubeIdx ++) { - DataList& dataList = images[i]->mDataList; - SizeList& sizeList = images[i]->mSizeList; + TinyImage::DataList& dataList = images[cubeIdx]->mDataList; + TinyImage::SizeList& sizeList = images[cubeIdx]->mSizeList; - int mipMapCount = dataList.size(); + uint32 mipMapCount = (uint32)dataList.size(); for (int i = 0; i < mipMapCount; i ++) { uint32 width = sizeList[i].x; @@ -130,7 +130,7 @@ namespace Tiny return mHandler; } - GLuint* getHandlerPtr() + GLuint* TinyTexture::getHandlerPtr() { return &mHandler; } diff --git a/tiny3d_main/TinyTexture.h b/tiny3d_main/TinyTexture.h index 2454df2..87cbe68 100644 --- a/tiny3d_main/TinyTexture.h +++ b/tiny3d_main/TinyTexture.h @@ -23,7 +23,7 @@ namespace Tiny TinyTexture(); ~TinyTexture(); void load(uint8* data, uint32 length); - void load(vector& datas, vector& lengths); + void load(std::vector& datas, std::vector& lengths); void initWithImage(TinyImage* image); void initWithImages(std::vector& images); GLuint getHandler(); diff --git a/tiny3d_main/TinyTextureManager.cpp b/tiny3d_main/TinyTextureManager.cpp index e3251e4..b9b4986 100755 --- a/tiny3d_main/TinyTextureManager.cpp +++ b/tiny3d_main/TinyTextureManager.cpp @@ -11,6 +11,16 @@ namespace Tiny { + TinyTextureManager::TinyTextureManager() + { + + } + + TinyTextureManager::~TinyTextureManager() + { + + } + TinyTexture* TinyTextureManager::load(std::string& fileName) { uint8* data; @@ -22,11 +32,11 @@ namespace Tiny return texture; } - TinyTexture* load(std::vector& fileNames) + TinyTexture* TinyTextureManager::load(std::vector& fileNames) { std::vector datas; std::vector lengths; - uint32 length = fileNames.size(); + uint32 length = (uint32)fileNames.size(); for (int i = 0; i < length; i ++) { uint8* data; @@ -39,7 +49,7 @@ namespace Tiny texture->load(datas, lengths); for (int i = 0; i < length; i ++) { - free(datas[i]) + free(datas[i]); } return texture; } diff --git a/tiny3d_main/TinyTextureManager.h b/tiny3d_main/TinyTextureManager.h index 70b706f..18dc471 100755 --- a/tiny3d_main/TinyTextureManager.h +++ b/tiny3d_main/TinyTextureManager.h @@ -8,20 +8,21 @@ #ifndef proj_mac_TinyTextureManager_h #define proj_mac_TinyTextureManager_h -#include "TinyResourceManager.h" #include #include +#include "TinyResourceManager.h" +#include "TinyTexture.h" +#include "TinySingleton.h" namespace Tiny { - class TinyTextureManager : TinyResourceManager + class TinyTextureManager : public TinyResourceManager, public TinySingleton { public: - TinyResourceManager(); - ~TinyResourceManager(); + TinyTextureManager(); + virtual ~TinyTextureManager(); TinyTexture* load(std::string& fileName); - TinyTexture* load(std::vector& fileNames) - protected: + TinyTexture* load(std::vector& fileNames); }; } diff --git a/tiny3d_main/TinyViewPort.cpp b/tiny3d_main/TinyViewPort.cpp index af1aacf..a70e008 100644 --- a/tiny3d_main/TinyViewPort.cpp +++ b/tiny3d_main/TinyViewPort.cpp @@ -8,13 +8,14 @@ #include #include "TinyViewPort.h" +#include "TinyCamera.h" namespace Tiny { TinyViewPort::TinyViewPort(TinyCamera *cam, TinyRenderTarget *target, float left, float bottom, float width, float height, int zOrder) : mCamera(cam) , mTarget(target) - , mzOrder(zOrder) + , mZorder(zOrder) { mLeftBottomPosition.x = left; mLeftBottomPosition.y = bottom; diff --git a/tiny3d_main/TinyViewPort.h b/tiny3d_main/TinyViewPort.h index 6f5f8cc..244f72d 100644 --- a/tiny3d_main/TinyViewPort.h +++ b/tiny3d_main/TinyViewPort.h @@ -11,11 +11,11 @@ #include "TinyObject.h" #include "kazmath/kazmath.h" -class TinyCamera; namespace Tiny { class TinyRenderTarget; + class TinyCamera; class TinyViewPort : public TinyObject { @@ -32,6 +32,7 @@ namespace Tiny kmVec2 mSize; TinyCamera *mCamera; int mZorder; + TinyRenderTarget* mTarget; }; }