Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
games
stuntrally
stuntrally-master.patch
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File stuntrally-master.patch of Package stuntrally
diff --git a/.travis.yml b/.travis.yml index 9242cf0e..6d1408b7 100644 --- a/.travis.yml +++ b/.travis.yml @@ -14,14 +14,15 @@ branches: before_install: - pwd - - echo "yes" | sudo add-apt-repository "deb http://archive.ubuntu.com/ubuntu `lsb_release -sc` main universe restricted multiverse" - - sudo apt-get update -qq + - sudo add-apt-repository -y "deb http://archive.ubuntu.com/ubuntu `lsb_release -sc` main universe restricted multiverse" + - sudo apt-get update -y -qq - sudo apt-get install -qq libboost-wave-dev libboost-system-dev libboost-filesystem-dev libboost-thread-dev - sudo apt-get install -qq libbullet-dev libbullet-extras-dev - sudo apt-get install -qq libopenal-dev - sudo apt-get install -qq libenet-dev libvorbisfile3 libogg-dev libvorbis-dev - sudo apt-get install -qq libogre-1.9-dev - sudo apt-get install -qq libmygui-dev + - sudo apt-get install -qq libegl1-mesa-dev libgles2-mesa-dev # workaround https://github.com/travis-ci/travis-ci/issues/9065 - sudo apt-get install -qq libsdl2-dev before_script: diff --git a/CMakeLists.txt b/CMakeLists.txt index 684e34f4..7b3915fd 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -83,7 +83,15 @@ list(APPEND LIBS ${Boost_LIBRARIES}) # We can significantly reduce deps if only building master server if(BUILD_GAME OR BUILD_EDITOR) - find_package(OGRE REQUIRED QUIET) + find_package(OGRE QUIET CONFIG) # first try 1.10+ style + if(${OGRE_FOUND}) + # 1.10+ puts everything in OGRE_INCLUDE_DIRS & OGRE_LIBRARIES + include_directories(${OGRE_INCLUDE_DIRS}) + list(APPEND LIBS ${OGRE_LIBRARIES}) + add_definitions(-DOGRE_PLUGIN_DIR_REL="${OGRE_PLUGIN_DIR}") + add_definitions(-DOGRE_PLUGIN_DIR_DBG="${OGRE_PLUGIN_DIR}") + else() + find_package(OGRE REQUIRED QUIET) include_directories(${OGRE_INCLUDE_DIRS} ${OGRE_Terrain_INCLUDE_DIRS} ${OGRE_Paging_INCLUDE_DIRS}) # Overlay moved to separate component in 1.9 if (OGRE_VERSION_MAJOR GREATER 1 OR OGRE_VERSION_MINOR GREATER 8) @@ -97,6 +105,7 @@ if(BUILD_GAME OR BUILD_EDITOR) endif() add_definitions(-DOGRE_PLUGIN_DIR_REL="${OGRE_PLUGIN_DIR_REL}") add_definitions(-DOGRE_PLUGIN_DIR_DBG="${OGRE_PLUGIN_DIR_DBG}") + endif() find_package(Bullet REQUIRED QUIET) include_directories(${BULLET_INCLUDE_DIRS}) diff --git a/Readme.txt b/Readme.txt index c650bf50..6352630d 100644 --- a/Readme.txt +++ b/Readme.txt @@ -1,7 +1,7 @@ ------------------------------------------------------------------------------ Stunt Rally - game based on VDrift and OGRE, with Track Editor - Copyright (C) 2017 Crystal Hammer and contributors + Copyright (C) 2010-2021 Crystal Hammer and contributors This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -45,7 +45,7 @@ Videos: (gameplay and editor) Description -The game features 172 tracks in 34 sceneries and 25 vehicles. +The game features 173 tracks in 34 sceneries and 25 vehicles. Game modes include: Single Race, Tutorials, Championships, Challenges, Multiplayer and Split Screen. Also Replays and Ghost drive are present. diff --git a/config/editor-default.cfg b/config/editor-default.cfg index 71759260..d76ab4e7 100644 --- a/config/editor-default.cfg +++ b/config/editor-default.cfg @@ -135,6 +135,6 @@ limit_fps = off limit_fps_val = 60.000000 limit_sleep = -1 rendersystem = Default -vsync = off +vsync = on windowx = 1024 windowy = 768 diff --git a/config/game-default.cfg b/config/game-default.cfg index fbf02c9f..eda3992a 100644 --- a/config/game-default.cfg +++ b/config/game-default.cfg @@ -295,7 +295,7 @@ limit_fps = off limit_fps_val = 60.000000 limit_sleep = -1 rendersystem = Default -vsync = off +vsync = on windowx = 1024 windowy = 768 diff --git a/config/tracks.ini b/config/tracks.ini index 08ca2f62..58ca8cb8 100644 --- a/config/tracks.ini +++ b/config/tracks.ini @@ -276,3 +276,6 @@ 181,Mud5-Mudflats v2.6 08/03/15 18/03/15 :Mud |o3 c0 w4 ~2 J0 L0 P1 /3 s4 l5 !4 *3 T=300 a:rubberduck 182,Cry3-BlueHell v2.6 11/03/15 18/03/15 :Crystals |o0 c3 w1 ~1 J2 L3 P3 /3 s3 l6 !6 *5 T=310 a:rubberduck,CryHam + + #168 2.6.2 ? +183,Grc9-Oasis v2.7 28/11/20 29/11/20 :Greece |o1 c3 w1 ~1 J3 L4 P4 /3 s3 l8 !5 *5 T=241 a:CryHam diff --git a/data/compositor/softparticles/softparticles.material b/data/compositor/softparticles/softparticles.material index 6c499188..14ec9b45 100644 --- a/data/compositor/softparticles/softparticles.material +++ b/data/compositor/softparticles/softparticles.material @@ -66,30 +66,6 @@ fragment_program ShowDepth_ps unified delegate ShowDepth_ps_hlsl } - -material RenderScene -{ - technique - { - pass - { - vertex_program_ref Ogre/Compositor/StdQuad_vp - { - } - - fragment_program_ref Ogre/Compositor/StdQuad_fp - { - } - - texture_unit tex1 - { - //scenebuffer - texture white.png - filtering bilinear - } - } - } -} material SceneRenderNoDepth { technique diff --git a/data/gui/stuntrally.png b/data/gui/stuntrally.png index 614e706c..f8d3ce16 100644 Binary files a/data/gui/stuntrally.png and b/data/gui/stuntrally.png differ diff --git a/dist/CMakeLists.txt b/dist/CMakeLists.txt index 3b4cb45b..bed44879 100644 --- a/dist/CMakeLists.txt +++ b/dist/CMakeLists.txt @@ -1,6 +1,7 @@ if(UNIX) install(FILES stuntrally.desktop sr-editor.desktop DESTINATION "share/applications/") - install(FILES ../data/gui/stuntrally.png ../data/gui/sr-editor.png DESTINATION "share/icons/hicolor/64x64/apps/") + install(FILES ../data/gui/stuntrally.png DESTINATION "share/icons/hicolor/256x256/apps/") + install(FILES ../data/gui/sr-editor.png DESTINATION "share/icons/hicolor/64x64/apps/") endif() diff --git a/dist/linux-archive/stuntrally b/dist/linux-archive/stuntrally index 9145e6b3..f9bdcc5c 100755 --- a/dist/linux-archive/stuntrally +++ b/dist/linux-archive/stuntrally @@ -26,6 +26,18 @@ export OGRE_PLUGIN_DIR="$LIBPATH" if [ "$(uname -m)" = "x86_64" ]; then "$BINPATH/stuntrally_x86_64" $* + ret=$? + if [ $ret -eq 139 ]; then + cat - <<EOHELP +---------------------------- +This might be a known crash! +You can try to rename (disable) libstdc++.so.6 with the command: + +mv $LIBPATH/libstdc++.so.6 $LIBPATH/libstdc++.so.6.disabled + +and call $0 again +EOHELP + fi else "$BINPATH/stuntrally_x86" $* fi diff --git a/source/btOgre/BtOgreDebug.cpp b/source/btOgre/BtOgreDebug.cpp index d78cff73..bc4f6589 100644 --- a/source/btOgre/BtOgreDebug.cpp +++ b/source/btOgre/BtOgreDebug.cpp @@ -11,6 +11,7 @@ #include <math.h> +#include <OgrePrerequisites.h> #include <OgreSceneNode.h> #include <OgreResourceGroupManager.h> #include <OgreMaterial.h> @@ -38,7 +39,11 @@ DebugDrawer::DebugDrawer(Ogre::SceneNode *node, btDynamicsWorld *world) : mat->setReceiveShadows(false); mat->setLightingEnabled(false); //mat->setSelfIllumination(1,1,1); +#if defined(OGRE_VERSION) && OGRE_VERSION < 0x10A00 mLineDrawer->setMaterial("BtOgre/DebugLines");/**/ //crash debug.. +#else + mLineDrawer->setMaterial(mat);/**/ //crash debug.. +#endif mLineDrawer->setVisibilityFlags(2/*RV_Hud*/); // not in reflection } diff --git a/source/editor/BaseApp_Create.cpp b/source/editor/BaseApp_Create.cpp index e49cb40a..dcec7cba 100644 --- a/source/editor/BaseApp_Create.cpp +++ b/source/editor/BaseApp_Create.cpp @@ -27,6 +27,7 @@ #include <MyGUI_FactoryManager.h> #include <MyGUI_ImageBox.h> #include <MyGUI_TextBox.h> +#include <OgreWindowEventUtilities.h> namespace { @@ -286,6 +287,9 @@ bool BaseApp::setup() } mRoot->loadPlugin(PATHMANAGER::OgrePluginDir() + "/Plugin_ParticleFX" + D_SUFFIX); +#if defined(OGRE_VERSION) && OGRE_VERSION >= 0x10B00 + mRoot->loadPlugin(PATHMANAGER::OgrePluginDir() + "/Codec_STBI" + D_SUFFIX); +#endif setupResources(); @@ -304,6 +308,7 @@ bool BaseApp::setup() Ogre::TextureManager::getSingleton().setDefaultNumMipmaps(5); mSceneMgr->setFog(Ogre::FOG_NONE); + postInit(); loadResources(); baseInitGui(); @@ -344,6 +349,16 @@ void BaseApp::setupResources() PATHMANAGER::Data() + "/" + archName, typeName, secName); } } + +#if defined(OGRE_VERSION) && OGRE_VERSION >= 0x10C00 + using namespace Ogre; + // create stubs for Ogre 1.12 core shaders (unused by stuntrally) + auto& gpm = HighLevelGpuProgramManager::getSingleton(); + for(auto name : {"PointLight", "DirLight", "PointLightFinite", "DirLightFinite"}) + gpm.createProgram("Ogre/ShadowExtrude"+String(name), "OgreInternal", "unified", GPT_VERTEX_PROGRAM); + gpm.createProgram("Ogre/ShadowBlendVP", "OgreInternal", "unified", GPT_VERTEX_PROGRAM); + gpm.createProgram("Ogre/ShadowBlendFP", "OgreInternal", "unified", GPT_FRAGMENT_PROGRAM); +#endif } void BaseApp::loadResources() diff --git a/source/editor/CApp.h b/source/editor/CApp.h index f1976b72..93a8936a 100644 --- a/source/editor/CApp.h +++ b/source/editor/CApp.h @@ -137,7 +137,8 @@ public: float Size,Intens,Pow,Fq,NOf; int Oct; EBrShape shape; float Filter,HSet; - char newLine; Ogre::String name; + signed char newLine; + Ogre::String name; }; const static int brSetsNum = 87; diff --git a/source/editor/Render2tex.cpp b/source/editor/Render2tex.cpp index 37dfdcca..bfdd02f5 100644 --- a/source/editor/Render2tex.cpp +++ b/source/editor/Render2tex.cpp @@ -13,6 +13,7 @@ #include <btBulletDynamicsCommon.h> #include <BulletCollision/CollisionDispatch/btCollisionWorld.h> +#include <OgrePrerequisites.h> #include <OgreTimer.h> #include <OgreTerrain.h> #include <OgreRenderWindow.h> @@ -25,6 +26,8 @@ #include <OgreViewport.h> #include <OgreMaterialManager.h> #include <OgreSceneNode.h> +#include <OgreTechnique.h> +#include <OgrePass.h> using namespace Ogre; @@ -43,6 +46,7 @@ void App::Rnd2TexSetup() xm1 = 1-sz/asp, ym1 = -1+sz, xm2 = 1.0, ym2 = -1.0; AxisAlignedBox aab; aab.setInfinite(); + TexturePtr texture[RTs]; for (int i=0; i < RTs+RTsAdd; ++i) { SRndTrg& r = rt[i]; bool full = i==3; @@ -56,7 +60,7 @@ void App::Rnd2TexSetup() /// rnd to tex - same dim as Hmap // after track load Real fDim = scn->sc->td.fTerWorldSize; // world dim ..vdr - TexturePtr texture = TextureManager::getSingleton().createManual( + texture[i] = TextureManager::getSingleton().createManual( sTex, rgDef, TEX_TYPE_2D, dim[i], dim[i], 0, PF_R8G8B8A8, TU_RENDERTARGET); @@ -66,7 +70,7 @@ void App::Rnd2TexSetup() r.cam->setAspectRatio(1.0); if (!full) r.cam->setProjectionType(PT_ORTHOGRAPHIC); r.cam->setOrthoWindow(fDim,fDim); //rt[i].rndCam->setPolygonMode(PM_WIREFRAME); - r.tex = texture->getBuffer()->getRenderTarget(); + r.tex = texture[i]->getBuffer()->getRenderTarget(); r.tex->setAutoUpdated(false); r.tex->addListener(this); Viewport* rvp = r.tex->addViewport(r.cam); rvp->setClearEveryFrame(true); rvp->setBackgroundColour(ColourValue(0,0,0,0)); @@ -78,7 +82,16 @@ void App::Rnd2TexSetup() } /// minimap . . . . . . . . . . . . . . . . . . . . . . . . . . . if (r.ndMini) mSceneMgr->destroySceneNode(r.ndMini); - ResourcePtr mt = MaterialManager::getSingleton().getByName(sMtr); + MaterialPtr mt = MaterialManager::getSingleton().getByName(sMtr); + #if defined(OGRE_VERSION) && OGRE_VERSION >= 0x10A00 + if (i == 3) + { mt->getTechnique(0)->getPass(0)->getTextureUnitState(0)->setTexture(texture[0]); + mt->getTechnique(0)->getPass(0)->getTextureUnitState(1)->setTexture(texture[2]); + }else if (i < RTs) + mt->getTechnique(0)->getPass(0)->getTextureUnitState(0)->setTexture(texture[i]); + else if (i == RTs) + mt->getTechnique(0)->getPass(0)->getTextureUnitState(0)->setTexture(texture[3]); + #endif if (!mt.isNull()) mt->reload(); r.mini = new Rectangle2D(true); // screen rect preview @@ -88,7 +101,12 @@ void App::Rnd2TexSetup() r.mini->setBoundingBox(aab); r.ndMini = mSceneMgr->getRootSceneNode()->createChildSceneNode("Minimap"+si); r.ndMini->attachObject(r.mini); r.mini->setCastShadows(false); +#if defined(OGRE_VERSION) && OGRE_VERSION < 0x10A00 r.mini->setMaterial(i == RTs+1 ? "BrushPrvMtr" : sMtr); +#else + MaterialPtr brush_mt = MaterialManager::getSingleton().getByName("BrushPrvMtr"); + r.mini->setMaterial(i == RTs+1 ? brush_mt : mt); +#endif r.mini->setRenderQueueGroup(RQG_Hud2); r.mini->setVisibilityFlags(i == RTs ? RV_MaskPrvCam : RV_Hud); } diff --git a/source/editor/SceneInit.cpp b/source/editor/SceneInit.cpp index 9b3f9ce8..0fbe4b76 100644 --- a/source/editor/SceneInit.cpp +++ b/source/editor/SceneInit.cpp @@ -29,6 +29,7 @@ #include <OgreViewport.h> #include <OgreMaterialManager.h> #include <OgreTextureManager.h> +#include <OgreResourceGroupManager.h> #include <OgreSceneNode.h> #include "../ogre/common/MessageBox/MessageBox.h" #include "../ogre/common/Instancing.h" @@ -82,9 +83,6 @@ void App::createScene() // once, init LogO(String("::: Time load xmls: ") + fToStr(ti.getMilliseconds(),0,3) + " ms"); - - postInit(); // material factory - // gui * * * if (pSet->startInMain) pSet->isMain = true; @@ -174,10 +172,10 @@ void App::NewCommon(bool onlyTerVeget) //world.Clear(); if (track) track->Clear(); - if (resTrk != "") mRoot->removeResourceLocation(resTrk); + if (resTrk != "") ResourceGroupManager::getSingleton().removeResourceLocation(resTrk); LogO("------ Loading track: "+pSet->gui.track); resTrk = gcom->TrkDir() + "objects"; - mRoot->addResourceLocation(resTrk, "FileSystem"); + ResourceGroupManager::getSingleton().addResourceLocation(resTrk, "FileSystem"); MeshManager::getSingleton().unloadUnreferencedResources(); sh::Factory::getInstance().unloadUnreferencedMaterials(); diff --git a/source/editor/TerrainBrushes.cpp b/source/editor/TerrainBrushes.cpp index 585aba3e..dcdc2ee2 100644 --- a/source/editor/TerrainBrushes.cpp +++ b/source/editor/TerrainBrushes.cpp @@ -5,7 +5,7 @@ // Brush Presets data //--------------------------------------------------------------------------------------------------------------- const App::BrushSet App::brSets[App::brSetsNum] = { -//ED_MODE,curBr, Size, Intens, Pow, Freq, Ofs, Oct, EBrShape, Filter, HSet, Name + //ED_MODE,curBr,Size,Intens, Pow, Freq, Ofs, Oct, EBrShape, Filter,HSet, newLine, Name //------ easy sinus {ED_Deform,0, 16.f, 10.f, 2.f, 1.f, 0.f, 5, BRS_Sinus, -1.f,-0.01f, 0, "Small"}, {ED_Deform,0, 32.f, 20.f, 2.f, 1.f, 0.f, 5, BRS_Sinus, -1.f,-0.01f, 0, "Medium"}, diff --git a/source/ogre/BaseApp.cpp b/source/ogre/BaseApp.cpp index 6cc753b7..60c4892b 100644 --- a/source/ogre/BaseApp.cpp +++ b/source/ogre/BaseApp.cpp @@ -86,8 +86,9 @@ void BaseApp::updateStats() { std::string textureName = c->getTechnique()->getTargetPass(j)->getOutputName(); rt = c->getRenderTarget(textureName); - tris += rt->getTriangleCount(); - batch += rt->getBatchCount(); + const RenderTarget::FrameStats& rt_stats = rt->getStatistics(); + tris += rt_stats.triangleCount; + batch += rt_stats.batchCount; } } }else { diff --git a/source/ogre/BaseApp_Create.cpp b/source/ogre/BaseApp_Create.cpp index ca9cef75..66505ce9 100644 --- a/source/ogre/BaseApp_Create.cpp +++ b/source/ogre/BaseApp_Create.cpp @@ -353,6 +353,9 @@ bool BaseApp::setup() } mRoot->loadPlugin(PATHMANAGER::OgrePluginDir() + "/Plugin_ParticleFX" + D_SUFFIX); +#if defined(OGRE_VERSION) && OGRE_VERSION >= 0x10B00 + mRoot->loadPlugin(PATHMANAGER::OgrePluginDir() + "/Codec_STBI" + D_SUFFIX); +#endif #ifdef _DEBUG LogManager::getSingleton().setLogDetail(LL_BOREME);// @@ -386,9 +389,7 @@ bool BaseApp::setup() LogO(String(":::: Time setup gui: ") + fToStr(ti.getMilliseconds(),0,3) + " ms"); ti.reset(); createResourceListener(); - loadResources(); - LogO(String(":::: Time resources: ") + fToStr(ti.getMilliseconds(),0,3) + " ms"); ti.reset(); LogO("*** createFrameListener ***"); createFrameListener(); @@ -416,6 +417,10 @@ bool BaseApp::setup() LogO(String(":::: Time post, mat factory: ") + fToStr(ti.getMilliseconds(),0,3) + " ms"); ti.reset(); + loadResources(); + + LogO(String(":::: Time resources: ") + fToStr(ti.getMilliseconds(),0,3) + " ms"); ti.reset(); + LogO(String(":::: Time setup total: ") + fToStr(ti2.getMilliseconds(),0,3) + " ms"); return true; @@ -451,6 +456,15 @@ void BaseApp::setupResources() ResourceGroupManager::getSingleton().addResourceLocation( PATHMANAGER::Data() + "/" + archName, typeName, secName); } } + +#if defined(OGRE_VERSION) && OGRE_VERSION >= 0x10C00 + // create stubs for Ogre 1.12 core shaders (unused by stuntrally) + auto& gpm = HighLevelGpuProgramManager::getSingleton(); + for(auto name : {"PointLight", "DirLight", "PointLightFinite", "DirLightFinite"}) + gpm.createProgram("Ogre/ShadowExtrude"+String(name), "OgreInternal", "unified", GPT_VERTEX_PROGRAM); + gpm.createProgram("Ogre/ShadowBlendVP", "OgreInternal", "unified", GPT_VERTEX_PROGRAM); + gpm.createProgram("Ogre/ShadowBlendFP", "OgreInternal", "unified", GPT_FRAGMENT_PROGRAM); +#endif } void BaseApp::createResourceListener() diff --git a/source/ogre/BaseApp_Effects.cpp b/source/ogre/BaseApp_Effects.cpp index 77cdc6c8..06d85e0d 100644 --- a/source/ogre/BaseApp_Effects.cpp +++ b/source/ogre/BaseApp_Effects.cpp @@ -9,12 +9,13 @@ #include "SplitScreen.h" //#include "HDRCompositor.h" -#include <OgreRoot.h> #include <OgreCompositorManager.h> #include <OgreCompositionTargetPass.h> #include <OgreCompositionPass.h> #include <OgreTechnique.h> #include <OgreCompositor.h> +#include <OgreResourceGroupManager.h> + using namespace Ogre; @@ -135,16 +136,16 @@ void BaseApp::recreateCompositor() if (!ResourceGroupManager::getSingleton().resourceGroupExists("Effects")) { std::string sPath = PATHMANAGER::Data() + "/compositor"; - mRoot->addResourceLocation(sPath, "FileSystem", "Effects"); - mRoot->addResourceLocation(sPath + "/gbuffer", "FileSystem", "Effects"); - mRoot->addResourceLocation(sPath + "/bloom", "FileSystem", "Effects"); - mRoot->addResourceLocation(sPath + "/hdr", "FileSystem", "Effects"); - mRoot->addResourceLocation(sPath + "/motionblur", "FileSystem", "Effects"); - mRoot->addResourceLocation(sPath + "/ssao", "FileSystem", "Effects"); - mRoot->addResourceLocation(sPath + "/softparticles", "FileSystem", "Effects"); - mRoot->addResourceLocation(sPath + "/dof", "FileSystem", "Effects"); - mRoot->addResourceLocation(sPath + "/godrays", "FileSystem", "Effects"); - mRoot->addResourceLocation(sPath + "/filmgrain", "FileSystem", "Effects"); + ResourceGroupManager::getSingleton().addResourceLocation(sPath, "FileSystem", "Effects"); + ResourceGroupManager::getSingleton().addResourceLocation(sPath + "/gbuffer", "FileSystem", "Effects"); + ResourceGroupManager::getSingleton().addResourceLocation(sPath + "/bloom", "FileSystem", "Effects"); + ResourceGroupManager::getSingleton().addResourceLocation(sPath + "/hdr", "FileSystem", "Effects"); + ResourceGroupManager::getSingleton().addResourceLocation(sPath + "/motionblur", "FileSystem", "Effects"); + ResourceGroupManager::getSingleton().addResourceLocation(sPath + "/ssao", "FileSystem", "Effects"); + ResourceGroupManager::getSingleton().addResourceLocation(sPath + "/softparticles", "FileSystem", "Effects"); + ResourceGroupManager::getSingleton().addResourceLocation(sPath + "/dof", "FileSystem", "Effects"); + ResourceGroupManager::getSingleton().addResourceLocation(sPath + "/godrays", "FileSystem", "Effects"); + ResourceGroupManager::getSingleton().addResourceLocation(sPath + "/filmgrain", "FileSystem", "Effects"); ResourceGroupManager::getSingleton().initialiseResourceGroup("Effects"); } diff --git a/source/ogre/CarModel_Create.cpp b/source/ogre/CarModel_Create.cpp index f53d88f8..084b89ce 100644 --- a/source/ogre/CarModel_Create.cpp +++ b/source/ogre/CarModel_Create.cpp @@ -16,12 +16,12 @@ #include "../road/Road.h" #include "../shiny/Main/Factory.hpp" #include "../network/gameclient.hpp" -#include <OgreRoot.h> #include <OgreTerrain.h> #include <OgreEntity.h> #include <OgreManualObject.h> #include <OgreSubMesh.h> #include <OgreMaterialManager.h> +#include <OgreResourceGroupManager.h> #include <OgreParticleSystem.h> #include <OgreParticleEmitter.h> #include <OgreParticleAffector.h> @@ -401,8 +401,8 @@ void CarModel::Create() // Resource locations ----------------------------------------- /// Add a resource group for this car ResourceGroupManager::getSingleton().createResourceGroup(resGrpId); - Root::getSingletonPtr()->addResourceLocation(sCars, "FileSystem", resGrpId); - Root::getSingletonPtr()->addResourceLocation(sCars + "/textures", "FileSystem", resGrpId); + ResourceGroupManager::getSingleton().addResourceLocation(sCars, "FileSystem", resGrpId); + ResourceGroupManager::getSingleton().addResourceLocation(sCars + "/textures", "FileSystem", resGrpId); SceneNode* ndRoot = mSceneMgr->getRootSceneNode(); pMainNode = ndRoot->createChildSceneNode(); ToDel(pMainNode); @@ -645,8 +645,10 @@ void CarModel::Create() // this snippet makes sure the brake texture is pre-loaded. // since it is not used until you actually brake, we have to explicitely declare it ResourceGroupManager& resMgr = ResourceGroupManager::getSingleton(); - if (FileExists(rCar + "_body00_brake.png")) resMgr.declareResource(sDirname + "_body00_brake.png", "Texture", resGrpId); - if (FileExists(rCar + "_body00_add.png")) resMgr.declareResource(sDirname + "_body00_add.png", "Texture", resGrpId); + if (FileExists(rCar + "_body00_brake.png") && !resMgr.resourceExists(resGrpId, sDirname + "_body00_brake.png")) + resMgr.declareResource(sDirname + "_body00_brake.png", "Texture", resGrpId); + if (FileExists(rCar + "_body00_add.png") && !resMgr.resourceExists(resGrpId, sDirname + "_body00_add.png")) + resMgr.declareResource(sDirname + "_body00_add.png", "Texture", resGrpId); // now just preload the whole resource group resMgr.initialiseResourceGroup(resGrpId); diff --git a/source/ogre/SceneInit.cpp b/source/ogre/SceneInit.cpp index dacc9b9b..738a88df 100644 --- a/source/ogre/SceneInit.cpp +++ b/source/ogre/SceneInit.cpp @@ -26,6 +26,8 @@ #include <MyGUI_PointerManager.h> #include <OgreTerrainGroup.h> #include <OgreParticleSystem.h> +#include <OgreResourceGroupManager.h> + using namespace MyGUI; using namespace Ogre; @@ -255,10 +257,10 @@ void App::LoadCleanUp() // 1 first // rem old track if (dstTrk) { - if (resTrk != "") mRoot->removeResourceLocation(resTrk); + if (resTrk != "") ResourceGroupManager::getSingleton().removeResourceLocation(resTrk); LogO("------ Loading track: "+pSet->game.track); resTrk = gcom->TrkDir() + "objects"; - mRoot->addResourceLocation(resTrk, "FileSystem"); + ResourceGroupManager::getSingleton().addResourceLocation(resTrk, "FileSystem"); } // Delete all cars diff --git a/source/ogre/SplitScreen.cpp b/source/ogre/SplitScreen.cpp index 80455f39..8627b3e5 100644 --- a/source/ogre/SplitScreen.cpp +++ b/source/ogre/SplitScreen.cpp @@ -204,7 +204,7 @@ void SplitScr::preViewportUpdate(const RenderTargetViewportEvent& evt) // Update HUD for this car pApp->hud->ShowVp(true); - pApp->hud->Update(carId, 1.f / mWindow->getLastFPS()); + pApp->hud->Update(carId, 1.f / mWindow->getStatistics().lastFPS); /// Set sky pos to camera - TODO: fix, sky is center only for last player ... // idea: with compositor this needs separate sky nodes (own sky for each player) and showing 1 sky for 1 player @@ -266,7 +266,7 @@ void SplitScr::preViewportUpdate(const RenderTargetViewportEvent& evt) else { // Gui viewport - hide stuff we don't want - pApp->hud->Update(-1, 1.f / mWindow->getLastFPS()); + pApp->hud->Update(-1, 1.f / mWindow->getStatistics().lastFPS); pApp->hud->ShowVp(false); // no mouse in key capture mode diff --git a/source/ogre/common/GuiCom_Screen.cpp b/source/ogre/common/GuiCom_Screen.cpp index 0b1ddbff..d8976c61 100644 --- a/source/ogre/common/GuiCom_Screen.cpp +++ b/source/ogre/common/GuiCom_Screen.cpp @@ -102,7 +102,7 @@ void CGuiCom::InitGuiScreenRes() String modeSel = ""; std::vector<ScrRes> vRes; - const StringVector& videoModes = app->mRoot->getRenderSystem()->getConfigOptions()["Video Mode"].possibleValues; + const StringVector& videoModes = app->mRoot->getRenderSystem()->getConfigOptions().find("Video Mode")->second.possibleValues; for (int i=0; i < videoModes.size(); ++i) { String mode = videoModes[i]; diff --git a/source/ogre/common/SceneTrees.cpp b/source/ogre/common/SceneTrees.cpp index 41703878..7bd7be93 100644 --- a/source/ogre/common/SceneTrees.cpp +++ b/source/ogre/common/SceneTrees.cpp @@ -256,10 +256,8 @@ void CScene::CreateTrees() ImpostorTexture* it = new ImpostorTexture(&group, ent, true); // only to renderTextures() delete it; } - if (resMgr.resourceExistsInAnyGroup(fpng)) try { TextureManager::getSingleton().load(fpng, "BinFolder", TEX_TYPE_2D, MIP_UNLIMITED); ///T png first - resMgr.declareResource(fpng, "Texture", "BinFolder"); // preload }catch (Ogre::Exception&) { } } @@ -437,15 +435,6 @@ void CScene::CreateTrees() #endif } } - if (imp) - { - resMgr.initialiseResourceGroup("BinFolder"); - try { - resMgr.loadResourceGroup("BinFolder"); - }catch (Ogre::Exception& e) { // does throw not found impostors png sometimes, why? - LogO(e.getFullDescription()); - } - } trees->update(); LogO(String("***** Vegetation objects count: ") + toStr(cntr) + " shapes: " + toStr(cntshp)); diff --git a/source/ogre/common/Shadows.cpp b/source/ogre/common/Shadows.cpp index 2354ddb5..1db3da2e 100644 --- a/source/ogre/common/Shadows.cpp +++ b/source/ogre/common/Shadows.cpp @@ -17,6 +17,7 @@ #include "../../paged-geom/PagedGeometry.h" #include "../../paged-geom/GrassLoader.h" +#include <OgrePrerequisites.h> #include <OgreTimer.h> #include <OgreTerrain.h> #include <OgreShadowCameraSetupLiSPSM.h> @@ -163,8 +164,12 @@ void CScene::changeShadows() mSceneMgr->setShadowTextureSelfShadow(bDepth ? true : false); //-? mSceneMgr->setShadowCasterRenderBackFaces((bDepth && !bSoft) ? true : false); - +#if defined(OGRE_VERSION) && OGRE_VERSION < 0x10A00 mSceneMgr->setShadowTextureCasterMaterial(bDepth ? "shadowcaster_default" : ""); +#else + MaterialPtr shadowcast_mt = MaterialManager::getSingleton().getByName("shadowcaster_default"); + if (bDepth) mSceneMgr->setShadowTextureCasterMaterial(shadowcast_mt); +#endif } mSceneMgr->setShadowColour(ColourValue(0,0,0,1)); diff --git a/source/ogre/common/Sky.cpp b/source/ogre/common/Sky.cpp index 988ba858..2e7c6f1b 100644 --- a/source/ogre/common/Sky.cpp +++ b/source/ogre/common/Sky.cpp @@ -151,7 +151,7 @@ void CScene::UpdateWeather(Camera* cam, float mul) const Vector3& pos = cam->getPosition(), dir = cam->getDirection(); static Vector3 oldPos = Vector3::ZERO; - Vector3 vel = (pos-oldPos) * app->mWindow->getLastFPS(); oldPos = pos; + Vector3 vel = (pos-oldPos) * app->mWindow->getStatistics().lastFPS; oldPos = pos; Vector3 par = pos + dir * 12.f + vel * 0.6f; if (pr && sc->rainEmit > 0) diff --git a/source/ogre/common/TerrainBlend.cpp b/source/ogre/common/TerrainBlend.cpp index 2de87a8c..db8bc20e 100644 --- a/source/ogre/common/TerrainBlend.cpp +++ b/source/ogre/common/TerrainBlend.cpp @@ -9,6 +9,7 @@ #else #include "../CGame.h" #endif +#include <OgrePrerequisites.h> #include <OgreRoot.h> #include <OgreTimer.h> #include <OgreTerrain.h> @@ -17,6 +18,7 @@ #include <OgreRectangle2D.h> #include <OgreViewport.h> #include <OgreSceneNode.h> +#include <OgreMaterialManager.h> #include <OgreTextureManager.h> #include <OgreRenderTexture.h> #include "../../shiny/Main/Factory.hpp" @@ -50,7 +52,12 @@ void CScene::RenderToTex::Setup(Root* rt, String sName, TexturePtr pTex, String rect = new Rectangle2D(true); rect->setCorners(-1,1,1,-1); AxisAlignedBox aab; aab.setInfinite(); rect->setBoundingBox(aab); rect->setCastShadows(false); - rect->setMaterial( sMtr ); +#if defined(OGRE_VERSION) && OGRE_VERSION < 0x10A00 + rect->setMaterial(sMtr); +#else + MaterialPtr mtr = MaterialManager::getSingleton().getByName(sMtr); + rect->setMaterial(mtr); +#endif nd = scm->getRootSceneNode()->createChildSceneNode(sName+"N"); nd->attachObject(rect); @@ -85,9 +92,9 @@ void CScene::CreateBlendTex() // Blendmap rtt blendRTex = texMgr.createManual( sBlend, rgDef, TEX_TYPE_2D, - size, size, 0, PF_R8G8B8A8, TU_RENDERTARGET); + size, size, 0, PF_BYTE_BGRA, TU_RENDERTARGET); if (blendRTex.isNull()) - LogO("Error: Can't create RGBA (Blendmap) RenderTarget!"); + LogO("Error: Can't create BGRA (Blendmap) RenderTarget!"); // rtt copy (not needed) //blMap = texMgr.createManual("blendmapT", rgDef, TEX_TYPE_2D, @@ -124,8 +131,8 @@ void CScene::UpdBlendmap() pt->lock(HardwareBuffer::HBL_DISCARD); const PixelBox& pb = pt->getCurrentLock(); - float* pD = static_cast<float*>(pb.data); - size_t aD = pb.getRowSkip() * PixelUtil::getNumElemBytes(pb.format); + float* pD = reinterpret_cast<float*>(pb.data); + size_t aD = pb.getRowSkip(); register size_t j,i,a=0; for (j = 0; j < size; ++j) diff --git a/source/paged-geom/BatchedGeometry.cpp b/source/paged-geom/BatchedGeometry.cpp index 7ed4e504..7fce9244 100644 --- a/source/paged-geom/BatchedGeometry.cpp +++ b/source/paged-geom/BatchedGeometry.cpp @@ -176,9 +176,15 @@ uint32 CountUsedVertices(IndexData *id, std::map<uint32, uint32> &ibmap) uint16 *data = (uint16*)id->indexBuffer->lock(id->indexStart * sizeof(uint16), id->indexCount * sizeof(uint16), HardwareBuffer::HBL_READ_ONLY); - for (i = 0; i < id->indexCount; ++i) { + for (i = 0; i < id->indexCount; i++) { uint16 index = data[i]; - if (ibmap.find(index) == ibmap.end()) ibmap[index] = (uint32)(ibmap.size()); + if (ibmap.find(index) == ibmap.end()) + { + // use separate lines to avoid undefined compiler behavior. + // see: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0145r3.pdf?fbclid=IwAR2Wp4bQWvl0O9t7kBIXeiRsOxwxU8bttpes-gK71x_2j0ABtzGD5mcoF_c + uint32 size = (uint32)(ibmap.size()); + ibmap[index] = size; + } } count = (uint32)ibmap.size(); id->indexBuffer->unlock(); @@ -190,9 +196,15 @@ uint32 CountUsedVertices(IndexData *id, std::map<uint32, uint32> &ibmap) uint32 *data = (uint32*)id->indexBuffer->lock(id->indexStart * sizeof(uint32), id->indexCount * sizeof(uint32), HardwareBuffer::HBL_READ_ONLY); - for (i = 0; i < id->indexCount; ++i) { + for (i = 0; i < id->indexCount; i++) { uint32 index = data[i]; - if (ibmap.find(index) == ibmap.end()) ibmap[index] = (uint32)(ibmap.size()); + if (ibmap.find(index) == ibmap.end()) + { + // use separate lines to avoid undefined compiler behavior. + // see: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0145r3.pdf?fbclid=IwAR2Wp4bQWvl0O9t7kBIXeiRsOxwxU8bttpes-gK71x_2j0ABtzGD5mcoF_c + uint32 size = (uint32)(ibmap.size()); + ibmap[index] = size; + } } count = (uint32)ibmap.size(); id->indexBuffer->unlock(); @@ -200,7 +212,7 @@ uint32 CountUsedVertices(IndexData *id, std::map<uint32, uint32> &ibmap) break; default: - throw new Ogre::Exception(0, "Unknown index buffer type", "Converter.cpp::CountVertices"); + throw new Ogre::Exception(Exception::ERR_INVALIDPARAMS, "Unknown index buffer type", "Converter.cpp::CountVertices"); break; } @@ -369,8 +381,8 @@ void BatchedGeometry::clear() { m_pSceneNode->removeAllChildren(); if (m_pSceneNode->getParent()) - m_pSceneNode->getParentSceneNode()->removeAndDestroyChild(m_pSceneNode->getName()); - else + m_pSceneNode->getParentSceneNode()->removeChild(m_pSceneNode); + m_pSceneMgr->destroySceneNode(m_pSceneNode); m_pSceneNode = 0; @@ -545,7 +557,7 @@ void BatchedGeometry::SubBatch::addSubEntity(SubEntity *ent, const Vector3 &posi case VET_COLOUR_ABGR: break; default: - OGRE_EXCEPT(0, "Unknown RenderSystem color format", "BatchedGeometry::SubBatch::addSubMesh()"); + OGRE_EXCEPT(Exception::ERR_INVALIDPARAMS, "Unknown RenderSystem color format", "BatchedGeometry::SubBatch::addSubMesh()"); break; } } @@ -634,52 +646,42 @@ void BatchedGeometry::SubBatch::build() if (srcIndexType == HardwareIndexBuffer::IT_32BIT) { - //Lock the input buffer - uint32 *source = static_cast<uint32*>(sourceIndexData->indexBuffer->lock( - sourceIndexData->indexStart, sourceIndexData->indexCount, HardwareBuffer::HBL_READ_ONLY)); - uint32 *sourceEnd = source + sourceIndexData->indexCount; - - //And copy it to the output buffer - while (source != sourceEnd) - *indexBuffer32++ = static_cast<uint32>(*source++ + indexOffset); - - sourceIndexData->indexBuffer->unlock(); // Unlock the input buffer - indexOffset += queuedMesh.subMesh->vertexData->vertexCount; // Increment the index offset + sourceIndexData->indexBuffer->readData( + sourceIndexData->indexStart * sizeof(uint32), + sourceIndexData->indexCount * sizeof(uint32), indexBuffer32); + uint32 *updateEnd = indexBuffer32 + sourceIndexData->indexCount; + + // add indexOffset + while (indexBuffer32 != updateEnd) + *indexBuffer32++ += indexOffset; } else { if (destIndexType == HardwareIndexBuffer::IT_32BIT) { //-- Convert 16 bit to 32 bit indices -- + std::vector<uint16> tmp(sourceIndexData->indexCount); //Lock the input buffer - uint16 *source = static_cast<uint16*>(sourceIndexData->indexBuffer->lock( - sourceIndexData->indexStart, sourceIndexData->indexCount, HardwareBuffer::HBL_READ_ONLY)); + sourceIndexData->indexBuffer->readData(sourceIndexData->indexStart*sizeof(uint16), tmp.size(), tmp.data()); + uint16 *source = tmp.data(); uint16 *sourceEnd = source + sourceIndexData->indexCount; //And copy it to the output buffer while (source != sourceEnd) - { - uint32 indx = *source++; - *indexBuffer32++ = (indx + indexOffset); - } - - sourceIndexData->indexBuffer->unlock(); // Unlock the input buffer - indexOffset += queuedMesh.subMesh->vertexData->vertexCount; // Increment the index offset + *indexBuffer32++ = (*source++ + indexOffset); } else { - //Lock the input buffer - uint16 *source = static_cast<uint16*>(sourceIndexData->indexBuffer->lock( - sourceIndexData->indexStart, sourceIndexData->indexCount, HardwareBuffer::HBL_READ_ONLY)); - uint16 *sourceEnd = source + sourceIndexData->indexCount; - - //And copy it to the output buffer - while (source != sourceEnd) - *indexBuffer16++ = static_cast<uint16>(*source++ + indexOffset); - - sourceIndexData->indexBuffer->unlock(); // Unlock the input buffer - indexOffset += queuedMesh.subMesh->vertexData->vertexCount; // Increment the index offset + sourceIndexData->indexBuffer->readData( + sourceIndexData->indexStart * sizeof(uint16), + sourceIndexData->indexCount * sizeof(uint16), indexBuffer16); + uint16 *updateEnd = indexBuffer16 + sourceIndexData->indexCount; + + // add indexOffset + while (indexBuffer16 != updateEnd) + *indexBuffer16++ += indexOffset; } + indexOffset += queuedMesh.subMesh->vertexData->vertexCount; // Increment the index offset } } // For each queued mesh @@ -709,6 +711,8 @@ void BatchedGeometry::SubBatch::_buildIdentiryOrientation(const QueuedMesh &queu VertexBufferBinding *sourceBinds = sourceVertexData->vertexBufferBinding; VertexBufferBinding *destBinds = dstVertexData->vertexBufferBinding; + std::vector<uchar> shadowBuf; + // For each vertex buffer for (unsigned short ibuffer = 0, bufCnt = destBinds->getBufferCount(); ibuffer < bufCnt; ++ibuffer) { @@ -716,7 +720,11 @@ void BatchedGeometry::SubBatch::_buildIdentiryOrientation(const QueuedMesh &queu { //Lock the input buffer const HardwareVertexBufferSharedPtr &sourceBuffer = sourceBinds->getBuffer(ibuffer); - uchar *sourceBase = static_cast<uchar*>(sourceBuffer->lock(HardwareBuffer::HBL_READ_ONLY)); + + shadowBuf.resize(sourceBuffer->getSizeInBytes()); + sourceBuffer->readData(0, sourceBuffer->getSizeInBytes(), shadowBuf.data()); + uchar *sourceBase = shadowBuf.data(); + uchar *destBase = vertexBuffers[ibuffer]; //Get the locked output buffer const VertexDeclaration::VertexElementList &elems = vertexBufferElements[ibuffer]; @@ -786,7 +794,6 @@ void BatchedGeometry::SubBatch::_buildIdentiryOrientation(const QueuedMesh &queu } vertexBuffers[ibuffer] = destBase; - sourceBuffer->unlock(); // unlock the input buffer } else { @@ -833,6 +840,8 @@ void BatchedGeometry::SubBatch::_buildFullTransform(const QueuedMesh &queuedMesh VertexBufferBinding *sourceBinds = sourceVertexData->vertexBufferBinding; VertexBufferBinding *destBinds = dstVertexData->vertexBufferBinding; + std::vector<uchar> shadowBuf; + // For each vertex buffer for (unsigned short ibuffer = 0, bufCnt = destBinds->getBufferCount(); ibuffer < bufCnt; ++ibuffer) { @@ -840,7 +849,9 @@ void BatchedGeometry::SubBatch::_buildFullTransform(const QueuedMesh &queuedMesh { //Lock the input buffer const HardwareVertexBufferSharedPtr &sourceBuffer = sourceBinds->getBuffer(ibuffer); - uchar *sourceBase = static_cast<uchar*>(sourceBuffer->lock(HardwareBuffer::HBL_READ_ONLY)); + shadowBuf.resize(sourceBuffer->getSizeInBytes()); + sourceBuffer->readData(0, sourceBuffer->getSizeInBytes(), shadowBuf.data()); + uchar *sourceBase = shadowBuf.data(); //Get the locked output buffer uchar *destBase = vertexBuffers[ibuffer]; diff --git a/source/paged-geom/PagedGeometry.cpp b/source/paged-geom/PagedGeometry.cpp index ba94f77b..24734882 100644 --- a/source/paged-geom/PagedGeometry.cpp +++ b/source/paged-geom/PagedGeometry.cpp @@ -164,7 +164,7 @@ Vector3 PagedGeometry::_convertToLocal(const Vector3 &globalVec) const void PagedGeometry::setPageSize(Real size) { if (!managerList.empty()) - OGRE_EXCEPT(0, "PagedGeometry::setPageSize() cannot be called after detail levels have been added. Call removeDetailLevels() first.", "PagedGeometry::setPageSize()"); + OGRE_EXCEPT(Exception::ERR_INVALIDPARAMS, "PagedGeometry::setPageSize() cannot be called after detail levels have been added. Call removeDetailLevels() first.", "PagedGeometry::setPageSize()"); pageSize = size; } @@ -172,7 +172,7 @@ void PagedGeometry::setPageSize(Real size) void PagedGeometry::setInfinite() { if (!managerList.empty()) - OGRE_EXCEPT(0, "PagedGeometry::setInfinite() cannot be called after detail levels have been added. Call removeDetailLevels() first.", "PagedGeometry::setInfinite()"); + OGRE_EXCEPT(Exception::ERR_INVALIDPARAMS, "PagedGeometry::setInfinite() cannot be called after detail levels have been added. Call removeDetailLevels() first.", "PagedGeometry::setInfinite()"); m_bounds = TBounds(0, 0, 0, 0); } @@ -180,7 +180,7 @@ void PagedGeometry::setInfinite() void PagedGeometry::setBounds(TBounds bounds) { if (!managerList.empty()) - OGRE_EXCEPT(0, "PagedGeometry::setBounds() cannot be called after detail levels have been added. Call removeDetailLevels() first.", "PagedGeometry::setBounds()"); + OGRE_EXCEPT(Exception::ERR_INVALIDPARAMS, "PagedGeometry::setBounds() cannot be called after detail levels have been added. Call removeDetailLevels() first.", "PagedGeometry::setBounds()"); if (!Math::RealEqual(bounds.width(), bounds.height(), 0.01f)) OGRE_EXCEPT(Exception::ERR_INVALIDPARAMS, "Bounds must be square", "PagedGeometry::setBounds()"); if (bounds.width() <= 0 || bounds.height() <=0) @@ -364,7 +364,7 @@ void PagedGeometry::_addDetailLevel(GeometryPageManager *mgr, Real maxRange, Rea //Error check if (maxRange <= minRange){ - OGRE_EXCEPT(1, "Closer detail levels must be added before farther ones", "PagedGeometry::addDetailLevel()"); + OGRE_EXCEPT(Exception::ERR_INVALIDPARAMS, "Closer detail levels must be added before farther ones", "PagedGeometry::addDetailLevel()"); } //Setup the new manager diff --git a/source/paged-geom/PropertyMaps.cpp b/source/paged-geom/PropertyMaps.cpp index c253e304..c123fdb0 100644 --- a/source/paged-geom/PropertyMaps.cpp +++ b/source/paged-geom/PropertyMaps.cpp @@ -112,7 +112,7 @@ DensityMap::DensityMap(TexturePtr map, MapChannel channel) case CHANNEL_GREEN: channelOffset = 2; break; case CHANNEL_BLUE: channelOffset = 1; break; case CHANNEL_ALPHA: channelOffset = 0; break; - default: OGRE_EXCEPT(0, "Invalid channel", "GrassLayer::setDensityMap()"); break; + default: OGRE_EXCEPT(Exception::ERR_INVALIDPARAMS, "Invalid channel", "GrassLayer::setDensityMap()"); break; } //And copy that channel into the density map @@ -164,7 +164,7 @@ DensityMap::DensityMap(String map, MapChannel channel) case CHANNEL_BLUE: colval = col.b; break; case CHANNEL_ALPHA: colval = col.a; break; case CHANNEL_COLOR: colval = col.r; break; - default: OGRE_EXCEPT(0, "Invalid channel", "GrassLayer::setDensityMap()"); break; + default: OGRE_EXCEPT(Exception::ERR_INVALIDPARAMS, "Invalid channel", "GrassLayer::setDensityMap()"); break; } outputPtr[j*width+i] = colval * 255.0f; @@ -321,7 +321,7 @@ ColorMap::ColorMap(TexturePtr map, MapChannel channel) channel = CHANNEL_RED; break; default: - OGRE_EXCEPT(0, "Unknown RenderSystem color format", "GrassLayer::setColorMap()"); + OGRE_EXCEPT(Exception::ERR_INVALIDPARAMS, "Unknown RenderSystem color format", "GrassLayer::setColorMap()"); break; } @@ -344,7 +344,7 @@ ColorMap::ColorMap(TexturePtr map, MapChannel channel) case CHANNEL_GREEN: channelOffset = 2; break; case CHANNEL_BLUE: channelOffset = 1; break; case CHANNEL_ALPHA: channelOffset = 0; break; - default: OGRE_EXCEPT(0, "Invalid channel", "ColorMap::ColorMap()"); break; + default: OGRE_EXCEPT(Exception::ERR_INVALIDPARAMS, "Invalid channel", "ColorMap::ColorMap()"); break; } //And copy that channel into the density map diff --git a/source/paged-geom/StaticBillboardSet.cpp b/source/paged-geom/StaticBillboardSet.cpp index 3371feae..57d51d16 100644 --- a/source/paged-geom/StaticBillboardSet.cpp +++ b/source/paged-geom/StaticBillboardSet.cpp @@ -121,10 +121,11 @@ StaticBillboardSet::~StaticBillboardSet() //Remove billboard set mpSceneMgr->destroyBillboardSet(mpFallbackBillboardSet); + mpSceneNode->removeAllChildren(); //Delete scene node if (mpSceneNode->getParent()) - mpSceneNode->getParentSceneNode()->removeAndDestroyChild(mpSceneNode->getName()); - else + mpSceneNode->getParentSceneNode()->removeChild(mpSceneNode); + mpSceneNode->getCreator()->destroySceneNode(mpSceneNode); } diff --git a/source/paged-geom/TreeLoader2D.cpp b/source/paged-geom/TreeLoader2D.cpp index ac906a5d..56d16ece 100644 --- a/source/paged-geom/TreeLoader2D.cpp +++ b/source/paged-geom/TreeLoader2D.cpp @@ -542,7 +542,7 @@ void TreeIterator2D::moveNext() { //Out of bounds check if (!hasMore) - OGRE_EXCEPT(1, "Cannot read past end of TreeIterator list", "TreeIterator::moveNext()"); + OGRE_EXCEPT(Exception::ERR_INVALIDPARAMS, "Cannot read past end of TreeIterator list", "TreeIterator::moveNext()"); //Preserve the last tree prevTreeDat = currentTreeDat; diff --git a/source/paged-geom/TreeLoader3D.cpp b/source/paged-geom/TreeLoader3D.cpp index 48ed02ea..4dd838d4 100644 --- a/source/paged-geom/TreeLoader3D.cpp +++ b/source/paged-geom/TreeLoader3D.cpp @@ -529,7 +529,7 @@ void TreeIterator3D::moveNext() { //Out of bounds check if (!hasMore) - OGRE_EXCEPT(1, "Cannot read past end of TreeIterator list", "TreeIterator::moveNext()"); + OGRE_EXCEPT(Exception::ERR_INVALIDPARAMS, "Cannot read past end of TreeIterator list", "TreeIterator::moveNext()"); //Preserve the last tree prevTreeDat = currentTreeDat; diff --git a/source/paged-geom/WindBatchedGeometry.cpp b/source/paged-geom/WindBatchedGeometry.cpp index a385d972..e340473b 100644 --- a/source/paged-geom/WindBatchedGeometry.cpp +++ b/source/paged-geom/WindBatchedGeometry.cpp @@ -198,7 +198,7 @@ void WindBatchedGeometry::WindSubBatch::build() } - + std::vector<uchar> shadowBuf; //For each queued mesh... size_t indexOffset = 0; for (size_t iMesh = 0, meshCnt = m_queueMesh.size(); iMesh < meshCnt; ++iMesh) @@ -232,7 +232,9 @@ void WindBatchedGeometry::WindSubBatch::build() { //Lock the input buffer const HardwareVertexBufferSharedPtr &sourceBuffer = sourceBinds->getBuffer(i); - uchar *sourceBase = static_cast<uchar*>(sourceBuffer->lock(HardwareBuffer::HBL_READ_ONLY)); + shadowBuf.resize(sourceBuffer->getSizeInBytes()); + sourceBuffer->readData(0, sourceBuffer->getSizeInBytes(), shadowBuf.data()); + uchar *sourceBase = shadowBuf.data(); size_t sourceVertexSize = sourceBuffer->getVertexSize(); size_t destVertexSize = vertDecl->getVertexSize(i); @@ -336,7 +338,6 @@ void WindBatchedGeometry::WindSubBatch::build() //Unlock the input buffer vertexBuffers[i] = destBase; - sourceBuffer->unlock(); } else { @@ -366,66 +367,44 @@ void WindBatchedGeometry::WindSubBatch::build() //Copy mesh index data into the index buffer if (srcIndexType == HardwareIndexBuffer::IT_32BIT) { - //Lock the input buffer - uint32 *source = static_cast<uint32*>(sourceIndexData->indexBuffer->lock( - sourceIndexData->indexStart, sourceIndexData->indexCount, HardwareBuffer::HBL_READ_ONLY)); - uint32 *sourceEnd = source + sourceIndexData->indexCount; - - //And copy it to the output buffer - while (source != sourceEnd) { - *indexBuffer32++ = static_cast<uint32>(*source++ + indexOffset); - } - - //Unlock the input buffer - sourceIndexData->indexBuffer->unlock(); - - //Increment the index offset - indexOffset += sourceVertexData->vertexCount; + sourceIndexData->indexBuffer->readData( + sourceIndexData->indexStart * sizeof(uint32), + sourceIndexData->indexCount * sizeof(uint32), indexBuffer32); + uint32 *updateEnd = indexBuffer32 + sourceIndexData->indexCount; + + // add indexOffset + while (indexBuffer32 != updateEnd) + *indexBuffer32++ += indexOffset; } else { if (destIndexType == HardwareIndexBuffer::IT_32BIT) { //-- Convert 16 bit to 32 bit indices -- + std::vector<uint16> tmp(sourceIndexData->indexCount); //Lock the input buffer - uint16 *source = static_cast<uint16*>(sourceIndexData->indexBuffer->lock( - sourceIndexData->indexStart, sourceIndexData->indexCount, HardwareBuffer::HBL_READ_ONLY - )); + sourceIndexData->indexBuffer->readData(sourceIndexData->indexStart*sizeof(uint16), tmp.size(), tmp.data()); + uint16 *source = tmp.data(); uint16 *sourceEnd = source + sourceIndexData->indexCount; //And copy it to the output buffer - while (source != sourceEnd) { - uint32 indx = *source++; - *indexBuffer32++ = (indx + indexOffset); + while (source != sourceEnd) + *indexBuffer32++ = (*source++ + indexOffset); } - - //Unlock the input buffer - sourceIndexData->indexBuffer->unlock(); - - //Increment the index offset - indexOffset += sourceVertexData->vertexCount; - } else { - //Lock the input buffer - uint16 *source = static_cast<uint16*>(sourceIndexData->indexBuffer->lock( - sourceIndexData->indexStart, sourceIndexData->indexCount, HardwareBuffer::HBL_READ_ONLY - )); - uint16 *sourceEnd = source + sourceIndexData->indexCount; - - //And copy it to the output buffer - while (source != sourceEnd) - { - *indexBuffer16++ = static_cast<uint16>(*source++ + indexOffset); - } - - //Unlock the input buffer - sourceIndexData->indexBuffer->unlock(); - - //Increment the index offset - indexOffset += sourceVertexData->vertexCount; + sourceIndexData->indexBuffer->readData( + sourceIndexData->indexStart * sizeof(uint16), + sourceIndexData->indexCount * sizeof(uint16), indexBuffer16); + uint16 *updateEnd = indexBuffer16 + sourceIndexData->indexCount; + + // add indexOffset + while (indexBuffer16 != updateEnd) + *indexBuffer16++ += indexOffset; } } + //Increment the index offset + indexOffset += sourceVertexData->vertexCount; } //Unlock buffers diff --git a/source/sdl4ogre/sdlcursormanager.cpp b/source/sdl4ogre/sdlcursormanager.cpp index a7437208..34ac6efb 100644 --- a/source/sdl4ogre/sdlcursormanager.cpp +++ b/source/sdl4ogre/sdlcursormanager.cpp @@ -90,7 +90,7 @@ namespace SFO std::vector<Ogre::uint32> data; data.resize(size_x*size_y); Ogre::PixelBox destImage(size_x, size_y, 1, tex->getFormat(), &data[0]); - Ogre::Image::Box srcBox(left, top, left+size_x, top+size_y); + Ogre::Box srcBox(left, top, left+size_x, top+size_y); tex->getBuffer()->blitToMemory(srcBox, destImage); SDL_Surface* surf = SDL_CreateRGBSurface(0,size_x,size_y,32,0xFF000000,0x00FF0000,0x0000FF00,0x000000FF); diff --git a/source/sdl4ogre/sdlinputwrapper.cpp b/source/sdl4ogre/sdlinputwrapper.cpp index c1195f9d..77bb197c 100644 --- a/source/sdl4ogre/sdlinputwrapper.cpp +++ b/source/sdl4ogre/sdlinputwrapper.cpp @@ -5,6 +5,7 @@ #include <OgrePlatform.h> #include <OgreRoot.h> +#include <iostream> namespace SFO { @@ -108,11 +109,11 @@ namespace SFO mJoyListener->buttonReleased(evt.jbutton, evt.jbutton.button); break; case SDL_JOYDEVICEADDED: - //SDL_JoystickOpen(evt.jdevice.which); - //std::cout << "Detected a new joystick: " << SDL_JoystickNameForIndex(evt.jdevice.which) << std::endl; + SDL_JoystickOpen(evt.jdevice.which); + std::cout << "Detected a new joystick: " << SDL_JoystickNameForIndex(evt.jdevice.which) << std::endl; break; case SDL_JOYDEVICEREMOVED: - //std::cout << "A joystick has been removed" << std::endl; + std::cout << "A joystick has been removed" << std::endl; break; case SDL_WINDOWEVENT: handleWindowEvent(evt); diff --git a/source/sdl4ogre/sdlwindowhelper.cpp b/source/sdl4ogre/sdlwindowhelper.cpp index 0fa34605..ee19a90b 100644 --- a/source/sdl4ogre/sdlwindowhelper.cpp +++ b/source/sdl4ogre/sdlwindowhelper.cpp @@ -24,6 +24,7 @@ SDLWindowHelper::SDLWindowHelper (SDL_Window* window, int w, int h, if (!SDL_GetWindowWMInfo(mSDLWindow, &wmInfo)) throw std::runtime_error("Couldn't get WM Info!"); + Ogre::String param = "externalWindowHandle"; Ogre::String winHandle; switch (wmInfo.subsystem) @@ -43,6 +44,7 @@ SDLWindowHelper::SDLWindowHelper (SDL_Window* window, int w, int h, break; #else case SDL_SYSWM_X11: + param = "parentWindowHandle"; winHandle = Ogre::StringConverter::toString((unsigned long)wmInfo.info.x11.window); break; #endif @@ -51,9 +53,7 @@ SDLWindowHelper::SDLWindowHelper (SDL_Window* window, int w, int h, break; } - /// \todo externalWindowHandle is deprecated according to the source code. Figure out a way to get parentWindowHandle - /// to work properly. On Linux/X11 it causes an occasional GLXBadDrawable error. - params.insert(std::make_pair("externalWindowHandle", winHandle)); + params.insert(std::make_pair(param, winHandle)); mWindow = Ogre::Root::getSingleton().createRenderWindow(title, w, h, fullscreen, ¶ms); } diff --git a/source/shiny/Platforms/Ogre/OgreGpuProgram.cpp b/source/shiny/Platforms/Ogre/OgreGpuProgram.cpp index cce395d2..f27fbfe3 100644 --- a/source/shiny/Platforms/Ogre/OgreGpuProgram.cpp +++ b/source/shiny/Platforms/Ogre/OgreGpuProgram.cpp @@ -1,5 +1,6 @@ #include "pch.h" #include <stdexcept> +#include <iostream> #include "OgreGpuProgram.hpp" diff --git a/source/shiny/Platforms/Ogre/OgreMaterial.cpp b/source/shiny/Platforms/Ogre/OgreMaterial.cpp index a375e4b1..b1fdb29e 100644 --- a/source/shiny/Platforms/Ogre/OgreMaterial.cpp +++ b/source/shiny/Platforms/Ogre/OgreMaterial.cpp @@ -70,6 +70,10 @@ namespace sh bool OgreMaterial::createConfiguration (const std::string& name, unsigned short lodIndex) { + // drop dummy technique + if(mMaterial->getTechnique(0)->getNumPasses() == 0) + mMaterial->removeTechnique(0); + for (int i=0; i<mMaterial->getNumTechniques(); ++i) { if (mMaterial->getTechnique(i)->getSchemeName() == name && mMaterial->getTechnique(i)->getLodIndex() == lodIndex) diff --git a/source/shiny/Platforms/Ogre/OgreMaterialSerializer.cpp b/source/shiny/Platforms/Ogre/OgreMaterialSerializer.cpp index 7a5aa705..359a556e 100644 --- a/source/shiny/Platforms/Ogre/OgreMaterialSerializer.cpp +++ b/source/shiny/Platforms/Ogre/OgreMaterialSerializer.cpp @@ -4,36 +4,1902 @@ #include <OgrePass.h> #include <OgreStringConverter.h> +#include <OgreLodStrategyManager.h> +#include <OgreDistanceLodStrategy.h> +#include <OgreLogManager.h> + +namespace Ogre +{ + /** Struct for holding the script context while parsing. */ + struct MaterialScriptContext + { + MaterialPtr material; + Pass* pass; + TextureUnitState* textureUnit; + AliasTextureNamePairList textureAliases; + }; +} + +//----------------------------------------------------------------------- +// Internal parser methods +//----------------------------------------------------------------------- +namespace +{ + using namespace Ogre; + + void logParseError(const String& error, const MaterialScriptContext& context) + { + // log material name only if filename not specified + if (context.material.get()) + { + LogManager::getSingleton().logMessage( + "Error in material " + context.material->getName() + + " : " + error, LML_CRITICAL); + } + else + { + LogManager::getSingleton().logMessage("Error: "+error, LML_CRITICAL); + } + } + void trimAndUnquoteWord(String& val) + { + StringUtil::trim(val); + if(val.size() >= 2 && val[0] == '\"' && val[val.size() - 1] == '\"') + val = val.substr(1, val.size() - 2); + } + ColourValue _parseColourValue(StringVector& vecparams) + { + return ColourValue( + StringConverter::parseReal(vecparams[0]) , + StringConverter::parseReal(vecparams[1]) , + StringConverter::parseReal(vecparams[2]) , + (vecparams.size()==4) ? StringConverter::parseReal(vecparams[3]) : 1.0f ) ; + } + //----------------------------------------------------------------------- + FilterOptions convertFiltering(const String& s) + { + if (s == "none") + { + return FO_NONE; + } + else if (s == "point") + { + return FO_POINT; + } + else if (s == "linear") + { + return FO_LINEAR; + } + else if (s == "anisotropic") + { + return FO_ANISOTROPIC; + } + + return FO_POINT; + } + bool parseLodValues(String& params, MaterialScriptContext& context) + { + StringVector vecparams = StringUtil::split(params, " \t"); + + // iterate over the parameters and parse values out of them + Material::LodValueList lodList; + StringVector::iterator i, iend; + iend = vecparams.end(); + for (i = vecparams.begin(); i != iend; ++i) + { + lodList.push_back(StringConverter::parseReal(*i)); + } + + context.material->setLodLevels(lodList); + + return false; + } + //----------------------------------------------------------------------- + bool parseLodStrategy(String& params, MaterialScriptContext& context) + { + LodStrategy *strategy = LodStrategyManager::getSingleton().getStrategy(params); + + if (strategy == 0) + logParseError( + "Bad lod_strategy attribute, available LOD strategy name expected.", + context); + + context.material->setLodStrategy(strategy); + + return false; + } + //----------------------------------------------------------------------- + bool parseLodDistances(String& params, MaterialScriptContext& context) + { + // Set to distance strategy + context.material->setLodStrategy(DistanceLodSphereStrategy::getSingletonPtr()); + + StringVector vecparams = StringUtil::split(params, " \t"); + + // iterate over the parameters and parse values out of them + Material::LodValueList lodList; + StringVector::iterator i, iend; + iend = vecparams.end(); + for (i = vecparams.begin(); i != iend; ++i) + { + lodList.push_back(StringConverter::parseReal(*i)); + } + + context.material->setLodLevels(lodList); + + return false; + } + bool parseReceiveShadows(String& params, MaterialScriptContext& context) + { + StringUtil::toLowerCase(params); + if (params == "on") + context.material->setReceiveShadows(true); + else if (params == "off") + context.material->setReceiveShadows(false); + else + logParseError( + "Bad receive_shadows attribute, valid parameters are 'on' or 'off'.", + context); + + return false; + + } + bool parseTransparencyCastsShadows(String& params, MaterialScriptContext& context) + { + StringUtil::toLowerCase(params); + if (params == "on") + context.material->setTransparencyCastsShadows(true); + else if (params == "off") + context.material->setTransparencyCastsShadows(false); + else + logParseError( + "Bad transparency_casts_shadows attribute, valid parameters are 'on' or 'off'.", + context); + + return false; + } + bool parseSetTextureAlias(String& params, MaterialScriptContext& context) + { + StringVector vecparams = StringUtil::split(params, " \t"); + if (vecparams.size() != 2) + { + logParseError("Wrong number of parameters for texture_alias, expected 2", context); + return false; + } + // first parameter is alias name and second parameter is texture name + context.textureAliases[vecparams[0]] = vecparams[1]; + + return false; + } + bool parseAmbient(String& params, MaterialScriptContext& context) + { + StringVector vecparams = StringUtil::split(params, " \t"); + // Must be 1, 3 or 4 parameters + if (vecparams.size() == 1) { + if(vecparams[0] == "vertexcolour") { + context.pass->setVertexColourTracking(context.pass->getVertexColourTracking() | TVC_AMBIENT); + } else { + logParseError( + "Bad ambient attribute, single parameter flag must be 'vertexcolour'", + context); + } + } + else if (vecparams.size() == 3 || vecparams.size() == 4) + { + context.pass->setAmbient( _parseColourValue(vecparams) ); + context.pass->setVertexColourTracking(context.pass->getVertexColourTracking() & ~TVC_AMBIENT); + } + else + { + logParseError( + "Bad ambient attribute, wrong number of parameters (expected 1, 3 or 4)", + context); + } + return false; + } + //----------------------------------------------------------------------- + bool parseDiffuse(String& params, MaterialScriptContext& context) + { + StringVector vecparams = StringUtil::split(params, " \t"); + // Must be 1, 3 or 4 parameters + if (vecparams.size() == 1) { + if(vecparams[0] == "vertexcolour") { + context.pass->setVertexColourTracking(context.pass->getVertexColourTracking() | TVC_DIFFUSE); + } else { + logParseError( + "Bad diffuse attribute, single parameter flag must be 'vertexcolour'", + context); + } + } + else if (vecparams.size() == 3 || vecparams.size() == 4) + { + context.pass->setDiffuse( _parseColourValue(vecparams) ); + context.pass->setVertexColourTracking(context.pass->getVertexColourTracking() & ~TVC_DIFFUSE); + } + else + { + logParseError( + "Bad diffuse attribute, wrong number of parameters (expected 1, 3 or 4)", + context); + } return false; + } + //----------------------------------------------------------------------- + bool parseSpecular(String& params, MaterialScriptContext& context) + { + StringVector vecparams = StringUtil::split(params, " \t"); + // Must be 2, 4 or 5 parameters + if(vecparams.size() == 2) + { + if(vecparams[0] == "vertexcolour") { + context.pass->setVertexColourTracking(context.pass->getVertexColourTracking() | TVC_SPECULAR); + context.pass->setShininess(StringConverter::parseReal(vecparams[1]) ); + } + else + { + logParseError( + "Bad specular attribute, double parameter statement must be 'vertexcolour <shininess>'", + context); + } + } + else if(vecparams.size() == 4 || vecparams.size() == 5) + { + context.pass->setSpecular( + StringConverter::parseReal(vecparams[0]), + StringConverter::parseReal(vecparams[1]), + StringConverter::parseReal(vecparams[2]), + vecparams.size() == 5? + StringConverter::parseReal(vecparams[3]) : 1.0f); + context.pass->setVertexColourTracking(context.pass->getVertexColourTracking() & ~TVC_SPECULAR); + context.pass->setShininess( + StringConverter::parseReal(vecparams[vecparams.size() - 1]) ); + } + else + { + logParseError( + "Bad specular attribute, wrong number of parameters (expected 2, 4 or 5)", + context); + } + return false; + } + //----------------------------------------------------------------------- + bool parseEmissive(String& params, MaterialScriptContext& context) + { + StringVector vecparams = StringUtil::split(params, " \t"); + // Must be 1, 3 or 4 parameters + if (vecparams.size() == 1) { + if(vecparams[0] == "vertexcolour") { + context.pass->setVertexColourTracking(context.pass->getVertexColourTracking() | TVC_EMISSIVE); + } else { + logParseError( + "Bad emissive attribute, single parameter flag must be 'vertexcolour'", + context); + } + } + else if (vecparams.size() == 3 || vecparams.size() == 4) + { + context.pass->setSelfIllumination( _parseColourValue(vecparams) ); + context.pass->setVertexColourTracking(context.pass->getVertexColourTracking() & ~TVC_EMISSIVE); + } + else + { + logParseError( + "Bad emissive attribute, wrong number of parameters (expected 1, 3 or 4)", + context); + } + return false; + } + //----------------------------------------------------------------------- + SceneBlendFactor convertBlendFactor(const String& param) + { + if (param == "one") + return SBF_ONE; + else if (param == "zero") + return SBF_ZERO; + else if (param == "dest_colour") + return SBF_DEST_COLOUR; + else if (param == "src_colour") + return SBF_SOURCE_COLOUR; + else if (param == "one_minus_dest_colour") + return SBF_ONE_MINUS_DEST_COLOUR; + else if (param == "one_minus_src_colour") + return SBF_ONE_MINUS_SOURCE_COLOUR; + else if (param == "dest_alpha") + return SBF_DEST_ALPHA; + else if (param == "src_alpha") + return SBF_SOURCE_ALPHA; + else if (param == "one_minus_dest_alpha") + return SBF_ONE_MINUS_DEST_ALPHA; + else if (param == "one_minus_src_alpha") + return SBF_ONE_MINUS_SOURCE_ALPHA; + else + { + OGRE_EXCEPT(Exception::ERR_INVALIDPARAMS, "Invalid blend factor.", "convertBlendFactor"); + } + + + } + //----------------------------------------------------------------------- + bool parseSceneBlend(String& params, MaterialScriptContext& context) + { + StringUtil::toLowerCase(params); + StringVector vecparams = StringUtil::split(params, " \t"); + // Should be 1 or 2 params + if (vecparams.size() == 1) + { + //simple + SceneBlendType stype; + if (vecparams[0] == "add") + stype = SBT_ADD; + else if (vecparams[0] == "modulate") + stype = SBT_MODULATE; + else if (vecparams[0] == "colour_blend") + stype = SBT_TRANSPARENT_COLOUR; + else if (vecparams[0] == "alpha_blend") + stype = SBT_TRANSPARENT_ALPHA; + else + { + logParseError( + "Bad scene_blend attribute, unrecognised parameter '" + vecparams[0] + "'", + context); + return false; + } + context.pass->setSceneBlending(stype); + + } + else if (vecparams.size() == 2) + { + //src/dest + SceneBlendFactor src, dest; + + try { + src = convertBlendFactor(vecparams[0]); + dest = convertBlendFactor(vecparams[1]); + context.pass->setSceneBlending(src,dest); + } + catch (Exception& e) + { + logParseError("Bad scene_blend attribute, " + e.getDescription(), context); + } + + } + else + { + logParseError( + "Bad scene_blend attribute, wrong number of parameters (expected 1 or 2)", + context); + } + + return false; + + } + //----------------------------------------------------------------------- + bool parseSeparateSceneBlend(String& params, MaterialScriptContext& context) + { + StringUtil::toLowerCase(params); + StringVector vecparams = StringUtil::split(params, " \t"); + // Should be 2 or 4 params + if (vecparams.size() == 2) + { + //simple + SceneBlendType stype; + if (vecparams[0] == "add") + stype = SBT_ADD; + else if (vecparams[0] == "modulate") + stype = SBT_MODULATE; + else if (vecparams[0] == "colour_blend") + stype = SBT_TRANSPARENT_COLOUR; + else if (vecparams[0] == "alpha_blend") + stype = SBT_TRANSPARENT_ALPHA; + else + { + logParseError( + "Bad separate_scene_blend attribute, unrecognised parameter '" + vecparams[0] + "'", + context); + return false; + } + + SceneBlendType stypea; + if (vecparams[0] == "add") + stypea = SBT_ADD; + else if (vecparams[0] == "modulate") + stypea = SBT_MODULATE; + else if (vecparams[0] == "colour_blend") + stypea = SBT_TRANSPARENT_COLOUR; + else if (vecparams[0] == "alpha_blend") + stypea = SBT_TRANSPARENT_ALPHA; + else + { + logParseError( + "Bad separate_scene_blend attribute, unrecognised parameter '" + vecparams[1] + "'", + context); + return false; + } + + context.pass->setSeparateSceneBlending(stype, stypea); + } + else if (vecparams.size() == 4) + { + //src/dest + SceneBlendFactor src, dest; + SceneBlendFactor srca, desta; + + try { + src = convertBlendFactor(vecparams[0]); + dest = convertBlendFactor(vecparams[1]); + srca = convertBlendFactor(vecparams[2]); + desta = convertBlendFactor(vecparams[3]); + context.pass->setSeparateSceneBlending(src,dest,srca,desta); + } + catch (Exception& e) + { + logParseError("Bad separate_scene_blend attribute, " + e.getDescription(), context); + } + + } + else + { + logParseError( + "Bad separate_scene_blend attribute, wrong number of parameters (expected 2 or 4)", + context); + } + + return false; + } + //----------------------------------------------------------------------- + CompareFunction convertCompareFunction(const String& param) + { + if (param == "always_fail") + return CMPF_ALWAYS_FAIL; + else if (param == "always_pass") + return CMPF_ALWAYS_PASS; + else if (param == "less") + return CMPF_LESS; + else if (param == "less_equal") + return CMPF_LESS_EQUAL; + else if (param == "equal") + return CMPF_EQUAL; + else if (param == "not_equal") + return CMPF_NOT_EQUAL; + else if (param == "greater_equal") + return CMPF_GREATER_EQUAL; + else if (param == "greater") + return CMPF_GREATER; + else + OGRE_EXCEPT(Exception::ERR_INVALIDPARAMS, "Invalid compare function", "convertCompareFunction"); + + } + //----------------------------------------------------------------------- + bool parseDepthCheck(String& params, MaterialScriptContext& context) + { + StringUtil::toLowerCase(params); + if (params == "on") + context.pass->setDepthCheckEnabled(true); + else if (params == "off") + context.pass->setDepthCheckEnabled(false); + else + logParseError( + "Bad depth_check attribute, valid parameters are 'on' or 'off'.", + context); + + return false; + } + //----------------------------------------------------------------------- + bool parseDepthWrite(String& params, MaterialScriptContext& context) + { + StringUtil::toLowerCase(params); + if (params == "on") + context.pass->setDepthWriteEnabled(true); + else if (params == "off") + context.pass->setDepthWriteEnabled(false); + else + logParseError( + "Bad depth_write attribute, valid parameters are 'on' or 'off'.", + context); + return false; + } + //----------------------------------------------------------------------- + bool parseLightScissor(String& params, MaterialScriptContext& context) + { + StringUtil::toLowerCase(params); + if (params == "on") + context.pass->setLightScissoringEnabled(true); + else if (params == "off") + context.pass->setLightScissoringEnabled(false); + else + logParseError( + "Bad light_scissor attribute, valid parameters are 'on' or 'off'.", + context); + return false; + } + //----------------------------------------------------------------------- + bool parseLightClip(String& params, MaterialScriptContext& context) + { + StringUtil::toLowerCase(params); + if (params == "on") + context.pass->setLightClipPlanesEnabled(true); + else if (params == "off") + context.pass->setLightClipPlanesEnabled(false); + else + logParseError( + "Bad light_clip_planes attribute, valid parameters are 'on' or 'off'.", + context); + return false; + } + //----------------------------------------------------------------------- + bool parseDepthFunc(String& params, MaterialScriptContext& context) + { + StringUtil::toLowerCase(params); + try { + CompareFunction func = convertCompareFunction(params); + context.pass->setDepthFunction(func); + } + catch (...) + { + logParseError("Bad depth_func attribute, invalid function parameter.", context); + } + + return false; + } + //----------------------------------------------------------------------- + bool parseNormaliseNormals(String& params, MaterialScriptContext& context) + { + StringUtil::toLowerCase(params); + if (params == "on") + context.pass->setNormaliseNormals(true); + else if (params == "off") + context.pass->setNormaliseNormals(false); + else + logParseError( + "Bad normalise_normals attribute, valid parameters are 'on' or 'off'.", + context); + return false; + } + //----------------------------------------------------------------------- + bool parseColourWrite(String& params, MaterialScriptContext& context) + { + StringUtil::toLowerCase(params); + if (params == "on") + context.pass->setColourWriteEnabled(true); + else if (params == "off") + context.pass->setColourWriteEnabled(false); + else + logParseError( + "Bad colour_write attribute, valid parameters are 'on' or 'off'.", + context); + return false; + } + + //----------------------------------------------------------------------- + bool parseCullHardware(String& params, MaterialScriptContext& context) + { + StringUtil::toLowerCase(params); + if (params=="none") + context.pass->setCullingMode(CULL_NONE); + else if (params=="anticlockwise") + context.pass->setCullingMode(CULL_ANTICLOCKWISE); + else if (params=="clockwise") + context.pass->setCullingMode(CULL_CLOCKWISE); + else + logParseError( + "Bad cull_hardware attribute, valid parameters are " + "'none', 'clockwise' or 'anticlockwise'.", context); + return false; + } + //----------------------------------------------------------------------- + bool parseCullSoftware(String& params, MaterialScriptContext& context) + { + StringUtil::toLowerCase(params); + if (params=="none") + context.pass->setManualCullingMode(MANUAL_CULL_NONE); + else if (params=="back") + context.pass->setManualCullingMode(MANUAL_CULL_BACK); + else if (params=="front") + context.pass->setManualCullingMode(MANUAL_CULL_FRONT); + else + logParseError( + "Bad cull_software attribute, valid parameters are 'none', " + "'front' or 'back'.", context); + return false; + } + //----------------------------------------------------------------------- + bool parseLighting(String& params, MaterialScriptContext& context) + { + StringUtil::toLowerCase(params); + if (params=="on") + context.pass->setLightingEnabled(true); + else if (params=="off") + context.pass->setLightingEnabled(false); + else + logParseError( + "Bad lighting attribute, valid parameters are 'on' or 'off'.", context); + return false; + } + //----------------------------------------------------------------------- + bool parseMaxLights(String& params, MaterialScriptContext& context) + { + context.pass->setMaxSimultaneousLights((ushort)StringConverter::parseInt(params)); + return false; + } + //----------------------------------------------------------------------- + bool parseStartLight(String& params, MaterialScriptContext& context) + { + context.pass->setStartLight((ushort)StringConverter::parseInt(params)); + return false; + } + //----------------------------------------------------------------------- + void parseIterationLightTypes(String& params, MaterialScriptContext& context) + { + // Parse light type + if (params == "directional") + { + context.pass->setIteratePerLight(true, true, Light::LT_DIRECTIONAL); + } + else if (params == "point") + { + context.pass->setIteratePerLight(true, true, Light::LT_POINT); + } + else if (params == "spot") + { + context.pass->setIteratePerLight(true, true, Light::LT_SPOTLIGHT); + } + else + { + logParseError("Bad iteration attribute, valid values for light type parameter " + "are 'point' or 'directional' or 'spot'.", context); + } + + } + //----------------------------------------------------------------------- + bool parseIteration(String& params, MaterialScriptContext& context) + { + // we could have more than one parameter + /** combinations could be: + iteration once + iteration once_per_light [light type] + iteration <number> + iteration <number> [per_light] [light type] + iteration <number> [per_n_lights] <num_lights> [light type] + */ + StringUtil::toLowerCase(params); + StringVector vecparams = StringUtil::split(params, " \t"); + if (vecparams.size() < 1 || vecparams.size() > 4) + { + logParseError("Bad iteration attribute, expected 1 to 3 parameters.", context); + return false; + } + + if (vecparams[0]=="once") + context.pass->setIteratePerLight(false, false); + else if (vecparams[0]=="once_per_light") + { + if (vecparams.size() == 2) + { + parseIterationLightTypes(vecparams[1], context); + } + else + { + context.pass->setIteratePerLight(true, false); + } + + } + else // could be using form: <number> [per_light] [light type] + { + int passIterationCount = StringConverter::parseInt(vecparams[0]); + if (passIterationCount > 0) + { + context.pass->setPassIterationCount(passIterationCount); + if (vecparams.size() > 1) + { + if (vecparams[1] == "per_light") + { + if (vecparams.size() == 3) + { + parseIterationLightTypes(vecparams[2], context); + } + else + { + context.pass->setIteratePerLight(true, false); + } + } + else if (vecparams[1] == "per_n_lights") + { + if (vecparams.size() < 3) + { + logParseError( + "Bad iteration attribute, expected number of lights.", + context); + } + else + { + // Parse num lights + context.pass->setLightCountPerIteration( + (ushort)StringConverter::parseInt(vecparams[2])); + // Light type + if (vecparams.size() == 4) + { + parseIterationLightTypes(vecparams[3], context); + } + else + { + context.pass->setIteratePerLight(true, false); + } + } + } + else + logParseError( + "Bad iteration attribute, valid parameters are <number> [per_light|per_n_lights <num_lights>] [light type].", context); + } + } + else + logParseError( + "Bad iteration attribute, valid parameters are 'once' or 'once_per_light' or <number> [per_light|per_n_lights <num_lights>] [light type].", context); + } + return false; + } + //----------------------------------------------------------------------- + bool parsePointSize(String& params, MaterialScriptContext& context) + { + context.pass->setPointSize(StringConverter::parseReal(params)); + return false; + } + //----------------------------------------------------------------------- + bool parsePointSprites(String& params, MaterialScriptContext& context) + { + if (params=="on") + context.pass->setPointSpritesEnabled(true); + else if (params=="off") + context.pass->setPointSpritesEnabled(false); + else + logParseError( + "Bad point_sprites attribute, valid parameters are 'on' or 'off'.", context); + + return false; + } + //----------------------------------------------------------------------- + bool parsePointAttenuation(String& params, MaterialScriptContext& context) + { + StringVector vecparams = StringUtil::split(params, " \t"); + if (vecparams.size() != 1 && vecparams.size() != 4) + { + logParseError("Bad point_size_attenuation attribute, 1 or 4 parameters expected", context); + return false; + } + if (vecparams[0] == "off") + { + context.pass->setPointAttenuation(false); + } + else if (vecparams[0] == "on") + { + if (vecparams.size() == 4) + { + context.pass->setPointAttenuation(true, + StringConverter::parseReal(vecparams[1]), + StringConverter::parseReal(vecparams[2]), + StringConverter::parseReal(vecparams[3])); + } + else + { + context.pass->setPointAttenuation(true); + } + } + + return false; + } + //----------------------------------------------------------------------- + bool parsePointSizeMin(String& params, MaterialScriptContext& context) + { + context.pass->setPointMinSize( + StringConverter::parseReal(params)); + return false; + } + //----------------------------------------------------------------------- + bool parsePointSizeMax(String& params, MaterialScriptContext& context) + { + context.pass->setPointMaxSize( + StringConverter::parseReal(params)); + return false; + } + //----------------------------------------------------------------------- + bool parseFogging(String& params, MaterialScriptContext& context) + { + StringUtil::toLowerCase(params); + StringVector vecparams = StringUtil::split(params, " \t"); + if (vecparams[0]=="true") + { + // if true, we need to see if they supplied all arguments, or just the 1... if just the one, + // Assume they want to disable the default fog from effecting this material. + if( vecparams.size() == 8 ) + { + FogMode mFogtype; + if( vecparams[1] == "none" ) + mFogtype = FOG_NONE; + else if( vecparams[1] == "linear" ) + mFogtype = FOG_LINEAR; + else if( vecparams[1] == "exp" ) + mFogtype = FOG_EXP; + else if( vecparams[1] == "exp2" ) + mFogtype = FOG_EXP2; + else + { + logParseError( + "Bad fogging attribute, valid parameters are " + "'none', 'linear', 'exp', or 'exp2'.", context); + return false; + } + + context.pass->setFog( + true, + mFogtype, + ColourValue( + StringConverter::parseReal(vecparams[2]), + StringConverter::parseReal(vecparams[3]), + StringConverter::parseReal(vecparams[4])), + StringConverter::parseReal(vecparams[5]), + StringConverter::parseReal(vecparams[6]), + StringConverter::parseReal(vecparams[7]) + ); + } + else + { + context.pass->setFog(true); + } + } + else if (vecparams[0]=="false") + context.pass->setFog(false); + else + logParseError( + "Bad fog_override attribute, valid parameters are 'true' or 'false'.", + context); + + return false; + } + //----------------------------------------------------------------------- + bool parseShading(String& params, MaterialScriptContext& context) + { + StringUtil::toLowerCase(params); + if (params=="flat") + context.pass->setShadingMode(SO_FLAT); + else if (params=="gouraud") + context.pass->setShadingMode(SO_GOURAUD); + else if (params=="phong") + context.pass->setShadingMode(SO_PHONG); + else + logParseError("Bad shading attribute, valid parameters are 'flat', " + "'gouraud' or 'phong'.", context); + + return false; + } + //----------------------------------------------------------------------- + bool parsePolygonMode(String& params, MaterialScriptContext& context) + { + StringUtil::toLowerCase(params); + if (params=="solid") + context.pass->setPolygonMode(PM_SOLID); + else if (params=="wireframe") + context.pass->setPolygonMode(PM_WIREFRAME); + else if (params=="points") + context.pass->setPolygonMode(PM_POINTS); + else + logParseError("Bad polygon_mode attribute, valid parameters are 'solid', " + "'wireframe' or 'points'.", context); + + return false; + } + //----------------------------------------------------------------------- + bool parsePolygonModeOverrideable(String& params, MaterialScriptContext& context) + { + StringUtil::toLowerCase(params); + + context.pass->setPolygonModeOverrideable( + StringConverter::parseBool(params)); + return false; + } + //----------------------------------------------------------------------- + bool parseFiltering(String& params, MaterialScriptContext& context) + { + StringUtil::toLowerCase(params); + StringVector vecparams = StringUtil::split(params, " \t"); + // Must be 1 or 3 parameters + if (vecparams.size() == 1) + { + // Simple format + if (vecparams[0]=="none") + context.textureUnit->setTextureFiltering(TFO_NONE); + else if (vecparams[0]=="bilinear") + context.textureUnit->setTextureFiltering(TFO_BILINEAR); + else if (vecparams[0]=="trilinear") + context.textureUnit->setTextureFiltering(TFO_TRILINEAR); + else if (vecparams[0]=="anisotropic") + context.textureUnit->setTextureFiltering(TFO_ANISOTROPIC); + else + { + logParseError("Bad filtering attribute, valid parameters for simple format are " + "'none', 'bilinear', 'trilinear' or 'anisotropic'.", context); + return false; + } + } + else if (vecparams.size() == 3) + { + // Complex format + context.textureUnit->setTextureFiltering( + convertFiltering(vecparams[0]), + convertFiltering(vecparams[1]), + convertFiltering(vecparams[2])); + + + } + else + { + logParseError( + "Bad filtering attribute, wrong number of parameters (expected 1, 3 or 4)", + context); + } + + return false; + } + //----------------------------------------------------------------------- + bool parseCompareTest(String& params, MaterialScriptContext& context) + { + StringUtil::toLowerCase(params); + try + { + if(params == "on") + { + context.textureUnit->setTextureCompareEnabled(true); + } + else if(params == "off") + { + context.textureUnit->setTextureCompareEnabled(false); + } + else + { + OGRE_EXCEPT(Exception::ERR_INVALIDPARAMS, "Invalid compare setting", "parseCompareEnabled"); + } + } + catch (...) + { + logParseError("Bad compare_test attribute, invalid function parameter.", context); + } + + return false; + } + //----------------------------------------------------------------------- + bool parseCompareFunction(String& params, MaterialScriptContext& context) + { + StringUtil::toLowerCase(params); + try { + CompareFunction func = convertCompareFunction(params); + context.textureUnit->setTextureCompareFunction(func); + } + catch (...) + { + logParseError("Bad compare_func attribute, invalid function parameter.", context); + } + + return false; + } + bool parseAlphaRejection(String& params, MaterialScriptContext& context) + { + StringUtil::toLowerCase(params); + StringVector vecparams = StringUtil::split(params, " \t"); + if (vecparams.size() != 2) + { + logParseError( + "Bad alpha_rejection attribute, wrong number of parameters (expected 2)", + context); + return false; + } + + CompareFunction cmp; + try { + cmp = convertCompareFunction(vecparams[0]); + } + catch (...) + { + logParseError("Bad alpha_rejection attribute, invalid compare function.", context); + return false; + } + + context.pass->setAlphaRejectSettings(cmp, (unsigned char)StringConverter::parseInt(vecparams[1])); + + return false; + } + //--------------------------------------------------------------------- + bool parseAlphaToCoverage(String& params, MaterialScriptContext& context) + { + StringUtil::toLowerCase(params); + if (params == "on") + context.pass->setAlphaToCoverageEnabled(true); + else if (params == "off") + context.pass->setAlphaToCoverageEnabled(false); + else + logParseError( + "Bad alpha_to_coverage attribute, valid parameters are 'on' or 'off'.", + context); + + return false; + } + //----------------------------------------------------------------------- + bool parseTransparentSorting(String& params, MaterialScriptContext& context) + { + StringUtil::toLowerCase(params); + if (params == "on") + context.pass->setTransparentSortingEnabled(true); + else if (params == "off") + context.pass->setTransparentSortingEnabled(false); + else if (params == "force") + context.pass->setTransparentSortingForced(true); + else + logParseError( + "Bad transparent_sorting attribute, valid parameters are 'on', 'off' or 'force'.", + context); + + return false; + } + bool parseDepthBias(String& params, MaterialScriptContext& context) + { + StringVector vecparams = StringUtil::split(params, " \t"); + + float constantBias = static_cast<float>(StringConverter::parseReal(vecparams[0])); + float slopeScaleBias = 0.0f; + if (vecparams.size() > 1) + { + slopeScaleBias = static_cast<float>(StringConverter::parseReal(vecparams[1])); + } + context.pass->setDepthBias(constantBias, slopeScaleBias); + + return false; + } + //----------------------------------------------------------------------- + bool parseIterationDepthBias(String& params, MaterialScriptContext& context) + { + StringVector vecparams = StringUtil::split(params, " \t"); + + float bias = static_cast<float>(StringConverter::parseReal(vecparams[0])); + context.pass->setIterationDepthBias(bias); + + return false; + } + bool parseIlluminationStage(String& params, MaterialScriptContext& context) + { + if (params == "ambient") + { + context.pass->setIlluminationStage(IS_AMBIENT); + } + else if (params == "per_light") + { + context.pass->setIlluminationStage(IS_PER_LIGHT); + } + else if (params == "decal") + { + context.pass->setIlluminationStage(IS_DECAL); + } + else + { + logParseError("Invalid illumination_stage specified.", context); + } + return false; + } + // Texture layer attributes + bool parseTexture(String& params, MaterialScriptContext& context) + { + StringVector vecparams = StringUtil::tokenise(params, " \t"); + const size_t numParams = vecparams.size(); + if (numParams > 5) + { + logParseError("Invalid texture attribute - expected only up to 5 parameters.", + context); + } + TextureType tt = TEX_TYPE_2D; + int mipmaps = MIP_DEFAULT; // When passed to TextureManager::load, this means default to default number of mipmaps + bool isAlpha = false; + bool hwGamma = false; + PixelFormat desiredFormat = PF_UNKNOWN; + for (size_t p = 1; p < numParams; ++p) + { + StringUtil::toLowerCase(vecparams[p]); + if (vecparams[p] == "1d") + { + tt = TEX_TYPE_1D; + } + else if (vecparams[p] == "2d") + { + tt = TEX_TYPE_2D; + } + else if (vecparams[p] == "3d") + { + tt = TEX_TYPE_3D; + } + else if (vecparams[p] == "cubic") + { + tt = TEX_TYPE_CUBE_MAP; + } + else if (vecparams[p] == "unlimited") + { + mipmaps = MIP_UNLIMITED; + } + else if (StringConverter::isNumber(vecparams[p])) + { + mipmaps = StringConverter::parseInt(vecparams[p]); + } + else if (vecparams[p] == "alpha") + { + isAlpha = true; + } + else if (vecparams[p] == "gamma") + { + hwGamma = true; + } + else if ((desiredFormat = PixelUtil::getFormatFromName(vecparams[p], true)) != PF_UNKNOWN) + { + // nothing to do here + } + else + { + logParseError("Invalid texture option - "+vecparams[p]+".", + context); + } + } + + context.textureUnit->setTextureName(vecparams[0], tt); + context.textureUnit->setNumMipmaps(mipmaps); + context.textureUnit->setIsAlpha(isAlpha); + context.textureUnit->setDesiredFormat(desiredFormat); + context.textureUnit->setHardwareGammaEnabled(hwGamma); + return false; + } + bool parseAnimTexture(String& params, MaterialScriptContext& context) + { + StringVector vecparams = StringUtil::tokenise(params, " \t"); + size_t numParams = vecparams.size(); + // Determine which form it is + // Must have at least 3 params though + if (numParams < 3) + { + logParseError("Bad anim_texture attribute, wrong number of parameters " + "(expected at least 3)", context); + return false; + } + if (numParams == 3 && StringConverter::parseInt(vecparams[1]) != 0 ) + { + // First form using base name & number of frames + context.textureUnit->setAnimatedTextureName( + vecparams[0], + StringConverter::parseInt(vecparams[1]), + StringConverter::parseReal(vecparams[2])); + } + else + { + // Second form using individual names + context.textureUnit->setAnimatedTextureName( + (String*)&vecparams[0], + static_cast<unsigned int>(numParams-1), + StringConverter::parseReal(vecparams[numParams-1])); + } + return false; + + } + //----------------------------------------------------------------------- + bool parseCubicTexture(String& params, MaterialScriptContext& context) + { + + StringVector vecparams = StringUtil::tokenise(params, " \t"); + size_t numParams = vecparams.size(); + + // Get final param + bool useUVW; + String& uvOpt = vecparams[numParams-1]; + StringUtil::toLowerCase(uvOpt); + if (uvOpt == "combineduvw") + useUVW = true; + else if (uvOpt == "separateuv") + useUVW = false; + else + { + logParseError("Bad cubic_texture attribute, final parameter must be " + "'combinedUVW' or 'separateUV'.", context); + return false; + } + // Determine which form it is + if (numParams == 2) + { + // First form using base name + context.textureUnit->setCubicTextureName(vecparams[0], useUVW); + } + else if (numParams == 7) + { + // Second form using individual names + // Can use vecparams[0] as array start point + context.textureUnit->setCubicTextureName((String*)&vecparams[0], useUVW); + } + else + { + logParseError( + "Bad cubic_texture attribute, wrong number of parameters (expected 2 or 7)", + context); + return false; + } + + return false; + } + //----------------------------------------------------------------------- + bool parseTexCoord(String& params, MaterialScriptContext& context) + { + context.textureUnit->setTextureCoordSet( + StringConverter::parseInt(params)); + + return false; + } + //----------------------------------------------------------------------- + TextureUnitState::TextureAddressingMode convTexAddressMode(const String& params, MaterialScriptContext& context) + { + if (params=="wrap") + return TextureUnitState::TAM_WRAP; + else if (params=="mirror") + return TextureUnitState::TAM_MIRROR; + else if (params=="clamp") + return TextureUnitState::TAM_CLAMP; + else if (params=="border") + return TextureUnitState::TAM_BORDER; + else + logParseError("Bad tex_address_mode attribute, valid parameters are " + "'wrap', 'mirror', 'clamp' or 'border'.", context); + // default + return TextureUnitState::TAM_WRAP; + } + //----------------------------------------------------------------------- + bool parseTexAddressMode(String& params, MaterialScriptContext& context) + { + StringUtil::toLowerCase(params); + + StringVector vecparams = StringUtil::split(params, " \t"); + size_t numParams = vecparams.size(); + + if (numParams > 3 || numParams < 1) + { + logParseError("Invalid number of parameters to tex_address_mode" + " - must be between 1 and 3", context); + } + if (numParams == 1) + { + // Single-parameter option + context.textureUnit->setTextureAddressingMode( + convTexAddressMode(vecparams[0], context)); + } + else + { + // 2-3 parameter option + TextureUnitState::UVWAddressingMode uvw; + uvw.u = convTexAddressMode(vecparams[0], context); + uvw.v = convTexAddressMode(vecparams[1], context); + if (numParams == 3) + { + // w + uvw.w = convTexAddressMode(vecparams[2], context); + } + else + { + uvw.w = TextureUnitState::TAM_WRAP; + } + context.textureUnit->setTextureAddressingMode(uvw); + } + return false; + } + //----------------------------------------------------------------------- + bool parseTexBorderColour(String& params, MaterialScriptContext& context) + { + StringVector vecparams = StringUtil::split(params, " \t"); + // Must be 3 or 4 parameters + if (vecparams.size() == 3 || vecparams.size() == 4) + { + context.textureUnit->setTextureBorderColour( _parseColourValue(vecparams) ); + } + else + { + logParseError( + "Bad tex_border_colour attribute, wrong number of parameters (expected 3 or 4)", + context); + } + return false; + } + bool parseColourOp(String& params, MaterialScriptContext& context) + { + StringUtil::toLowerCase(params); + if (params=="replace") + context.textureUnit->setColourOperation(LBO_REPLACE); + else if (params=="add") + context.textureUnit->setColourOperation(LBO_ADD); + else if (params=="modulate") + context.textureUnit->setColourOperation(LBO_MODULATE); + else if (params=="alpha_blend") + context.textureUnit->setColourOperation(LBO_ALPHA_BLEND); + else + logParseError("Bad colour_op attribute, valid parameters are " + "'replace', 'add', 'modulate' or 'alpha_blend'.", context); + + return false; + } + LayerBlendOperationEx convertBlendOpEx(const String& param) + { + if (param == "source1") + return LBX_SOURCE1; + else if (param == "source2") + return LBX_SOURCE2; + else if (param == "modulate") + return LBX_MODULATE; + else if (param == "modulate_x2") + return LBX_MODULATE_X2; + else if (param == "modulate_x4") + return LBX_MODULATE_X4; + else if (param == "add") + return LBX_ADD; + else if (param == "add_signed") + return LBX_ADD_SIGNED; + else if (param == "add_smooth") + return LBX_ADD_SMOOTH; + else if (param == "subtract") + return LBX_SUBTRACT; + else if (param == "blend_diffuse_colour") + return LBX_BLEND_DIFFUSE_COLOUR; + else if (param == "blend_diffuse_alpha") + return LBX_BLEND_DIFFUSE_ALPHA; + else if (param == "blend_texture_alpha") + return LBX_BLEND_TEXTURE_ALPHA; + else if (param == "blend_current_alpha") + return LBX_BLEND_CURRENT_ALPHA; + else if (param == "blend_manual") + return LBX_BLEND_MANUAL; + else if (param == "dotproduct") + return LBX_DOTPRODUCT; + else + OGRE_EXCEPT(Exception::ERR_INVALIDPARAMS, "Invalid blend function", "convertBlendOpEx"); + } + //----------------------------------------------------------------------- + LayerBlendSource convertBlendSource(const String& param) + { + if (param == "src_current") + return LBS_CURRENT; + else if (param == "src_texture") + return LBS_TEXTURE; + else if (param == "src_diffuse") + return LBS_DIFFUSE; + else if (param == "src_specular") + return LBS_SPECULAR; + else if (param == "src_manual") + return LBS_MANUAL; + else + OGRE_EXCEPT(Exception::ERR_INVALIDPARAMS, "Invalid blend source", "convertBlendSource"); + } + //----------------------------------------------------------------------- + bool parseColourOpEx(String& params, MaterialScriptContext& context) + { + StringUtil::toLowerCase(params); + StringVector vecparams = StringUtil::split(params, " \t"); + size_t numParams = vecparams.size(); + + if (numParams < 3 || numParams > 10) + { + logParseError( + "Bad colour_op_ex attribute, wrong number of parameters (expected 3 to 10)", + context); + return false; + } + LayerBlendOperationEx op; + LayerBlendSource src1, src2; + Real manual = 0.0; + ColourValue colSrc1 = ColourValue::White; + ColourValue colSrc2 = ColourValue::White; + + try { + op = convertBlendOpEx(vecparams[0]); + src1 = convertBlendSource(vecparams[1]); + src2 = convertBlendSource(vecparams[2]); + + if (op == LBX_BLEND_MANUAL) + { + if (numParams < 4) + { + logParseError("Bad colour_op_ex attribute, wrong number of parameters " + "(expected 4 for manual blend)", context); + return false; + } + manual = StringConverter::parseReal(vecparams[3]); + } + + if (src1 == LBS_MANUAL) + { + unsigned int parIndex = 3; + if (op == LBX_BLEND_MANUAL) + parIndex++; + + if (numParams < parIndex + 3) + { + logParseError("Bad colour_op_ex attribute, wrong number of parameters " + "(expected " + StringConverter::toString(parIndex + 3) + ")", context); + return false; + } + + colSrc1.r = StringConverter::parseReal(vecparams[parIndex++]); + colSrc1.g = StringConverter::parseReal(vecparams[parIndex++]); + colSrc1.b = StringConverter::parseReal(vecparams[parIndex++]); + if (numParams > parIndex) + { + colSrc1.a = StringConverter::parseReal(vecparams[parIndex]); + } + else + { + colSrc1.a = 1.0f; + } + } + + if (src2 == LBS_MANUAL) + { + unsigned int parIndex = 3; + if (op == LBX_BLEND_MANUAL) + parIndex++; + if (src1 == LBS_MANUAL) + parIndex += 3; + + if (numParams < parIndex + 3) + { + logParseError("Bad colour_op_ex attribute, wrong number of parameters " + "(expected " + StringConverter::toString(parIndex + 3) + ")", context); + return false; + } + + colSrc2.r = StringConverter::parseReal(vecparams[parIndex++]); + colSrc2.g = StringConverter::parseReal(vecparams[parIndex++]); + colSrc2.b = StringConverter::parseReal(vecparams[parIndex++]); + if (numParams > parIndex) + { + colSrc2.a = StringConverter::parseReal(vecparams[parIndex]); + } + else + { + colSrc2.a = 1.0f; + } + } + } + catch (Exception& e) + { + logParseError("Bad colour_op_ex attribute, " + e.getDescription(), context); + return false; + } + + context.textureUnit->setColourOperationEx(op, src1, src2, colSrc1, colSrc2, manual); + return false; + } + //----------------------------------------------------------------------- + bool parseColourOpFallback(String& params, MaterialScriptContext& context) + { + StringUtil::toLowerCase(params); + StringVector vecparams = StringUtil::split(params, " \t"); + if (vecparams.size() != 2) + { + logParseError("Bad colour_op_multipass_fallback attribute, wrong number " + "of parameters (expected 2)", context); + return false; + } + + //src/dest + SceneBlendFactor src, dest; + + try { + src = convertBlendFactor(vecparams[0]); + dest = convertBlendFactor(vecparams[1]); + context.textureUnit->setColourOpMultipassFallback(src,dest); + } + catch (Exception& e) + { + logParseError("Bad colour_op_multipass_fallback attribute, " + + e.getDescription(), context); + } + return false; + } + //----------------------------------------------------------------------- + bool parseAlphaOpEx(String& params, MaterialScriptContext& context) + { + StringUtil::toLowerCase(params); + StringVector vecparams = StringUtil::split(params, " \t"); + size_t numParams = vecparams.size(); + if (numParams < 3 || numParams > 6) + { + logParseError("Bad alpha_op_ex attribute, wrong number of parameters " + "(expected 3 to 6)", context); + return false; + } + LayerBlendOperationEx op; + LayerBlendSource src1, src2; + Real manual = 0.0; + Real arg1 = 1.0, arg2 = 1.0; + + try { + op = convertBlendOpEx(vecparams[0]); + src1 = convertBlendSource(vecparams[1]); + src2 = convertBlendSource(vecparams[2]); + if (op == LBX_BLEND_MANUAL) + { + if (numParams != 4) + { + logParseError("Bad alpha_op_ex attribute, wrong number of parameters " + "(expected 4 for manual blend)", context); + return false; + } + manual = StringConverter::parseReal(vecparams[3]); + } + if (src1 == LBS_MANUAL) + { + unsigned int parIndex = 3; + if (op == LBX_BLEND_MANUAL) + parIndex++; + + if (numParams < parIndex) + { + logParseError( + "Bad alpha_op_ex attribute, wrong number of parameters (expected " + + StringConverter::toString(parIndex - 1) + ")", context); + return false; + } + + arg1 = StringConverter::parseReal(vecparams[parIndex]); + } + + if (src2 == LBS_MANUAL) + { + unsigned int parIndex = 3; + if (op == LBX_BLEND_MANUAL) + parIndex++; + if (src1 == LBS_MANUAL) + parIndex++; + + if (numParams < parIndex) + { + logParseError( + "Bad alpha_op_ex attribute, wrong number of parameters " + "(expected " + StringConverter::toString(parIndex - 1) + ")", context); + return false; + } + + arg2 = StringConverter::parseReal(vecparams[parIndex]); + } + } + catch (Exception& e) + { + logParseError("Bad alpha_op_ex attribute, " + e.getDescription(), context); + return false; + } + + context.textureUnit->setAlphaOperation(op, src1, src2, arg1, arg2, manual); + return false; + } + //----------------------------------------------------------------------- + bool parseEnvMap(String& params, MaterialScriptContext& context) + { + StringUtil::toLowerCase(params); + if (params=="off") + context.textureUnit->setEnvironmentMap(false); + else if (params=="spherical") + context.textureUnit->setEnvironmentMap(true, TextureUnitState::ENV_CURVED); + else if (params=="planar") + context.textureUnit->setEnvironmentMap(true, TextureUnitState::ENV_PLANAR); + else if (params=="cubic_reflection") + context.textureUnit->setEnvironmentMap(true, TextureUnitState::ENV_REFLECTION); + else if (params=="cubic_normal") + context.textureUnit->setEnvironmentMap(true, TextureUnitState::ENV_NORMAL); + else + logParseError("Bad env_map attribute, valid parameters are 'off', " + "'spherical', 'planar', 'cubic_reflection' and 'cubic_normal'.", context); + + return false; + } + //----------------------------------------------------------------------- + bool parseScroll(String& params, MaterialScriptContext& context) + { + StringVector vecparams = StringUtil::split(params, " \t"); + if (vecparams.size() != 2) + { + logParseError("Bad scroll attribute, wrong number of parameters (expected 2)", context); + return false; + } + context.textureUnit->setTextureScroll( + StringConverter::parseReal(vecparams[0]), + StringConverter::parseReal(vecparams[1])); + + + return false; + } + //----------------------------------------------------------------------- + bool parseScrollAnim(String& params, MaterialScriptContext& context) + { + StringVector vecparams = StringUtil::split(params, " \t"); + if (vecparams.size() != 2) + { + logParseError("Bad scroll_anim attribute, wrong number of " + "parameters (expected 2)", context); + return false; + } + context.textureUnit->setScrollAnimation( + StringConverter::parseReal(vecparams[0]), + StringConverter::parseReal(vecparams[1])); + + return false; + } + //----------------------------------------------------------------------- + bool parseRotate(String& params, MaterialScriptContext& context) + { + context.textureUnit->setTextureRotate( + StringConverter::parseAngle(params)); + + return false; + } + //----------------------------------------------------------------------- + bool parseRotateAnim(String& params, MaterialScriptContext& context) + { + context.textureUnit->setRotateAnimation( + StringConverter::parseReal(params)); + + return false; + } + //----------------------------------------------------------------------- + bool parseScale(String& params, MaterialScriptContext& context) + { + StringVector vecparams = StringUtil::split(params, " \t"); + if (vecparams.size() != 2) + { + logParseError("Bad scale attribute, wrong number of parameters (expected 2)", context); + return false; + } + context.textureUnit->setTextureScale( + StringConverter::parseReal(vecparams[0]), + StringConverter::parseReal(vecparams[1])); + + return false; + } + //----------------------------------------------------------------------- + bool parseWaveXform(String& params, MaterialScriptContext& context) + { + StringUtil::toLowerCase(params); + StringVector vecparams = StringUtil::split(params, " \t"); + + if (vecparams.size() != 6) + { + logParseError("Bad wave_xform attribute, wrong number of parameters " + "(expected 6)", context); + return false; + } + TextureUnitState::TextureTransformType ttype; + WaveformType waveType; + // Check transform type + if (vecparams[0]=="scroll_x") + ttype = TextureUnitState::TT_TRANSLATE_U; + else if (vecparams[0]=="scroll_y") + ttype = TextureUnitState::TT_TRANSLATE_V; + else if (vecparams[0]=="rotate") + ttype = TextureUnitState::TT_ROTATE; + else if (vecparams[0]=="scale_x") + ttype = TextureUnitState::TT_SCALE_U; + else if (vecparams[0]=="scale_y") + ttype = TextureUnitState::TT_SCALE_V; + else + { + logParseError("Bad wave_xform attribute, parameter 1 must be 'scroll_x', " + "'scroll_y', 'rotate', 'scale_x' or 'scale_y'", context); + return false; + } + // Check wave type + if (vecparams[1]=="sine") + waveType = WFT_SINE; + else if (vecparams[1]=="triangle") + waveType = WFT_TRIANGLE; + else if (vecparams[1]=="square") + waveType = WFT_SQUARE; + else if (vecparams[1]=="sawtooth") + waveType = WFT_SAWTOOTH; + else if (vecparams[1]=="inverse_sawtooth") + waveType = WFT_INVERSE_SAWTOOTH; + else + { + logParseError("Bad wave_xform attribute, parameter 2 must be 'sine', " + "'triangle', 'square', 'sawtooth' or 'inverse_sawtooth'", context); + return false; + } + + context.textureUnit->setTransformAnimation( + ttype, + waveType, + StringConverter::parseReal(vecparams[2]), + StringConverter::parseReal(vecparams[3]), + StringConverter::parseReal(vecparams[4]), + StringConverter::parseReal(vecparams[5]) ); + + return false; + } + //----------------------------------------------------------------------- + bool parseTransform(String& params, MaterialScriptContext& context) + { + StringVector vecparams = StringUtil::split(params, " \t"); + if (vecparams.size() != 16) + { + logParseError("Bad transform attribute, wrong number of parameters (expected 16)", context); + return false; + } + Matrix4 xform( + StringConverter::parseReal(vecparams[0]), + StringConverter::parseReal(vecparams[1]), + StringConverter::parseReal(vecparams[2]), + StringConverter::parseReal(vecparams[3]), + StringConverter::parseReal(vecparams[4]), + StringConverter::parseReal(vecparams[5]), + StringConverter::parseReal(vecparams[6]), + StringConverter::parseReal(vecparams[7]), + StringConverter::parseReal(vecparams[8]), + StringConverter::parseReal(vecparams[9]), + StringConverter::parseReal(vecparams[10]), + StringConverter::parseReal(vecparams[11]), + StringConverter::parseReal(vecparams[12]), + StringConverter::parseReal(vecparams[13]), + StringConverter::parseReal(vecparams[14]), + StringConverter::parseReal(vecparams[15]) ); + context.textureUnit->setTextureTransform(xform); + + + return false; + } + bool parseAnisotropy(String& params, MaterialScriptContext& context) + { + context.textureUnit->setTextureAnisotropy( + StringConverter::parseInt(params)); + + return false; + } + //----------------------------------------------------------------------- + bool parseTextureAlias(String& params, MaterialScriptContext& context) + { + trimAndUnquoteWord(params); + context.textureUnit->setTextureNameAlias(params); + + return false; + } + //----------------------------------------------------------------------- + bool parseMipmapBias(String& params, MaterialScriptContext& context) + { + context.textureUnit->setTextureMipmapBias( + (float)StringConverter::parseReal(params)); + + return false; + } + bool parseContentType(String& params, MaterialScriptContext& context) + { + StringVector vecparams = StringUtil::tokenise(params, " \t"); + if (vecparams.empty()) + { + logParseError("No content_type specified", context); + return false; + } + String& paramType = vecparams[0]; + if (paramType == "named") + { + context.textureUnit->setContentType(TextureUnitState::CONTENT_NAMED); + } + else if (paramType == "shadow") + { + context.textureUnit->setContentType(TextureUnitState::CONTENT_SHADOW); + } + else if (paramType == "compositor") + { + context.textureUnit->setContentType(TextureUnitState::CONTENT_COMPOSITOR); + if (vecparams.size() == 3) + { + context.textureUnit->setCompositorReference(vecparams[1], vecparams[2]); + } + else if (vecparams.size() == 4) + { + context.textureUnit->setCompositorReference(vecparams[1], vecparams[2], + StringConverter::parseUnsignedInt(vecparams[3])); + } + else + { + logParseError("compositor content_type requires 2 or 3 extra params", context); + } + } + else + { + logParseError("Invalid content_type specified : " + paramType, context); + } + return false; + } +} namespace sh { - void OgreMaterialSerializer::reset() - { - mScriptContext.section = Ogre::MSS_NONE; - mScriptContext.material.setNull(); - mScriptContext.technique = 0; - mScriptContext.pass = 0; - mScriptContext.textureUnit = 0; - mScriptContext.program.setNull(); - mScriptContext.lineNo = 0; - mScriptContext.filename.clear(); - mScriptContext.techLev = -1; - mScriptContext.passLev = -1; - mScriptContext.stateLev = -1; - } + OgreMaterialSerializer::OgreMaterialSerializer() + { + // Set up material attribute parsers + mMaterialAttribParsers.insert(AttribParserList::value_type("lod_values", (ATTRIBUTE_PARSER)parseLodValues)); + mMaterialAttribParsers.insert(AttribParserList::value_type("lod_strategy", (ATTRIBUTE_PARSER)parseLodStrategy)); + mMaterialAttribParsers.insert(AttribParserList::value_type("lod_distances", (ATTRIBUTE_PARSER)parseLodDistances)); + mMaterialAttribParsers.insert(AttribParserList::value_type("receive_shadows", (ATTRIBUTE_PARSER)parseReceiveShadows)); + mMaterialAttribParsers.insert(AttribParserList::value_type("transparency_casts_shadows", (ATTRIBUTE_PARSER)parseTransparencyCastsShadows)); + // mMaterialAttribParsers.insert(AttribParserList::value_type("technique", (ATTRIBUTE_PARSER)parseTechnique)); + mMaterialAttribParsers.insert(AttribParserList::value_type("set_texture_alias", (ATTRIBUTE_PARSER)parseSetTextureAlias)); - bool OgreMaterialSerializer::setPassProperty (const std::string& param, std::string value, Ogre::Pass* pass) - { - // workaround https://ogre3d.atlassian.net/browse/OGRE-158 - if (param == "transparent_sorting" && value == "force") - { - pass->setTransparentSortingForced(true); - return true; - } + // Set up pass attribute parsers + mPassAttribParsers.insert(AttribParserList::value_type("ambient", (ATTRIBUTE_PARSER)parseAmbient)); + mPassAttribParsers.insert(AttribParserList::value_type("diffuse", (ATTRIBUTE_PARSER)parseDiffuse)); + mPassAttribParsers.insert(AttribParserList::value_type("specular", (ATTRIBUTE_PARSER)parseSpecular)); + mPassAttribParsers.insert(AttribParserList::value_type("emissive", (ATTRIBUTE_PARSER)parseEmissive)); + mPassAttribParsers.insert(AttribParserList::value_type("scene_blend", (ATTRIBUTE_PARSER)parseSceneBlend)); + mPassAttribParsers.insert(AttribParserList::value_type("separate_scene_blend", (ATTRIBUTE_PARSER)parseSeparateSceneBlend)); + mPassAttribParsers.insert(AttribParserList::value_type("depth_check", (ATTRIBUTE_PARSER)parseDepthCheck)); + mPassAttribParsers.insert(AttribParserList::value_type("depth_write", (ATTRIBUTE_PARSER)parseDepthWrite)); + mPassAttribParsers.insert(AttribParserList::value_type("depth_func", (ATTRIBUTE_PARSER)parseDepthFunc)); + mPassAttribParsers.insert(AttribParserList::value_type("normalise_normals", (ATTRIBUTE_PARSER)parseNormaliseNormals)); + mPassAttribParsers.insert(AttribParserList::value_type("alpha_rejection", (ATTRIBUTE_PARSER)parseAlphaRejection)); + mPassAttribParsers.insert(AttribParserList::value_type("alpha_to_coverage", (ATTRIBUTE_PARSER)parseAlphaToCoverage)); + mPassAttribParsers.insert(AttribParserList::value_type("transparent_sorting", (ATTRIBUTE_PARSER)parseTransparentSorting)); + mPassAttribParsers.insert(AttribParserList::value_type("colour_write", (ATTRIBUTE_PARSER)parseColourWrite)); + mPassAttribParsers.insert(AttribParserList::value_type("light_scissor", (ATTRIBUTE_PARSER)parseLightScissor)); + mPassAttribParsers.insert(AttribParserList::value_type("light_clip_planes", (ATTRIBUTE_PARSER)parseLightClip)); + mPassAttribParsers.insert(AttribParserList::value_type("cull_hardware", (ATTRIBUTE_PARSER)parseCullHardware)); + mPassAttribParsers.insert(AttribParserList::value_type("cull_software", (ATTRIBUTE_PARSER)parseCullSoftware)); + mPassAttribParsers.insert(AttribParserList::value_type("lighting", (ATTRIBUTE_PARSER)parseLighting)); + mPassAttribParsers.insert(AttribParserList::value_type("fog_override", (ATTRIBUTE_PARSER)parseFogging)); + mPassAttribParsers.insert(AttribParserList::value_type("shading", (ATTRIBUTE_PARSER)parseShading)); + mPassAttribParsers.insert(AttribParserList::value_type("polygon_mode", (ATTRIBUTE_PARSER)parsePolygonMode)); + mPassAttribParsers.insert(AttribParserList::value_type("polygon_mode_overrideable", (ATTRIBUTE_PARSER)parsePolygonModeOverrideable)); + mPassAttribParsers.insert(AttribParserList::value_type("depth_bias", (ATTRIBUTE_PARSER)parseDepthBias)); + mPassAttribParsers.insert(AttribParserList::value_type("iteration_depth_bias", (ATTRIBUTE_PARSER)parseIterationDepthBias)); + /*mPassAttribParsers.insert(AttribParserList::value_type("texture_unit", (ATTRIBUTE_PARSER)parseTextureUnit)); + mPassAttribParsers.insert(AttribParserList::value_type("vertex_program_ref", (ATTRIBUTE_PARSER)parseVertexProgramRef)); + mPassAttribParsers.insert(AttribParserList::value_type("geometry_program_ref", (ATTRIBUTE_PARSER)parseGeometryProgramRef)); + mPassAttribParsers.insert(AttribParserList::value_type("shadow_caster_vertex_program_ref", (ATTRIBUTE_PARSER)parseShadowCasterVertexProgramRef)); + mPassAttribParsers.insert(AttribParserList::value_type("shadow_caster_fragment_program_ref", (ATTRIBUTE_PARSER)parseShadowCasterFragmentProgramRef)); + mPassAttribParsers.insert(AttribParserList::value_type("shadow_receiver_vertex_program_ref", (ATTRIBUTE_PARSER)parseShadowReceiverVertexProgramRef)); + mPassAttribParsers.insert(AttribParserList::value_type("shadow_receiver_fragment_program_ref", (ATTRIBUTE_PARSER)parseShadowReceiverFragmentProgramRef)); + mPassAttribParsers.insert(AttribParserList::value_type("fragment_program_ref", (ATTRIBUTE_PARSER)parseFragmentProgramRef));*/ + mPassAttribParsers.insert(AttribParserList::value_type("max_lights", (ATTRIBUTE_PARSER)parseMaxLights)); + mPassAttribParsers.insert(AttribParserList::value_type("start_light", (ATTRIBUTE_PARSER)parseStartLight)); + mPassAttribParsers.insert(AttribParserList::value_type("iteration", (ATTRIBUTE_PARSER)parseIteration)); + mPassAttribParsers.insert(AttribParserList::value_type("point_size", (ATTRIBUTE_PARSER)parsePointSize)); + mPassAttribParsers.insert(AttribParserList::value_type("point_sprites", (ATTRIBUTE_PARSER)parsePointSprites)); + mPassAttribParsers.insert(AttribParserList::value_type("point_size_attenuation", (ATTRIBUTE_PARSER)parsePointAttenuation)); + mPassAttribParsers.insert(AttribParserList::value_type("point_size_min", (ATTRIBUTE_PARSER)parsePointSizeMin)); + mPassAttribParsers.insert(AttribParserList::value_type("point_size_max", (ATTRIBUTE_PARSER)parsePointSizeMax)); + mPassAttribParsers.insert(AttribParserList::value_type("illumination_stage", (ATTRIBUTE_PARSER)parseIlluminationStage)); - reset(); + // Set up texture unit attribute parsers + // mTextureUnitAttribParsers.insert(AttribParserList::value_type("texture_source", (ATTRIBUTE_PARSER)parseTextureSource)); + mTextureUnitAttribParsers.insert(AttribParserList::value_type("texture", (ATTRIBUTE_PARSER)parseTexture)); + mTextureUnitAttribParsers.insert(AttribParserList::value_type("anim_texture", (ATTRIBUTE_PARSER)parseAnimTexture)); + mTextureUnitAttribParsers.insert(AttribParserList::value_type("cubic_texture", (ATTRIBUTE_PARSER)parseCubicTexture)); + // mTextureUnitAttribParsers.insert(AttribParserList::value_type("binding_type", (ATTRIBUTE_PARSER)parseBindingType)); + mTextureUnitAttribParsers.insert(AttribParserList::value_type("tex_coord_set", (ATTRIBUTE_PARSER)parseTexCoord)); + mTextureUnitAttribParsers.insert(AttribParserList::value_type("tex_address_mode", (ATTRIBUTE_PARSER)parseTexAddressMode)); + mTextureUnitAttribParsers.insert(AttribParserList::value_type("tex_border_colour", (ATTRIBUTE_PARSER)parseTexBorderColour)); + mTextureUnitAttribParsers.insert(AttribParserList::value_type("colour_op", (ATTRIBUTE_PARSER)parseColourOp)); + mTextureUnitAttribParsers.insert(AttribParserList::value_type("colour_op_ex", (ATTRIBUTE_PARSER)parseColourOpEx)); + mTextureUnitAttribParsers.insert(AttribParserList::value_type("colour_op_multipass_fallback", (ATTRIBUTE_PARSER)parseColourOpFallback)); + mTextureUnitAttribParsers.insert(AttribParserList::value_type("alpha_op_ex", (ATTRIBUTE_PARSER)parseAlphaOpEx)); + mTextureUnitAttribParsers.insert(AttribParserList::value_type("env_map", (ATTRIBUTE_PARSER)parseEnvMap)); + mTextureUnitAttribParsers.insert(AttribParserList::value_type("scroll", (ATTRIBUTE_PARSER)parseScroll)); + mTextureUnitAttribParsers.insert(AttribParserList::value_type("scroll_anim", (ATTRIBUTE_PARSER)parseScrollAnim)); + mTextureUnitAttribParsers.insert(AttribParserList::value_type("rotate", (ATTRIBUTE_PARSER)parseRotate)); + mTextureUnitAttribParsers.insert(AttribParserList::value_type("rotate_anim", (ATTRIBUTE_PARSER)parseRotateAnim)); + mTextureUnitAttribParsers.insert(AttribParserList::value_type("scale", (ATTRIBUTE_PARSER)parseScale)); + mTextureUnitAttribParsers.insert(AttribParserList::value_type("wave_xform", (ATTRIBUTE_PARSER)parseWaveXform)); + mTextureUnitAttribParsers.insert(AttribParserList::value_type("transform", (ATTRIBUTE_PARSER)parseTransform)); + mTextureUnitAttribParsers.insert(AttribParserList::value_type("filtering", (ATTRIBUTE_PARSER)parseFiltering)); + mTextureUnitAttribParsers.insert(AttribParserList::value_type("compare_test", (ATTRIBUTE_PARSER)parseCompareTest)); + mTextureUnitAttribParsers.insert(AttribParserList::value_type("compare_func", (ATTRIBUTE_PARSER)parseCompareFunction)); + mTextureUnitAttribParsers.insert(AttribParserList::value_type("max_anisotropy", (ATTRIBUTE_PARSER)parseAnisotropy)); + mTextureUnitAttribParsers.insert(AttribParserList::value_type("texture_alias", (ATTRIBUTE_PARSER)parseTextureAlias)); + mTextureUnitAttribParsers.insert(AttribParserList::value_type("mipmap_bias", (ATTRIBUTE_PARSER)parseMipmapBias)); + mTextureUnitAttribParsers.insert(AttribParserList::value_type("content_type", (ATTRIBUTE_PARSER)parseContentType)); + } - mScriptContext.section = Ogre::MSS_PASS; + bool OgreMaterialSerializer::setPassProperty (const std::string& param, std::string value, Ogre::Pass* pass) + { + MaterialScriptContext mScriptContext; mScriptContext.pass = pass; if (mPassAttribParsers.find (param) == mPassAttribParsers.end()) @@ -54,9 +1920,7 @@ namespace sh return true; } - reset(); - - mScriptContext.section = Ogre::MSS_TEXTUREUNIT; + MaterialScriptContext mScriptContext; mScriptContext.textureUnit = t; if (mTextureUnitAttribParsers.find (param) == mTextureUnitAttribParsers.end()) @@ -70,9 +1934,7 @@ namespace sh bool OgreMaterialSerializer::setMaterialProperty (const std::string& param, std::string value, Ogre::MaterialPtr m) { - reset(); - - mScriptContext.section = Ogre::MSS_MATERIAL; + MaterialScriptContext mScriptContext; mScriptContext.material = m; if (mMaterialAttribParsers.find (param) == mMaterialAttribParsers.end()) diff --git a/source/shiny/Platforms/Ogre/OgreMaterialSerializer.hpp b/source/shiny/Platforms/Ogre/OgreMaterialSerializer.hpp index acfc5a36..0b38f49d 100644 --- a/source/shiny/Platforms/Ogre/OgreMaterialSerializer.hpp +++ b/source/shiny/Platforms/Ogre/OgreMaterialSerializer.hpp @@ -1,27 +1,38 @@ #ifndef SH_OGREMATERIALSERIALIZER_H #define SH_OGREMATERIALSERIALIZER_H -#include <OgreMaterialSerializer.h> +#include <OgrePrerequisites.h> namespace Ogre { - class Pass; + struct MaterialScriptContext; + /// Function def for material attribute parser; return value determines if the next line should be { + typedef bool (*ATTRIBUTE_PARSER)(String& params, MaterialScriptContext& context); } namespace sh { /** - * @brief This class allows me to let Ogre handle the pass & texture unit properties + * @brief This class handles the pass & texture unit properties */ - class OgreMaterialSerializer : public Ogre::MaterialSerializer + class OgreMaterialSerializer { public: + OgreMaterialSerializer(); + bool setPassProperty (const std::string& param, std::string value, Ogre::Pass* pass); bool setTextureUnitProperty (const std::string& param, std::string value, Ogre::TextureUnitState* t); bool setMaterialProperty (const std::string& param, std::string value, Ogre::MaterialPtr m); private: - void reset(); + /// Keyword-mapped attribute parsers. + typedef std::map<Ogre::String, Ogre::ATTRIBUTE_PARSER> AttribParserList; + /// Parsers for the pass section of a script + AttribParserList mPassAttribParsers; + /// Parsers for the texture unit section of a script + AttribParserList mTextureUnitAttribParsers; + /// Parsers for the material section of a script + AttribParserList mMaterialAttribParsers; }; } diff --git a/source/shiny/Platforms/Ogre/OgreTextureUnitState.cpp b/source/shiny/Platforms/Ogre/OgreTextureUnitState.cpp index e1adbf33..c5caf22f 100644 --- a/source/shiny/Platforms/Ogre/OgreTextureUnitState.cpp +++ b/source/shiny/Platforms/Ogre/OgreTextureUnitState.cpp @@ -10,7 +10,7 @@ namespace sh OgreTextureUnitState::OgreTextureUnitState (OgrePass* parent, const std::string& name) : TextureUnitState() { - mTextureUnitState = parent->getOgrePass()->createTextureUnitState(""); + mTextureUnitState = parent->getOgrePass()->createTextureUnitState(); mTextureUnitState->setName(name); } diff --git a/source/sound/SoundMgr.cpp b/source/sound/SoundMgr.cpp index 6653a78e..67b288d4 100644 --- a/source/sound/SoundMgr.cpp +++ b/source/sound/SoundMgr.cpp @@ -4,6 +4,7 @@ #include "SoundBase.h" #include "SoundBaseMgr.h" #include <OgreDataStream.h> +#include <OgreException.h> using namespace Ogre; diff --git a/source/vdrift/cartire.cpp b/source/vdrift/cartire.cpp index 982f8807..8c1f00aa 100644 --- a/source/vdrift/cartire.cpp +++ b/source/vdrift/cartire.cpp @@ -280,7 +280,7 @@ Dbl CARTIRE::Pacejka_Fx (Dbl sigma, Dbl Fz, Dbl friction_coeff, Dbl & maxforce_o maxforce_output = D; - assert(!std::isnan(Fx)); + assert(!isnan(Fx)); return Fx; } diff --git a/source/vdrift/collision_world.cpp b/source/vdrift/collision_world.cpp index d907939a..55d90894 100644 --- a/source/vdrift/collision_world.cpp +++ b/source/vdrift/collision_world.cpp @@ -504,7 +504,7 @@ bool COLLISION_WORLD::CastRay( int my = (pos[1] + 0.5*tws)/tws*t; my = std::max(0,std::min(t-1, t-1-my)); int mtr = pApp->blendMtr[my*t + mx]; - + assert(mtr < td.layers.size()); int id = td.layersAll[td.layers[mtr]].surfId; surf = &pApp->pGame->surfaces[id];
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor