From: <rds...@us...> - 2008-10-30 05:00:39
|
Revision: 2311 http://planeshift.svn.sourceforge.net/planeshift/?rev=2311&view=rev Author: rdschulz Date: 2008-10-30 05:00:35 +0000 (Thu, 30 Oct 2008) Log Message: ----------- oops more files for 2310 Modified Paths: -------------- trunk/src/client/modehandler.cpp trunk/src/client/modehandler.h trunk/src/client/psclientchar.cpp Modified: trunk/src/client/modehandler.cpp =================================================================== --- trunk/src/client/modehandler.cpp 2008-10-30 04:59:57 UTC (rev 2310) +++ trunk/src/client/modehandler.cpp 2008-10-30 05:00:35 UTC (rev 2311) @@ -838,7 +838,7 @@ PublishTime(clockHour); // Reset the time basis for interpolation - if (clockHour == lastClockHour+1 || lastClockHour == 23 && clockHour == 0) + if ( (clockHour == lastClockHour+1) || (lastClockHour == 23 && clockHour == 0) ) { last_interpolation_reset = csGetTicks(); interpolation_step = 0; @@ -1678,7 +1678,17 @@ } } +csString ModeHandler::MungeName(GEMClientActor* obj) +{ + csString nameTarget = obj->GetName(); + if (nameTarget == obj->race ) + { + return csString("the ").Append(nameTarget); + } else { + return nameTarget; + } +} void ModeHandler::AttackBlock(GEMClientActor* atObject, GEMClientActor* tarObject, csString& location ) { @@ -1686,7 +1696,7 @@ if(!(chatWindow->GetSettings().meFilters & COMBAT_BLOCKED)) return; - psSystemMessage ev(0,MSG_COMBAT_BLOCK,"You attack %s on the %s but are blocked", tarObject->GetName(), location.GetData() ); + psSystemMessage ev(0,MSG_COMBAT_BLOCK,"You attack %s on the %s but are blocked", MungeName(tarObject).GetData(), location.GetData() ); msghandler->Publish(ev.msg); } @@ -1699,7 +1709,7 @@ if(!(chatWindow->GetSettings().meFilters & COMBAT_SUCCEEDED)) return; - psSystemMessage ev(0,MSG_COMBAT_YOURHIT,"You hit %s on the %s for %1.2f damage!", tarObject->GetName(), location.GetData(), damage ); + psSystemMessage ev(0,MSG_COMBAT_YOURHIT,"You hit %s on the %s for %1.2f damage!", MungeName(tarObject).GetData(), location.GetData(), damage ); msghandler->Publish(ev.msg); } else @@ -1708,7 +1718,7 @@ if(!(chatWindow->GetSettings().meFilters & COMBAT_FAILED)) return; - psSystemMessage ev(0,MSG_COMBAT_YOURHIT,"You hit %s on the %s but fail to do any damage!", tarObject->GetName(), location.GetData()); + psSystemMessage ev(0,MSG_COMBAT_YOURHIT,"You hit %s on the %s but fail to do any damage!", MungeName(tarObject).GetData(), location.GetData()); msghandler->Publish(ev.msg); } @@ -1721,7 +1731,7 @@ if (psengine->GetSoundStatus() && soundmanager->PlayingCombatMusic()) psengine->GetEffectManager()->RenderEffect("combatVictory", csVector3(0, 0, 0), atObject->GetMesh()); - psSystemMessage ev(0,MSG_COMBAT_VICTORY,"You have killed %s!", tarObject->GetName() ); + psSystemMessage ev(0,MSG_COMBAT_VICTORY,"You have killed %s!", MungeName(tarObject).GetData() ); msghandler->Publish(ev.msg); } else //killing self @@ -1737,7 +1747,7 @@ if(!(chatWindow->GetSettings().meFilters & COMBAT_DODGED)) return; - psSystemMessage ev(0,MSG_COMBAT_DODGE,"%s has dodged your attack!", tarObject->GetName() ); + psSystemMessage ev(0,MSG_COMBAT_DODGE,"%s has dodged your attack!", MungeName(tarObject).GetData() ); msghandler->Publish(ev.msg); } @@ -1748,14 +1758,14 @@ if(!(chatWindow->GetSettings().meFilters & COMBAT_MISSED)) return; - psSystemMessage ev(0,MSG_COMBAT_MISS,"You attack %s but missed the %s.", tarObject->GetName(), location.GetData() ); + psSystemMessage ev(0,MSG_COMBAT_MISS,"You attack %s but missed the %s.", MungeName(tarObject).GetData(), location.GetData() ); msghandler->Publish(ev.msg); } void ModeHandler::AttackOutOfRange( GEMClientActor* atObject, GEMClientActor* tarObject ) { psengine->GetEffectManager()->RenderEffect("combatMiss", csVector3(0, 0, 0), atObject->GetMesh(), tarObject->GetMesh()); - psSystemMessage ev(0,MSG_COMBAT_MISS,"You are too far away to attack %s.", tarObject->GetName() ); + psSystemMessage ev(0,MSG_COMBAT_MISS,"You are too far away to attack %s.", MungeName(tarObject).GetData() ); msghandler->Publish(ev.msg); } @@ -1811,7 +1821,7 @@ if(!(chatWindow->GetSettings().meFilters & COMBAT_BLOCKED)) return; - psSystemMessage ev(0,MSG_COMBAT_BLOCK,"%s attacks you but your %s blocks it.", atObject->GetName(), location.GetData() ); + psSystemMessage ev(0,MSG_COMBAT_BLOCK,"%s attacks you but your %s blocks it.", MungeName(atObject).GetData(), location.GetData() ); msghandler->Publish(ev.msg); } @@ -1823,7 +1833,7 @@ if(!(chatWindow->GetSettings().meFilters & COMBAT_SUCCEEDED)) return; - psSystemMessage ev(0,MSG_COMBAT_HITYOU,"%s hits you on the %s for %1.2f damage!", atObject->GetName(), location.GetData(), damage ); + psSystemMessage ev(0,MSG_COMBAT_HITYOU,"%s hits you on the %s for %1.2f damage!", MungeName(atObject).GetData(), location.GetData(), damage ); msghandler->Publish(ev.msg); } else @@ -1832,7 +1842,7 @@ if(!(chatWindow->GetSettings().meFilters & COMBAT_FAILED)) return; - psSystemMessage ev(0,MSG_COMBAT_HITYOU,"%s hits you on the %s but fails to do any damage!", atObject->GetName(), location.GetData()); + psSystemMessage ev(0,MSG_COMBAT_HITYOU,"%s hits you on the %s but fails to do any damage!", MungeName(atObject).GetData(), location.GetData()); msghandler->Publish(ev.msg); } @@ -1842,7 +1852,7 @@ { //atObject-> psengine->GetEffectManager()->RenderEffect("combatDeath", csVector3(0,0,0), atObject->GetMesh()); - psSystemMessage ev(0,MSG_COMBAT_OWN_DEATH,"You have been killed by %s!", atObject->GetName() ); + psSystemMessage ev(0,MSG_COMBAT_OWN_DEATH,"You have been killed by %s!", MungeName(atObject).GetData() ); msghandler->Publish(ev.msg); } @@ -1852,7 +1862,7 @@ if(!(chatWindow->GetSettings().meFilters & COMBAT_DODGED)) return; - psSystemMessage ev(0,MSG_COMBAT_DODGE,"%s attacks you but you dodge.", atObject->GetName() ); + psSystemMessage ev(0,MSG_COMBAT_DODGE,"%s attacks you but you dodge.", MungeName(atObject).GetData() ); msghandler->Publish(ev.msg); } @@ -1862,14 +1872,14 @@ if(!(chatWindow->GetSettings().meFilters & COMBAT_MISSED)) return; - psSystemMessage ev(0,MSG_COMBAT_MISS,"%s attacks you but misses.", atObject->GetName() ); + psSystemMessage ev(0,MSG_COMBAT_MISS,"%s attacks you but misses.", MungeName(atObject).GetData() ); msghandler->Publish(ev.msg); } void ModeHandler::DefendOutOfRange( GEMClientActor* atObject, GEMClientActor* tarObject ) { psengine->GetEffectManager()->RenderEffect("combatMiss", csVector3(0, 0, 0), atObject->GetMesh(), tarObject->GetMesh()); - psSystemMessage ev(0,MSG_COMBAT_MISS,"%s attacks but is too far away to reach you.", atObject->GetName() ); + psSystemMessage ev(0,MSG_COMBAT_MISS,"%s attacks but is too far away to reach you.", MungeName(atObject).GetData() ); msghandler->Publish(ev.msg); } @@ -1939,7 +1949,7 @@ if(!((level > 0 || isGrouped) && (chatWindow->GetSettings().vicinityFilters & COMBAT_BLOCKED))) return; - psSystemMessage ev(0,MSG_COMBAT_BLOCK,"%s attacks %s but they are blocked.", atObject->GetName(), tarObject->GetName() ); + psSystemMessage ev(0,MSG_COMBAT_BLOCK,"%s attacks %s but they are blocked.", MungeName(atObject).GetData(), tarObject->GetName() ); msghandler->Publish(ev.msg); } @@ -1955,7 +1965,7 @@ if(!((level > 0 || isGrouped) && (chatWindow->GetSettings().vicinityFilters & COMBAT_SUCCEEDED))) return; - psSystemMessage ev(0,MSG_COMBAT_HITOTHER,"%s hits %s for %1.2f damage!", atObject->GetName(), tarObject->GetName(), damage ); + psSystemMessage ev(0,MSG_COMBAT_HITOTHER,"%s hits %s for %1.2f damage!", MungeName(atObject).GetData(), MungeName(tarObject).GetData(), damage ); msghandler->Publish(ev.msg); } else @@ -1963,7 +1973,7 @@ psengine->GetEffectManager()->RenderEffect("combatHitOtherFail", csVector3(0, 0, 0), tarObject->GetMesh(), atObject->GetMesh()); if(!((level > 0 || isGrouped) && (chatWindow->GetSettings().vicinityFilters & COMBAT_FAILED))) return; - psSystemMessage ev(0,MSG_COMBAT_HITOTHER,"%s hits %s, but fails to do any damage!", atObject->GetName(), tarObject->GetName()); + psSystemMessage ev(0,MSG_COMBAT_HITOTHER,"%s hits %s, but fails to do any damage!", MungeName(atObject).GetData(), MungeName(tarObject).GetData()); msghandler->Publish(ev.msg); } @@ -1973,12 +1983,12 @@ { if (atObject != tarObject) //not killing self { - psSystemMessage ev(0,MSG_COMBAT_DEATH,"%s has been killed by %s!", tarObject->GetName(), atObject->GetName() ); + psSystemMessage ev(0,MSG_COMBAT_DEATH,"%s has been killed by %s!", MungeName(tarObject).GetData(), MungeName(atObject).GetData() ); msghandler->Publish(ev.msg); } else //killing self { - psSystemMessage ev(0,MSG_COMBAT_DEATH,"%s has died!", tarObject->GetName()); + psSystemMessage ev(0,MSG_COMBAT_DEATH,"%s has died!", MungeName(tarObject).GetData()); msghandler->Publish(ev.msg); } } @@ -1992,7 +2002,7 @@ psengine->GetEffectManager()->RenderEffect("combatDodge", csVector3(0, 0, 0), tarObject->GetMesh(), atObject->GetMesh()); if(!((level > 0 || isGrouped) && (chatWindow->GetSettings().vicinityFilters & COMBAT_DODGED))) return; - psSystemMessage ev(0,MSG_COMBAT_DODGE,"%s attacks %s but %s dodges.", atObject->GetName(),tarObject->GetName(),tarObject->GetName() ); + psSystemMessage ev(0,MSG_COMBAT_DODGE,"%s attacks %s but %s dodges.", MungeName(atObject).GetData(),MungeName(tarObject).GetData(),MungeName(tarObject).GetData() ); msghandler->Publish(ev.msg); } @@ -2005,14 +2015,14 @@ psengine->GetEffectManager()->RenderEffect("combatMiss", csVector3(0, 0, 0), atObject->GetMesh(), tarObject->GetMesh()); if(!((level > 0 || isGrouped) && (chatWindow->GetSettings().vicinityFilters & COMBAT_MISSED))) return; - psSystemMessage ev(0,MSG_COMBAT_MISS,"%s attacks %s but misses.", atObject->GetName(),tarObject->GetName() ); + psSystemMessage ev(0,MSG_COMBAT_MISS,"%s attacks %s but misses.", MungeName(atObject).GetData(),MungeName(tarObject).GetData() ); msghandler->Publish(ev.msg); } void ModeHandler::OtherOutOfRange( GEMClientActor* atObject, GEMClientActor* tarObject ) { psengine->GetEffectManager()->RenderEffect("combatMiss", csVector3(0, 0, 0), atObject->GetMesh(), tarObject->GetMesh()); - psSystemMessage ev(0,MSG_COMBAT_MISS,"%s attacks but is too far away to reach %s.", atObject->GetName(), tarObject->GetName() ); + psSystemMessage ev(0,MSG_COMBAT_MISS,"%s attacks but is too far away to reach %s.", MungeName(atObject).GetData(),MungeName(tarObject).GetData() ); msghandler->Publish(ev.msg); } @@ -2020,7 +2030,7 @@ { if(!(chatWindow->GetSettings().vicinityFilters & COMBAT_SUCCEEDED)) return; - psSystemMessage ev(0, MSG_COMBAT_NEARLY_DEAD, "%s is nearly dead!", tarObject->GetName()); + psSystemMessage ev(0, MSG_COMBAT_NEARLY_DEAD, "%s is nearly dead!", MungeName(tarObject).GetData()); msghandler->Publish(ev.msg); } Modified: trunk/src/client/modehandler.h =================================================================== --- trunk/src/client/modehandler.h 2008-10-30 04:59:57 UTC (rev 2310) +++ trunk/src/client/modehandler.h 2008-10-30 05:00:35 UTC (rev 2311) @@ -233,6 +233,7 @@ private: pawsChatWindow* chatWindow; ///< Used to get the current chat filtering. + csString MungeName(GEMClientActor* obj); void SetCombatAnim( GEMClientActor* atObject, csStringID anim ); Modified: trunk/src/client/psclientchar.cpp =================================================================== --- trunk/src/client/psclientchar.cpp 2008-10-30 04:59:57 UTC (rev 2310) +++ trunk/src/client/psclientchar.cpp 2008-10-30 05:00:35 UTC (rev 2311) @@ -416,7 +416,7 @@ csString slotname(psengine->slotName.GetName(equip.slot)); - if ( equip.slot == PSCHARACTER_SLOT_HEAD ) + if ( equip.slot == PSCHARACTER_SLOT_HELM ) { psString result(equip.mesh); result.ReplaceAllSubString("$H",object->helmGroup); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <wel...@us...> - 2008-11-29 09:07:18
|
Revision: 2547 http://planeshift.svn.sourceforge.net/planeshift/?rev=2547&view=rev Author: weltall2 Date: 2008-11-29 09:07:12 +0000 (Sat, 29 Nov 2008) Log Message: ----------- changed last commited code to use references Modified Paths: -------------- trunk/src/client/authentclient.cpp trunk/src/client/authentclient.h trunk/src/client/iclient/netmanager.h trunk/src/client/psnetmanager.cpp trunk/src/client/psnetmanager.h Modified: trunk/src/client/authentclient.cpp =================================================================== --- trunk/src/client/authentclient.cpp 2008-11-29 08:36:03 UTC (rev 2546) +++ trunk/src/client/authentclient.cpp 2008-11-29 09:07:12 UTC (rev 2547) @@ -131,7 +131,7 @@ } -bool psAuthenticationClient::Authenticate (const csString user, const csString pwd) +bool psAuthenticationClient::Authenticate (const csString & user, const csString & pwd) { Notify3( LOG_CONNECTIONS, "Prelog in as: (%s,%s)\n", user.GetData(), pwd.GetData() ); psPreAuthenticationMessage request(0,PS_NETVERSION); Modified: trunk/src/client/authentclient.h =================================================================== --- trunk/src/client/authentclient.h 2008-11-29 08:36:03 UTC (rev 2546) +++ trunk/src/client/authentclient.h 2008-11-29 09:07:12 UTC (rev 2547) @@ -85,7 +85,7 @@ * * @return Always true. */ - bool Authenticate (const csString user, const csString pwd); + bool Authenticate (const csString & user, const csString & pwd); /** Handle incomming messages based on the subscribed types. */ Modified: trunk/src/client/iclient/netmanager.h =================================================================== --- trunk/src/client/iclient/netmanager.h 2008-11-29 08:36:03 UTC (rev 2546) +++ trunk/src/client/iclient/netmanager.h 2008-11-29 09:07:12 UTC (rev 2547) @@ -31,7 +31,7 @@ virtual bool Connect(const char* server, int port) = 0; virtual void Disconnect() = 0; virtual void SendDisconnect(bool final = true) = 0; - virtual void Authenticate(const csString name, const csString pwd ) = 0; + virtual void Authenticate(const csString & name, const csString & pwd ) = 0; virtual MsgHandler* GetMsgHandler() = 0; virtual CmdHandler* GetCmdHandler() = 0; Modified: trunk/src/client/psnetmanager.cpp =================================================================== --- trunk/src/client/psnetmanager.cpp 2008-11-29 08:36:03 UTC (rev 2546) +++ trunk/src/client/psnetmanager.cpp 2008-11-29 09:07:12 UTC (rev 2547) @@ -144,7 +144,7 @@ msghandler->DispatchQueue(); // Flush inbound message queue } -void psNetManager::Authenticate(const csString name, const csString pwd) +void psNetManager::Authenticate(const csString & name, const csString & pwd) { authclient->Authenticate(name,pwd); } Modified: trunk/src/client/psnetmanager.h =================================================================== --- trunk/src/client/psnetmanager.h 2008-11-29 08:36:03 UTC (rev 2546) +++ trunk/src/client/psnetmanager.h 2008-11-29 09:07:12 UTC (rev 2547) @@ -59,7 +59,7 @@ void SendDisconnect(bool final = true); /** Sends an authentication message to the server */ - void Authenticate(const csString name, const csString pwd); + void Authenticate(const csString & name, const csString & pwd); MsgHandler* GetMsgHandler(); CmdHandler* GetCmdHandler() { return cmdhandler; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mg...@us...> - 2008-12-10 07:35:43
|
Revision: 2663 http://planeshift.svn.sourceforge.net/planeshift/?rev=2663&view=rev Author: mgist Date: 2008-12-10 07:35:39 +0000 (Wed, 10 Dec 2008) Log Message: ----------- - Removed usage of colorize. Replaced with the "colour modulation" shadervar available in the default lighting shader. Modified Paths: -------------- trunk/src/client/charapp.cpp trunk/src/client/clientcachemanager.cpp Modified: trunk/src/client/charapp.cpp =================================================================== --- trunk/src/client/charapp.cpp 2008-12-09 16:07:34 UTC (rev 2662) +++ trunk/src/client/charapp.cpp 2008-12-10 07:35:39 UTC (rev 2663) @@ -197,7 +197,7 @@ if ( context_hair ) { - CS::ShaderVarStringID varName = stringSet->Request("colorize"); + CS::ShaderVarStringID varName = stringSet->Request("colour modulation"); csShaderVariable* var = context_hair->GetVariableAdd(varName); if ( var ) @@ -208,7 +208,7 @@ if ( context_beard ) { - CS::ShaderVarStringID varName = stringSet->Request("colorize"); + CS::ShaderVarStringID varName = stringSet->Request("colour modulation"); csShaderVariable* var = context_beard->GetVariableAdd(varName); if ( var ) Modified: trunk/src/client/clientcachemanager.cpp =================================================================== --- trunk/src/client/clientcachemanager.cpp 2008-12-09 16:07:34 UTC (rev 2662) +++ trunk/src/client/clientcachemanager.cpp 2008-12-10 07:35:39 UTC (rev 2663) @@ -140,11 +140,7 @@ csRef<iDocumentNodeIterator> shaders = material->GetNodes("shader"); while(shaders->HasNext()) { - csRef<iDocumentNode> shader = shaders->Next(); - if(strcmp("colorize", shader->GetContentsValue()) != 0) - { - material->RemoveNode(shader); - } + material->RemoveNode(shaders->Next()); } } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mg...@us...> - 2008-12-10 22:22:20
|
Revision: 2665 http://planeshift.svn.sourceforge.net/planeshift/?rev=2665&view=rev Author: mgist Date: 2008-12-10 21:38:25 +0000 (Wed, 10 Dec 2008) Log Message: ----------- - More work on eye colouring. Modified Paths: -------------- trunk/src/client/charapp.cpp trunk/src/client/charapp.h Modified: trunk/src/client/charapp.cpp =================================================================== --- trunk/src/client/charapp.cpp 2008-12-10 21:25:17 UTC (rev 2664) +++ trunk/src/client/charapp.cpp 2008-12-10 21:38:25 UTC (rev 2665) @@ -40,9 +40,12 @@ txtmgr = g3d->GetTextureManager(); xmlparser = csQueryRegistry<iDocumentSystem> (objectReg); + eyeMesh = "Eyes"; hairMesh = "Hair"; beardMesh = "Beard"; - hairAttached = true; + + eyeColorSet = false; + hairAttached = true; hairColorSet = false; state = NULL; @@ -221,7 +224,22 @@ } void psCharAppearance::EyeColor(csVector3& color) -{ +{ + eyeShader = color; + iShaderVariableContext* context_eyes = state->GetCoreMeshShaderVarContext(eyeMesh); + + if ( context_eyes ) + { + CS::ShaderVarStringID varName = stringSet->Request("color modulation"); + csShaderVariable* var = context_eyes->GetVariableAdd(varName); + + if ( var ) + { + var->SetValue(eyeShader); + } + } + + eyeColorSet = true; } void psCharAppearance::ShowHair(bool show) @@ -823,12 +841,15 @@ void psCharAppearance::Clone(psCharAppearance* clone) { + this->eyeMesh = clone->eyeMesh; this->hairMesh = clone->hairMesh; this->beardMesh = clone->beardMesh; + this->eyeShader = clone->eyeShader; this->hairShader = clone->hairShader; this->faceMaterial = clone->faceMaterial; - this->skinToneSet = clone->skinToneSet; + this->skinToneSet = clone->skinToneSet; + this->eyeColorSet = clone->eyeColorSet; this->hairAttached = clone->hairAttached; this->hairColorSet = clone->hairColorSet; this->effectids = clone->effectids; Modified: trunk/src/client/charapp.h =================================================================== --- trunk/src/client/charapp.h 2008-12-10 21:25:17 UTC (rev 2664) +++ trunk/src/client/charapp.h 2008-12-10 21:38:25 UTC (rev 2665) @@ -215,16 +215,18 @@ csRef<iTextureManager> txtmgr; csRef<iDocumentSystem> xmlparser; - + csString eyeMesh; // Default eye mesh. csString hairMesh; // Default hair mesh. csString beardMesh; // Beard mesh. + csVector3 eyeShader; // Default eye colour. csVector3 hairShader; // Default hair colour. bool hairAttached; // Flag if hair is on/off bool beardAttached; // Flag if beard is on/off. - bool hairColorSet; // Flag if hair colour set. + bool eyeColorSet; // Flag if eye colour set. + bool hairColorSet; // Flag if hair colour set. csString faceMaterial; // Default face materail. csArray<SkinToneSet> skinToneSet; // Default skin colours. This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ken...@us...> - 2008-12-17 08:59:55
|
Revision: 2707 http://planeshift.svn.sourceforge.net/planeshift/?rev=2707&view=rev Author: kennygraunke Date: 2008-12-17 08:59:51 +0000 (Wed, 17 Dec 2008) Log Message: ----------- Cleaned up unchecked and unsafe uses of strcpy and strcat on fixed size buffers. Modified Paths: -------------- trunk/src/client/psoptions.cpp trunk/src/client/psoptions.h Modified: trunk/src/client/psoptions.cpp =================================================================== --- trunk/src/client/psoptions.cpp 2008-12-17 00:54:00 UTC (rev 2706) +++ trunk/src/client/psoptions.cpp 2008-12-17 08:59:51 UTC (rev 2707) @@ -23,12 +23,9 @@ #include "psoptions.h" -const char * psOptions::BuildKey(char * result, const char * className, const char * optionName) const +void psOptions::BuildKey(csString & result, const char * className, const char * optionName) const { - strcpy(result, className); - strcat(result, "."); - strcat(result, optionName); - return result; + result.Format("%s.%s", className, optionName); } void psOptions::EnsureSubscription(const char * name) @@ -116,35 +113,39 @@ void psOptions::SetOption(const char * className, const char * name, const char * value) { - char key[64]; - configFile->SetStr(BuildKey(key, className, name), value); + csString key; + BuildKey(key, className, name); + configFile->SetStr(key, value); PawsManager::GetSingleton().Publish(key, value); } void psOptions::SetOption(const char * className, const char * name, float value) { - char key[64]; - configFile->SetFloat(BuildKey(key, className, name), value); + csString key; + BuildKey(key, className, name); + configFile->SetFloat(key, value); PawsManager::GetSingleton().Publish(key, value); } void psOptions::SetOption(const char * className, const char * name, int value) { - char key[64]; - configFile->SetInt(BuildKey(key, className, name), value); + csString key; + BuildKey(key, className, name); + configFile->SetInt(key, value); PawsManager::GetSingleton().Publish(key, value); } void psOptions::SetOption(const char * className, const char * name, bool value) { - char key[64]; - configFile->SetBool(BuildKey(key, className, name), value); + csString key; + BuildKey(key, className, name); + configFile->SetBool(key, value); PawsManager::GetSingleton().Publish(key, value); } const char * psOptions::GetOption(const char * className, const char * name, const char * defaultValue) { - char key[64]; + csString key; BuildKey(key, className, name); EnsureSubscription(key); @@ -157,7 +158,7 @@ float psOptions::GetOption(const char * className, const char * name, float defaultValue) { - char key[64]; + csString key; BuildKey(key, className, name); EnsureSubscription(key); @@ -170,7 +171,7 @@ int psOptions::GetOption(const char * className, const char * name, int defaultValue) { - char key[64]; + csString key; BuildKey(key, className, name); EnsureSubscription(key); @@ -183,7 +184,7 @@ bool psOptions::GetOption(const char * className, const char * name, bool defaultValue) { - char key[64]; + csString key; BuildKey(key, className, name); EnsureSubscription(key); Modified: trunk/src/client/psoptions.h =================================================================== --- trunk/src/client/psoptions.h 2008-12-17 00:54:00 UTC (rev 2706) +++ trunk/src/client/psoptions.h 2008-12-17 08:59:51 UTC (rev 2707) @@ -56,7 +56,7 @@ csHash<csString, csString> subscriptions; csString filename; - const char * BuildKey(char * result, const char * className, const char * optionName) const; + void BuildKey(csString & result, const char * className, const char * optionName) const; void EnsureSubscription(const char * name); public: This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <wel...@us...> - 2009-01-06 13:43:07
|
Revision: 2826 http://planeshift.svn.sourceforge.net/planeshift/?rev=2826&view=rev Author: weltall2 Date: 2009-01-06 13:43:05 +0000 (Tue, 06 Jan 2009) Log Message: ----------- Fixing FS#1548 - Battle Helms can be equipped in hands There is no need to check if it's an helm to replace for $H as $H is used only for helms replacement. Removed also the need of using psstring just to replace some $H Modified Paths: -------------- trunk/src/client/charapp.cpp trunk/src/client/psclientchar.cpp Modified: trunk/src/client/charapp.cpp =================================================================== --- trunk/src/client/charapp.cpp 2009-01-06 07:45:57 UTC (rev 2825) +++ trunk/src/client/charapp.cpp 2009-01-06 13:43:05 UTC (rev 2826) @@ -336,13 +336,8 @@ csString partMesh = equipNode->GetAttributeValue("partMesh"); csString texture = equipNode->GetAttributeValue( "texture" ); - // If this is a helm item check for helm replacement - if ( slot == "helm" ) - { - psString result(mesh); - result.ReplaceAllSubString("$H",helmGroup); - mesh = result; - } + //If the mesh has a $H it means it's an helm so search for replacement + mesh.ReplaceAll("$H",helmGroup); Equip(slot, mesh, part, partMesh, texture); } Modified: trunk/src/client/psclientchar.cpp =================================================================== --- trunk/src/client/psclientchar.cpp 2009-01-06 07:45:57 UTC (rev 2825) +++ trunk/src/client/psclientchar.cpp 2009-01-06 13:43:05 UTC (rev 2826) @@ -418,12 +418,9 @@ csString slotname(psengine->slotName.GetName(equip.slot)); - if ( equip.slot == PSCHARACTER_SLOT_HELM ) - { - psString result(equip.mesh); - result.ReplaceAllSubString("$H",object->helmGroup); - equip.mesh = result; - } + + //if the mesh has a $H it means it's an helm so search for replacement + equip.mesh.ReplaceAll("$H",object->helmGroup); if ( equip.type == psEquipmentMessage::EQUIP ) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <wel...@us...> - 2009-01-06 13:48:38
|
Revision: 2827 http://planeshift.svn.sourceforge.net/planeshift/?rev=2827&view=rev Author: weltall2 Date: 2009-01-06 13:48:37 +0000 (Tue, 06 Jan 2009) Log Message: ----------- Trimmed spaces and converted tabs to spaces Modified Paths: -------------- trunk/src/client/charapp.cpp trunk/src/client/psclientchar.cpp Modified: trunk/src/client/charapp.cpp =================================================================== --- trunk/src/client/charapp.cpp 2009-01-06 13:43:05 UTC (rev 2826) +++ trunk/src/client/charapp.cpp 2009-01-06 13:48:37 UTC (rev 2827) @@ -37,9 +37,9 @@ engine = csQueryRegistry<iEngine>(objectReg); vfs = csQueryRegistry<iVFS>(objectReg); g3d = csQueryRegistry<iGraphics3D>(objectReg); - txtmgr = g3d->GetTextureManager(); + txtmgr = g3d->GetTextureManager(); xmlparser = csQueryRegistry<iDocumentSystem> (objectReg); - + eyeMesh = "Eyes"; hairMesh = "Hair"; beardMesh = "Beard"; @@ -59,7 +59,7 @@ { state = scfQueryInterface<iSpriteCal3DState>(mesh->GetMeshObject()); stateFactory = scfQueryInterface<iSpriteCal3DFactoryState>(mesh->GetMeshObject()->GetFactory()); - + baseMesh = mesh; } @@ -67,12 +67,12 @@ csString psCharAppearance::ParseStrings(const char* part, const char* str) const { psString result(str); - + const char* factname = baseMesh->GetFactory()->QueryObject()->GetName(); - + result.ReplaceAllSubString("$F", factname); result.ReplaceAllSubString("$P", part); - + return result; } @@ -81,9 +81,9 @@ { csString materialParsed = ParseStrings("", faceMaterial); csString textureParsed = ParseStrings("", faceTexture); - + iMaterialWrapper* material = Loader::GetSingleton().LoadMaterial(materialParsed, textureParsed); - + if ( !material ) { Notify3(LOG_CHARACTER, "Failed to load texture ( %s, %s )", faceMaterial.GetData(), faceTexture.GetData()); @@ -93,32 +93,32 @@ { if ( state ) { - state->SetMaterial("Head", material); + state->SetMaterial("Head", material); } - } + } } void psCharAppearance::BeardMesh(csString& subMesh) { beardMesh = subMesh; - + if ( beardMesh.Length() == 0 ) { for ( int idx=0; idx < stateFactory->GetMeshCount(); idx++) { const char* meshName = stateFactory->GetMeshName(idx); - + if ( strstr(meshName, "Beard") ) { state->DetachCoreMesh(meshName); } } - return; + return; } - + csString newPartParsed = ParseStrings("Beard", beardMesh); - + int newMeshAvailable = stateFactory->FindMeshName(newPartParsed); if ( newMeshAvailable == -1 ) { @@ -129,33 +129,33 @@ for ( int idx=0; idx < stateFactory->GetMeshCount(); idx++) { const char* meshName = stateFactory->GetMeshName(idx); - + if ( strstr(meshName, "Beard") ) { state->DetachCoreMesh(meshName); } } - + state->AttachCoreMesh(newPartParsed); beardAttached = true; beardMesh = newPartParsed; } - + if ( hairColorSet ) - HairColor(hairShader); + HairColor(hairShader); } void psCharAppearance::HairMesh(csString& subMesh) -{ +{ hairMesh = subMesh; - + if ( hairMesh.Length() == 0 ) { hairMesh = "Hair"; } - + csString newPartParsed = ParseStrings("Hair", hairMesh); - + int newMeshAvailable = stateFactory->FindMeshName(newPartParsed); if ( newMeshAvailable == -1 ) { @@ -166,20 +166,20 @@ for ( int idx=0; idx < stateFactory->GetMeshCount(); idx++) { const char* meshName = stateFactory->GetMeshName(idx); - + if ( strstr(meshName, "Hair") ) { state->DetachCoreMesh(meshName); } } - + state->AttachCoreMesh(newPartParsed); hairAttached = true; hairMesh = newPartParsed; } - + if ( hairColorSet ) - HairColor(hairShader); + HairColor(hairShader); } @@ -190,34 +190,34 @@ return; } else - { + { hairShader = color; iShaderVariableContext* context_hair = state->GetCoreMeshShaderVarContext(hairMesh); iShaderVariableContext* context_beard = state->GetCoreMeshShaderVarContext(beardMesh); - + if ( context_hair ) { CS::ShaderVarStringID varName = stringSet->Request("color modulation"); csShaderVariable* var = context_hair->GetVariableAdd(varName); - + if ( var ) { var->SetValue(hairShader); } } - + if ( context_beard ) { CS::ShaderVarStringID varName = stringSet->Request("color modulation"); csShaderVariable* var = context_beard->GetVariableAdd(varName); - + if ( var ) { var->SetValue(hairShader); } } hairColorSet = true; - } + } } void psCharAppearance::EyeColor(csVector3& color) @@ -265,16 +265,16 @@ if (!baseMesh || !part || !material || !texture) { return; - } + } else { SkinToneSet s; s.part = part; s.material = material; s.texture = texture; - + skinToneSet.Push(s); - + csString materialNameParsed = ParseStrings(part, material); csString textureNameParsed = ParseStrings(part, texture); @@ -291,7 +291,7 @@ csString left,right; left.Format("Left %s",part.GetData()); right.Format("Right %s",part.GetData()); - + // Try mirroring if ( !state->SetMaterial(left,material) || !state->SetMaterial(right,material) ) { @@ -299,7 +299,7 @@ return; } } - } + } } @@ -309,7 +309,7 @@ { return; } - + csRef<iDocument> doc = xmlparser->CreateDocument(); const char* error = doc->Parse(equipment); @@ -318,15 +318,15 @@ Error2("Error in XML: %s", error ); return; } - + // Do the helm check. - csRef<iDocumentNode> helmNode = doc->GetRoot()->GetNode("equiplist")->GetNode("helm"); + csRef<iDocumentNode> helmNode = doc->GetRoot()->GetNode("equiplist")->GetNode("helm"); csString helmGroup(helmNode->GetContentsValue()); if ( helmGroup.Length() == 0 ) helmGroup = baseMesh->GetFactory()->QueryObject()->GetName(); - + csRef<iDocumentNodeIterator> equipIter = doc->GetRoot()->GetNode("equiplist")->GetNodes("equip"); - + while (equipIter->HasNext()) { csRef<iDocumentNode> equipNode = equipIter->Next(); @@ -335,13 +335,13 @@ csString part = equipNode->GetAttributeValue( "part" ); csString partMesh = equipNode->GetAttributeValue("partMesh"); csString texture = equipNode->GetAttributeValue( "texture" ); - + //If the mesh has a $H it means it's an helm so search for replacement mesh.ReplaceAll("$H",helmGroup); - - Equip(slot, mesh, part, partMesh, texture); + + Equip(slot, mesh, part, partMesh, texture); } - + return; } @@ -352,13 +352,13 @@ csString& subMesh, csString& texture ) -{ - +{ + if ( slotname == "helm" ) { ShowHair(false); } - + // If it's a new mesh attach that mesh. if ( mesh.Length() ) { @@ -370,7 +370,7 @@ { // Change the mesh on the part of the model. ChangeMesh(part, subMesh); - + // If there is also a new material ( texture ) then place that on as well. if ( texture.Length() ) { @@ -380,7 +380,7 @@ else if ( part.Length() ) { ChangeMaterial(part, texture, texture); - } + } } @@ -389,7 +389,7 @@ csString& part, csString& subMesh, csString& texture) -{ +{ if ( slotname == "helm" ) { ShowHair(true); @@ -404,7 +404,7 @@ if ( subMesh.Length() ) { - DefaultMesh(part); + DefaultMesh(part); } if ( part.Length() ) @@ -413,10 +413,10 @@ { ChangeMaterial(part, texture, texture); } - else + else { DefaultMaterial(part); - } + } DefaultMaterial(part); } @@ -443,11 +443,11 @@ } } - if (!defaultPart) + if (!defaultPart) { return; } - + state->AttachCoreMesh( defaultPart ); } @@ -456,7 +456,7 @@ { if ( !part || !meshName || !textureName) return false; - + csString meshNameParsed = ParseStrings(part, meshName); csString textureNameParsed = ParseStrings(part, textureName); @@ -487,24 +487,24 @@ bool psCharAppearance::ChangeMesh(const char* partPattern, const char* newPart) -{ +{ csString newPartParsed = ParseStrings(partPattern, newPart); - // If the new mesh cannot be found then do nothing. + // If the new mesh cannot be found then do nothing. int newMeshAvailable = stateFactory->FindMeshName(newPartParsed); if ( newMeshAvailable == -1 ) return false; - + /* First we detach every mesh that match the partPattern */ for (int idx=0; idx < stateFactory->GetMeshCount(); idx++) { const char * meshName = stateFactory->GetMeshName( idx ); if (strstr(meshName,partPattern)) - { + { state->DetachCoreMesh( meshName ); } } - + state->AttachCoreMesh( newPartParsed.GetData() ); return true; } @@ -515,7 +515,7 @@ if (!socketName || !meshFactName) return false; - + csRef<iSpriteCal3DSocket> socket = state->FindSocket( socketName ); if ( !socket ) { @@ -530,7 +530,7 @@ csString filename; if (!psengine->GetFileNameByFact(meshFactName, filename)) { - Error2("Mesh Factory %s not found", meshFactName ); + Error2("Mesh Factory %s not found", meshFactName ); return false; } @@ -616,7 +616,7 @@ { return; } - + csRef<iDocument> doc = xmlparser->CreateDocument(); const char* traitError = doc->Parse(traitString); @@ -665,7 +665,7 @@ { Trait * trait = iter3.Next(); if (trait->prev_trait == NULL) - { + { if (!SetTrait(trait)) { Error2("Failed to set trait %s for mesh.", traitString.GetData()); @@ -690,31 +690,31 @@ SetSkinTone(trait->mesh, trait->material, trait->texture); break; } - + case PSTRAIT_LOCATION_FACE: { FaceTexture(trait->material, trait->texture ); - break; + break; } - - + + case PSTRAIT_LOCATION_HAIR_STYLE: { HairMesh(trait->mesh); break; } - - + + case PSTRAIT_LOCATION_BEARD_STYLE: { BeardMesh(trait->mesh); break; - } - + } + case PSTRAIT_LOCATION_HAIR_COLOR: { - HairColor(trait->shader); + HairColor(trait->shader); break; } @@ -723,8 +723,8 @@ EyeColor(trait->shader); break; } - + default: { Error3("Trait(%d) unknown trait location %d",trait->uid,trait->location); @@ -771,8 +771,8 @@ } csArray<csString> deleteList = usedSlots; - - for ( size_t z = 0; z < deleteList.GetSize(); z++ ) + + for ( size_t z = 0; z < deleteList.GetSize(); z++ ) { Detach(deleteList[z]); } @@ -801,9 +801,9 @@ if (!socketName) { return false; - } + } - + csRef<iSpriteCal3DSocket> socket = state->FindSocket( socketName ); if ( !socket ) { @@ -823,7 +823,7 @@ engine->RemoveObject( meshWrap ); } - usedSlots.Delete(socketName); + usedSlots.Delete(socketName); return true; } @@ -833,9 +833,9 @@ this->eyeMesh = clone->eyeMesh; this->hairMesh = clone->hairMesh; this->beardMesh = clone->beardMesh; - + this->eyeShader = clone->eyeShader; - this->hairShader = clone->hairShader; + this->hairShader = clone->hairShader; this->faceMaterial = clone->faceMaterial; this->skinToneSet = clone->skinToneSet; this->eyeColorSet = clone->eyeColorSet; Modified: trunk/src/client/psclientchar.cpp =================================================================== --- trunk/src/client/psclientchar.cpp 2009-01-06 13:43:05 UTC (rev 2826) +++ trunk/src/client/psclientchar.cpp 2009-01-06 13:48:37 UTC (rev 2827) @@ -1,7 +1,7 @@ /* * psclientchar.cpp * - * Copyright (C) 2002 Atomic Blue (in...@pl..., http://www.atomicblue.org) + * Copyright (C) 2002 Atomic Blue (in...@pl..., http://www.atomicblue.org) * * * This program is free software; you can redistribute it and/or @@ -18,8 +18,8 @@ * The client side version of char manager that talks with the server side * version. Used for things like inventory query's and such. * - * Client version of character manager that talks to server version about - * the details involved about a player. + * Client version of character manager that talks to server version about + * the details involved about a player. */ #include <psconfig.h> //============================================================================= @@ -70,25 +70,25 @@ //------------------------------------------------------------------------------ void Trait::Load( iDocumentNode* node ) -{ +{ csString genderStr; name = node->GetAttributeValue( "name" ); int cstr_id_mesh = node->GetAttributeValueAsInt( "mesh" ); int cstr_id_texture = node->GetAttributeValueAsInt( "tex" ); int cstr_id_material = node->GetAttributeValueAsInt( "mat" ); - genderStr = node->GetAttributeValue( "gender" ); + genderStr = node->GetAttributeValue( "gender" ); location = ConvertTraitLocationString(node->GetAttributeValue( "loc" )); - csString shaderColours = node->GetAttributeValue("shader"); + csString shaderColours = node->GetAttributeValue("shader"); if ( shaderColours.Length() > 0 ) sscanf( shaderColours.GetData(), "%f,%f,%f", &shader.x, &shader.y, &shader.z ); else - shader = csVector3(0,0,0); - + shader = csVector3(0,0,0); + texture = psengine->FindCommonString(cstr_id_texture); material = psengine->FindCommonString(cstr_id_material); mesh = psengine->FindCommonString(cstr_id_mesh); - if (genderStr.IsEmpty()) + if (genderStr.IsEmpty()) genderStr = "N"; if (genderStr != "F" && genderStr != "M" && genderStr != "N") { @@ -99,12 +99,12 @@ if (genderStr == "F") { gender = PSCHARACTER_GENDER_FEMALE; - } + } else if (genderStr == "M") { gender = PSCHARACTER_GENDER_MALE; - } - else + } + else { gender = PSCHARACTER_GENDER_NONE; } @@ -135,37 +135,37 @@ PSTRAIT_LOCATION Trait::ConvertTraitLocationString(const char *locationstring) { - + if (locationstring==NULL) return PSTRAIT_LOCATION_NONE; - + if (!strcasecmp(locationstring,"HAIR_STYLE")) return PSTRAIT_LOCATION_HAIR_STYLE; - + if (!strcasecmp(locationstring,"HAIR_COLOR")) return PSTRAIT_LOCATION_HAIR_COLOR; - + if (!strcasecmp(locationstring,"BEARD_STYLE")) return PSTRAIT_LOCATION_BEARD_STYLE; - + if (!strcasecmp(locationstring,"FACE")) return PSTRAIT_LOCATION_FACE; - + if (!strcasecmp(locationstring,"SKIN_TONE")) return PSTRAIT_LOCATION_SKIN_TONE; - + if (!strcasecmp(locationstring,"ITEM")) return PSTRAIT_LOCATION_ITEM; if (!strcasecmp(locationstring,"EYE_COLOR")) return PSTRAIT_LOCATION_EYE_COLOR; - + return PSTRAIT_LOCATION_NONE; } //------------------------------------------------------------------------------ psClientCharManager::psClientCharManager(iObjectRegistry *objectreg) -{ +{ ready = true; objectReg = objectreg; @@ -175,7 +175,7 @@ target = 0; targetEffect = 0; - + } psClientCharManager::~psClientCharManager() @@ -185,15 +185,15 @@ msghandler->Unsubscribe(this, MSGTYPE_CHARREJECT); msghandler->Unsubscribe(this, MSGTYPE_EQUIPMENT); msghandler->Unsubscribe(this, MSGTYPE_EFFECT); - msghandler->Unsubscribe(this, MSGTYPE_EFFECT_STOP); - msghandler->Unsubscribe(this, MSGTYPE_PLAYSOUND); + msghandler->Unsubscribe(this, MSGTYPE_EFFECT_STOP); + msghandler->Unsubscribe(this, MSGTYPE_PLAYSOUND); msghandler->Unsubscribe(this, MSGTYPE_USERACTION); msghandler->Unsubscribe(this, MSGTYPE_GUITARGETUPDATE); } delete charCreation; } -bool psClientCharManager::Initialize( MsgHandler* msgHandler, +bool psClientCharManager::Initialize( MsgHandler* msgHandler, psCelClient* GEMSupervisor) { msghandler = msgHandler; @@ -206,18 +206,18 @@ if ( !msghandler->Subscribe(this, MSGTYPE_EFFECT) ) return false; if ( !msghandler->Subscribe(this, MSGTYPE_EFFECT_STOP) ) - return false; + return false; if ( !msghandler->Subscribe(this, MSGTYPE_PLAYSOUND) ) - return false; + return false; if (!msghandler->Subscribe(this, MSGTYPE_USERACTION) ) return false; if (!msghandler->Subscribe(this, MSGTYPE_GUITARGETUPDATE) ) return false; if (!msghandler->Subscribe(this, MSGTYPE_CHANGE_TRAIT) ) - return false; + return false; charCreation = new psCreationManager( objectReg ); - - + + return true; } @@ -230,21 +230,21 @@ ChangeTrait(me); break; } - + case MSGTYPE_USERACTION: { HandleAction( me ); break; } case MSGTYPE_CHARREJECT: - { + { HandleRejectCharMessage( me ); break; } - case MSGTYPE_EQUIPMENT: + case MSGTYPE_EQUIPMENT: { - HandleEquipment(me); + HandleEquipment(me); return; } @@ -253,13 +253,13 @@ HandleEffect(me); return; } - + case MSGTYPE_EFFECT_STOP: { HandleEffectStop(me); return; } - + case MSGTYPE_PLAYSOUND: { if(psengine->GetSoundStatus()) @@ -268,7 +268,7 @@ } return; } - + case MSGTYPE_GUITARGETUPDATE: { HandleTargetUpdate(me); @@ -298,17 +298,17 @@ // Update main object //psengine->BuildAppearance( object->pcmesh->GetMesh(), mesg.string ); object->charApp->ApplyTraits(mesg.string); - + // Update any doll views registered for changes csArray<iPAWSSubscriber*> dolls = PawsManager::GetSingleton().ListSubscribers("sigActorUpdate"); for (size_t i=0; i<dolls.GetSize(); i++) { - if (dolls[i] == NULL) + if (dolls[i] == NULL) continue; - + pawsObjectView* doll = dynamic_cast<pawsObjectView*>(dolls[i]); - - if (doll == NULL) + + if (doll == NULL) continue; if (doll->GetID() == objectID.Unbox()) // This is a doll of the updated object @@ -318,7 +318,7 @@ p.Clone(object->charApp); p.SetMesh(dollObject); p.ApplyTraits(mesg.string); - + if (dollObject == NULL) { Error2("Cannot update registered doll view with ID %d because it has no object", doll->GetID()); @@ -349,7 +349,7 @@ // delete the old target effect psengine->GetEffectManager()->DeleteEffect(targetEffect); targetEffect = 0; - + EID mappedID; // Action locations don't have effects @@ -359,13 +359,13 @@ csRef<iMeshWrapper> targetMesh = target->GetMesh(); if (targetMesh) targetEffect = psengine->GetEffectManager()->RenderEffect("target", csVector3(0,0,0), targetMesh); - + // notify the server of selection mappedID = target->GetEID(); } // if it's a message sent by server, there is no need to resend back the same information - if (notifyServer) + if (notifyServer) { psUserActionMessage userAction(0, mappedID, action); userAction.SendMessage(); @@ -408,7 +408,7 @@ { psEquipmentMessage equip( me ); unsigned int playerID = equip.player; - + GEMClientActor* object = (GEMClientActor*)cel->FindObject( playerID ); if (!object) { @@ -416,26 +416,26 @@ return; } - + csString slotname(psengine->slotName.GetName(equip.slot)); //if the mesh has a $H it means it's an helm so search for replacement equip.mesh.ReplaceAll("$H",object->helmGroup); - + if ( equip.type == psEquipmentMessage::EQUIP ) - { + { // Update the actor - object->charApp->Equip(slotname,equip.mesh,equip.part,equip.partMesh,equip.texture); + object->charApp->Equip(slotname,equip.mesh,equip.part,equip.partMesh,equip.texture); // Update any doll views registered for changes csArray<iPAWSSubscriber*> dolls = PawsManager::GetSingleton().ListSubscribers("sigActorUpdate"); for (size_t i=0; i<dolls.GetSize(); i++) { - if (dolls[i] == NULL) + if (dolls[i] == NULL) continue; pawsObjectView* doll = dynamic_cast<pawsObjectView*>(dolls[i]); - - if (doll == NULL) + + if (doll == NULL) continue; if (doll->GetID() == playerID) // This is a doll of the updated object { @@ -458,13 +458,13 @@ csArray<iPAWSSubscriber*> dolls = PawsManager::GetSingleton().ListSubscribers("sigActorUpdate"); for (size_t i=0; i<dolls.GetSize(); i++) { - if (dolls[i] == NULL) + if (dolls[i] == NULL) continue; pawsObjectView* doll = dynamic_cast<pawsObjectView*>(dolls[i]); - - if (doll == NULL) + + if (doll == NULL) continue; - + if (doll->GetID() == playerID) // This is a doll of the updated object { iMeshWrapper* dollObject = doll->GetObject(); @@ -473,22 +473,22 @@ Error2("Cannot update registered doll view with ID %d because it has no object", doll->GetID()); continue; } - + psCharAppearance* p = doll->GetCharApp(); p->SetMesh(dollObject); p->Clone(object->charApp); p->Dequip(slotname,equip.mesh,equip.part,equip.partMesh,equip.texture); } - } - - object->charApp->Dequip(slotname,equip.mesh,equip.part,equip.partMesh,equip.texture); + } + + object->charApp->Dequip(slotname,equip.mesh,equip.part,equip.partMesh,equip.texture); } } void psClientCharManager::HandleEffectStop(MsgEntry* me) { psStopEffectMessage effect(me); - + if (psengine->GetEffectManager ()) { // This code work as long as PutUnique is used to enter @@ -496,7 +496,7 @@ unsigned int effectID = effectMapper.Get(effect.uid,0); psengine->GetEffectManager()->DeleteEffect(effectID); effectMapper.DeleteAll(effect.uid); - } + } } void psClientCharManager::HandleEffect( MsgEntry* me ) @@ -516,44 +516,44 @@ { if (gemAnchor) anchor = gemAnchor->GetMesh(); - + // get the target GEMClientObject* gemTarget = cel->FindObject(effect.targetID); iMeshWrapper *target = anchor; if (gemTarget) target = gemTarget->GetMesh(); - + // render the actual effect if (psengine->GetEffectManager ()) - { + { unsigned int effectID = 0; unsigned int uniqueIDOverride = effectMapper.Get(effect.uid, 0); // Will return 0 if no uid in store or uid is 0. csVector3 up(0,1,0); - + if (anchor) { - effectID = psengine->GetEffectManager()->RenderEffect(effect.name, effect.offset, + effectID = psengine->GetEffectManager()->RenderEffect(effect.name, effect.offset, anchor, target,up,uniqueIDOverride); } else { iSector * sector = psengine->GetPSCamera()->GetICamera()->GetCamera()->GetSector(); // Sector should come in the message - effectID = psengine->GetEffectManager()->RenderEffect(effect.name, sector, + effectID = psengine->GetEffectManager()->RenderEffect(effect.name, sector, effect.offset, target, - up,uniqueIDOverride); + up,uniqueIDOverride); } - + if (effectID == 0) { Error2("Failed to render effect %s",effect.name.GetDataSafe()); } if ( effect.uid != 0 ) - { + { effectMapper.PutUnique( effect.uid, effectID ); - } - } - + } + } + // if this is a spell effect, if (effect.castDuration > 0) { @@ -567,7 +567,7 @@ widget->Start(effect.castDuration); } } - + // start the spell animation GEMClientActor* actor = (GEMClientActor*)gemAnchor; if ( actor ) @@ -582,18 +582,18 @@ void psClientCharManager::HandleRejectCharMessage( MsgEntry* me ) { psCharRejectedMessage reject( me ); - + switch ( reject.errorType ) { case psCharRejectedMessage::NON_LEGAL_NAME: - case psCharRejectedMessage::NON_UNIQUE_NAME: - case psCharRejectedMessage::RESERVED_NAME: - case psCharRejectedMessage::INVALID_CREATION: - { + case psCharRejectedMessage::NON_UNIQUE_NAME: + case psCharRejectedMessage::RESERVED_NAME: + case psCharRejectedMessage::INVALID_CREATION: + { PawsManager::GetSingleton().CreateWarningBox( reject.errorMesg ); - PawsManager::GetSingleton().FindWidget("CharCreateMain")->Show(); + PawsManager::GetSingleton().FindWidget("CharCreateMain")->Show(); PawsManager::GetSingleton().FindWidget("Summary")->Hide(); - + break; } } @@ -605,17 +605,17 @@ psCreationManager::psCreationManager( iObjectRegistry* objReg ) { objectReg = objReg; - LoadRaceInformation(); - - msgHandler = psengine->GetMsgHandler(); - msgHandler->Subscribe(this, MSGTYPE_CHAR_CREATE_CP); + LoadRaceInformation(); + + msgHandler = psengine->GetMsgHandler(); + msgHandler->Subscribe(this, MSGTYPE_CHAR_CREATE_CP); msgHandler->Subscribe(this, MSGTYPE_CHAR_CREATE_PARENTS); - msgHandler->Subscribe(this, MSGTYPE_CHAR_CREATE_CHILDHOOD); + msgHandler->Subscribe(this, MSGTYPE_CHAR_CREATE_CHILDHOOD); msgHandler->Subscribe( this, MSGTYPE_CHAR_CREATE_UPLOAD ); - msgHandler->Subscribe( this, MSGTYPE_CHAR_CREATE_VERIFY ); + msgHandler->Subscribe( this, MSGTYPE_CHAR_CREATE_VERIFY ); msgHandler->Subscribe( this, MSGTYPE_CHAR_CREATE_LIFEEVENTS ); msgHandler->Subscribe( this, MSGTYPE_CHAR_CREATE_TRAITS ); - + hasParentData = false; hasChildhoodData = false; hasLifeEventData = false; @@ -626,14 +626,14 @@ selectedHairStyle = -1; selectedBeardStyle = -1; selectedHairColour = -1; - selectedSkinColour = -1; + selectedSkinColour = -1; selectedGender = PSCHARACTER_GENDER_MALE; fatherMod = 1; motherMod = 1; - + nameGenerator = new NameGenerationSystem(); nameGenerator->LoadDatabase( objReg ); - + ClearChoices(); } @@ -651,13 +651,13 @@ if ( raceDescriptions[race]->startingCP == -1 ) { // This is a simple message so don't need a seperate class for it. - // We can just create the message our selves. + // We can just create the message our selves. csRef<MsgEntry> msg; msg.AttachNew(new MsgEntry( 100 )); - msg->SetType(MSGTYPE_CHAR_CREATE_CP); + msg->SetType(MSGTYPE_CHAR_CREATE_CP); msg->Add( (int32_t) race ); msg->ClipToCurrentSize(); - + msgHandler->SendMessage(msg); return REQUESTING_CP; } @@ -668,12 +668,12 @@ } void psCreationManager::HandleMessage( MsgEntry* me ) -{ +{ switch ( me->GetType() ) { case MSGTYPE_CHAR_CREATE_CP: - { - int race = me->GetInt32(); + { + int race = me->GetInt32(); int points = me->GetInt32(); raceDescriptions[race]->startingCP = points; return; @@ -689,8 +689,8 @@ HandleChildhoodData( me ); hasChildhoodData = true; break; - } - + } + case MSGTYPE_CHAR_CREATE_LIFEEVENTS: { HandleLifeEventData( me ); @@ -710,7 +710,7 @@ HandleVerify( me ); break; } - + case MSGTYPE_CHAR_CREATE_UPLOAD: { pawsWidget* wdg = PawsManager::GetSingleton().FindWidget("Summary"); @@ -720,8 +720,8 @@ psengine->StartLoad(); break; } - - } + + } } void psCreationManager::HandleLifeEventData( MsgEntry* me ) @@ -763,17 +763,17 @@ return; } csRef<iDocumentNodeIterator> iter1 = root->GetNode("traits")->GetNodes("trait"); - + // Build the traits list while ( iter1->HasNext() ) { csRef<iDocumentNode> node = iter1->Next(); - + Trait *t = new Trait; t->Load( node ); traits.Push(t); - } + } TraitIterator iter2 = GetTraitIterator(); while ( iter2.HasNext() ) @@ -793,7 +793,7 @@ Trait * t = iter3.Next(); // Check for top trait if (t->prev_trait == NULL) - { + { RaceDefinition * race = GetRace(t->raceID); if (race != NULL) { @@ -807,7 +807,7 @@ { race->location[t->location][t->gender].Push(t); } - } + } else { Error3("Failed to insert trait '%s' into location table for race %d.\n",t->name.GetData(),t->raceID); @@ -822,7 +822,7 @@ while ( tIter.HasNext() ) { Trait * t = tIter.Next(); - if (t->uid == uid) + if (t->uid == uid) return t; } return NULL; @@ -833,23 +833,23 @@ psCharVerificationMesg mesg(me); pawsSummaryWindow * window = (pawsSummaryWindow*)PawsManager::GetSingleton().FindWidget("Summary"); if ( window ) - window->SetVerify( mesg.stats, mesg.skills ); + window->SetVerify( mesg.stats, mesg.skills ); } void psCreationManager::HandleChildhoodData( MsgEntry* me ) { psCreationChoiceMsg incomming( me ); - // Simple create a copy of the data in the message. - incomming.choices.TransferTo( childhoodData ); + // Simple create a copy of the data in the message. + incomming.choices.TransferTo( childhoodData ); } void psCreationManager::HandleParentsData( MsgEntry* me ) { psCreationChoiceMsg incomming( me ); - - // Simple create a copy of the data in the message. - incomming.choices.TransferTo( parentData ); + + // Simple create a copy of the data in the message. + incomming.choices.TransferTo( parentData ); } @@ -857,15 +857,15 @@ { iDocumentSystem* xml = psengine->GetXMLParser (); iVFS* vfs = psengine->GetVFS (); - + csRef<iDataBuffer> buff = vfs->ReadFile( "/this/data/races/descriptions.xml" ); if ( !buff || !buff->GetSize() ) { Error2( "Could not load XML: %s", "descriptions.xml" ); - return; + return; } - + csRef<iDocument> doc = xml->CreateDocument(); const char* error = doc->Parse( buff ); if ( error ) @@ -873,7 +873,7 @@ Error3( "Error parsing XML file %s: %s", "descriptions.xml", error ); return; } - + csRef<iDocumentNode> root = doc->GetRoot(); if(!root) { @@ -887,32 +887,32 @@ return; } csRef<iDocumentNodeIterator> iter = topNode->GetNodes(); - + while ( iter->HasNext() ) { csRef<iDocumentNode> node = iter->Next(); - + csString raceName = node->GetAttributeValue( "name" ); - csString description = node->GetAttributeValue( "description" ); + csString description = node->GetAttributeValue( "description" ); csString maleModel = node->GetAttributeValue( "male" ); csString femaleModel = node->GetAttributeValue( "female" ); bool mavailable = node->GetAttributeValueAsBool("male_available"); bool favailable = node->GetAttributeValueAsBool("female_available"); - + RaceDefinition* race = new RaceDefinition; race->name = raceName; race->description = description; - race->startingCP = -1; + race->startingCP = -1; race->femaleModelName = femaleModel; race->maleModelName = maleModel; race->femaleAvailable = favailable; race->maleAvailable = mavailable; - - // defaults - race->FollowPos.Set(0,3,4); + + // defaults + race->FollowPos.Set(0,3,4); race->LookatPos.Set(0,2,0); race->FirstPos.Set(0,1.5,-.25); - + csRef<iDocumentNode> fp = node->GetNode("FollowPos"); if (fp) race->FollowPos.Set(fp->GetAttributeValueAsFloat("x"),fp->GetAttributeValueAsFloat("y"),fp->GetAttributeValueAsFloat("z")); @@ -930,17 +930,17 @@ // Load the default camera position in the custom carachter generator fp = node->GetNode("ViewerPos"); - if (fp) + if (fp) race->ViewerPos.Set(fp->GetAttributeValueAsFloat("x"),fp->GetAttributeValueAsFloat("y"),fp->GetAttributeValueAsFloat("z")); for ( int z = 0; z < PSTRAIT_LOCATION_COUNT; z++ ) { race->zoomLocations[z].Set( 0,0,0 ); - } - + } + fp = node->GetNode("FACEPOS"); - - if (fp) + + if (fp) race->zoomLocations[PSTRAIT_LOCATION_FACE].Set(fp->GetAttributeValueAsFloat("x"),fp->GetAttributeValueAsFloat("y"),fp->GetAttributeValueAsFloat("z")); @@ -953,15 +953,15 @@ { iDocumentSystem* xml = psengine->GetXMLParser (); iVFS* vfs = psengine->GetVFS (); - + csRef<iDataBuffer> buff = vfs->ReadFile( "/this/data/races/quickpaths.xml" ); if ( !buff || !buff->GetSize() ) { Error2( "Could not load XML: %s", "quickpaths.xml" ); - return; + return; } - + csRef<iDocument> doc = xml->CreateDocument(); const char* error = doc->Parse( buff ); if ( error ) @@ -969,7 +969,7 @@ Error3( "Error parsing XML file %s: %s", "quickpaths.xml", error ); return; } - + csRef<iDocumentNode> root = doc->GetRoot(); if(!root) { @@ -983,11 +983,11 @@ return; } csRef<iDocumentNodeIterator> iter = topNode->GetNodes(); - + while ( iter->HasNext() ) { csRef<iDocumentNode> node = iter->Next(); - + PathDefinition* path = new PathDefinition(); path->name = node->GetAttributeValue("name"); if ( path->name.IsEmpty() ) @@ -1017,7 +1017,7 @@ path->statBonuses.Push(bonus); } - //Load in all of the bonus skills + //Load in all of the bonus skills iter = node->GetNodes("SkillBonus"); while (iter->HasNext()) { @@ -1044,7 +1044,7 @@ } const char* psCreationManager::GetModelName( int race, int gender ) -{ +{ if ( (size_t)race < raceDescriptions.GetSize() && race >= 0 ) { if ( gender == PSCHARACTER_GENDER_NONE || @@ -1057,19 +1057,19 @@ return raceDescriptions[race]->femaleModelName; } } - + return NULL; -} - +} + void psCreationManager::GetParentData() { if ( !hasParentData ) { psCreationChoiceMsg outgoing(MSGTYPE_CHAR_CREATE_PARENTS); - outgoing.SendMessage(); - } + outgoing.SendMessage(); + } } void psCreationManager::GetChildhoodData() @@ -1077,8 +1077,8 @@ if ( !hasChildhoodData ) { psCreationChoiceMsg outgoing(MSGTYPE_CHAR_CREATE_CHILDHOOD); - outgoing.SendMessage(); - } + outgoing.SendMessage(); + } } void psCreationManager::GetLifeEventData() @@ -1086,7 +1086,7 @@ if ( !hasLifeEventData ) { psLifeEventMsg outgoing; - outgoing.SendMessage(); + outgoing.SendMessage(); } } @@ -1096,7 +1096,7 @@ { psCreationChoiceMsg outgoing(MSGTYPE_CHAR_CREATE_TRAITS); outgoing.SendMessage(); - } + } } @@ -1113,16 +1113,16 @@ if ( parentData[x].id == id ) return parentData[x].description; } - + for ( x = 0; x < childhoodData.GetSize(); x++ ) { if ( childhoodData[x].id == id ) return childhoodData[x].description; } - - + + return "None"; -} +} CreationChoice* psCreationManager::GetChoice( int id ) { @@ -1132,16 +1132,16 @@ if ( parentData[x].id == id ) return &parentData[x]; } - + for ( x = 0; x < childhoodData.GetSize(); x++ ) { if ( childhoodData[x].id == id ) return &childhoodData[x]; } - - + + return NULL; -} +} void psCreationManager::SetRace( int newRace ) { @@ -1153,7 +1153,7 @@ RaceDefinition* race = GetRace( selectedRace ); if ( !race ) return; - + csString firstname; csString lastname; @@ -1178,17 +1178,17 @@ lifeEventsMade, selectedFace, selectedHairStyle, selectedBeardStyle, selectedHairColour, selectedSkinColour, bio.GetDataSafe(), path.GetDataSafe() ); - upload.SendMessage(); + upload.SendMessage(); } void psCreationManager::SetName( const char* newName ) -{ - selectedName.Replace( newName ); +{ + selectedName.Replace( newName ); } csString psCreationManager::GetName() -{ - return selectedName; +{ + return selectedName; } @@ -1206,13 +1206,13 @@ void psCreationManager::AddChoice( int choice, int modifier ) -{ +{ if(!GetChoice(choice)) { Error2("Invalid creation choice: %i", choice); return; } - choicesMade.Push( choice ); + choicesMade.Push( choice ); currentCP-=GetCost( choice )*modifier; } @@ -1225,7 +1225,7 @@ { currentCP += GetCost( choicesMade[x] )*modifier; choicesMade.DeleteIndex(x); - + return; } } @@ -1242,7 +1242,7 @@ for ( size_t x = 0; x < lifeEventsMade.GetSize(); x++ ) { if ( lifeEventsMade[x] == event ) - { + { currentCP += GetLifeCost( event ); lifeEventsMade.DeleteIndex(x); return; @@ -1258,13 +1258,13 @@ if ( parentData[x].id == id ) return parentData[x].cpCost; } - + for ( x = 0; x < childhoodData.GetSize(); x++ ) { if ( childhoodData[x].id == id ) return childhoodData[x].cpCost; - } - + } + return -1; } @@ -1272,9 +1272,9 @@ { LifeEventChoice* life = FindLifeEvent( id ); if ( life != NULL ) - return life->cpCost; - - return 0; + return life->cpCost; + + return 0; } void psCreationManager::SetCustomization( int face, int hairStyle, int beardStyle, int hairColour, int skinColour ) @@ -1317,21 +1317,21 @@ return lifeEventData[n].description; } } - + return "None"; } bool psCreationManager::IsAvailable(int id, int gender) -{ +{ RaceDefinition* race = GetRace(id); if (!race) return false; - - if (gender==PSCHARACTER_GENDER_NONE) + + if (gender==PSCHARACTER_GENDER_NONE) return race->maleAvailable; //If neutral gender, check if male gender is available - else if (gender==PSCHARACTER_GENDER_FEMALE) + else if (gender==PSCHARACTER_GENDER_FEMALE) return race->femaleAvailable; - else if (gender==PSCHARACTER_GENDER_MALE) + else if (gender==PSCHARACTER_GENDER_MALE) return race->maleAvailable; return false; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <are...@us...> - 2009-01-07 23:52:00
|
Revision: 2841 http://planeshift.svn.sourceforge.net/planeshift/?rev=2841&view=rev Author: aresilek Date: 2009-01-07 23:51:53 +0000 (Wed, 07 Jan 2009) Log Message: ----------- - Fixed FS#2458 : Make NPCs face player when talking, patch by kougaro. Modified Paths: -------------- trunk/src/client/pscamera.cpp trunk/src/client/pscelclient.cpp trunk/src/client/pscelclient.h Modified: trunk/src/client/pscamera.cpp =================================================================== --- trunk/src/client/pscamera.cpp 2009-01-07 20:58:23 UTC (rev 2840) +++ trunk/src/client/pscamera.cpp 2009-01-07 23:51:53 UTC (rev 2841) @@ -232,10 +232,33 @@ // enable npc mode if the targeted npc is in talking distance if(GetCameraMode() != CAMERA_NPCTALK && actor->RangeTo(target, false) < NPC_MODE_DISTANCE) { + //rotate the target so that it faces the player + csVector3 playerPos = psengine->GetCelClient()->GetMainPlayer()->Pos(); + csVector3 targetPos = target->GetPosition(); + + csVector3 diff = playerPos - targetPos; + if (!diff.x) + diff.x = 0.00001F; // div/0 protect + + float angle = atan2(-diff.x,-diff.z); + + float npcrot = target->GetRotation(); + + GEMClientActor* targetActor = dynamic_cast<GEMClientActor*>(target); + + csVector3 velocity; + velocity = targetActor->GetVelocity(); + float velNormSquared = velocity.SquaredNorm(); + + + if((angle-npcrot) < 3.14159F && (angle-npcrot) > -3.14159F && velNormSquared == 0) + target->SetPosition(target->GetPosition(), angle, target->GetSector()); + + npcModeTarget = target; npcModePosition = actor->GetMesh()->GetMovable()->GetFullPosition(); - SetCameraMode(CAMERA_NPCTALK); - } + SetCameraMode(CAMERA_NPCTALK); + } return 0; } Modified: trunk/src/client/pscelclient.cpp =================================================================== --- trunk/src/client/pscelclient.cpp 2009-01-07 20:58:23 UTC (rev 2840) +++ trunk/src/client/pscelclient.cpp 2009-01-07 23:51:53 UTC (rev 2841) @@ -1165,6 +1165,13 @@ return pcmesh->GetMovable ()->GetFullPosition(); } +float GEMClientObject::GetRotation() +{ + // Rotation + csMatrix3 transf = pcmesh->GetMovable()->GetTransform().GetT2O(); + return psWorld::Matrix2YRot(transf); +} + iSector* GEMClientObject::GetSector() { if(pcmesh->GetMovable()->InSector()) Modified: trunk/src/client/pscelclient.h =================================================================== --- trunk/src/client/pscelclient.h 2009-01-07 20:58:23 UTC (rev 2840) +++ trunk/src/client/pscelclient.h 2009-01-07 23:51:53 UTC (rev 2841) @@ -317,6 +317,9 @@ /** Get position of entity */ virtual csVector3 GetPosition(); + /** Get rotation of entity */ + virtual float GetRotation(); + /** Get sector of entity */ virtual iSector* GetSector(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ko...@us...> - 2009-02-19 05:25:01
|
Revision: 3056 http://planeshift.svn.sourceforge.net/planeshift/?rev=3056&view=rev Author: kougaro Date: 2009-02-19 05:24:51 +0000 (Thu, 19 Feb 2009) Log Message: ----------- PS#2744 - Sound and ambient are now separate options, and fix to sound after the window lost focus. Patch by Loyni. Modified Paths: -------------- trunk/src/client/gui/pawsconfigsound.cpp trunk/src/client/iclient/isoundmngr.h trunk/src/client/psengine.cpp trunk/src/client/sound/pssoundmngr.cpp trunk/src/client/sound/pssoundmngr.h Modified: trunk/src/client/gui/pawsconfigsound.cpp =================================================================== --- trunk/src/client/gui/pawsconfigsound.cpp 2009-02-18 17:26:42 UTC (rev 3055) +++ trunk/src/client/gui/pawsconfigsound.cpp 2009-02-19 05:24:51 UTC (rev 3056) @@ -145,7 +145,7 @@ voicesVol->SetCurrentValue(pssnd->GetVoicesVolume()*100,false); actionsVol->SetCurrentValue(pssnd->GetActionsVolume()*100,false); - ambient->SetState(pssnd->PlayingSounds()); + ambient->SetState(pssnd->PlayingAmbient()); actions->SetState(pssnd->PlayingActions()); music->SetState(pssnd->PlayingMusic()); gui->SetState(PawsManager::GetSingleton().PlayingSounds()); @@ -267,7 +267,7 @@ dirty = true; if(wdg == ambient) { - psengine->GetSoundManager()->ToggleSounds(ambient->GetState()); + psengine->GetSoundManager()->ToggleAmbient(ambient->GetState()); return true; } else if(wdg == actions) @@ -319,7 +319,7 @@ void pawsConfigSound::Show() { - oldambient = psengine->GetSoundManager()->PlayingSounds(); + oldambient = psengine->GetSoundManager()->PlayingAmbient(); oldmusic = psengine->GetSoundManager()->PlayingMusic(); oldactions = psengine->GetSoundManager()->PlayingActions(); oldgui = PawsManager::GetSingleton().PlayingSounds(); @@ -339,7 +339,7 @@ { if(dirty) { - psengine->GetSoundManager()->ToggleSounds(oldambient); + psengine->GetSoundManager()->ToggleAmbient(oldambient); psengine->GetSoundManager()->ToggleActions(oldactions); psengine->GetSoundManager()->ToggleMusic(oldmusic); PawsManager::GetSingleton().ToggleSounds(oldgui); Modified: trunk/src/client/iclient/isoundmngr.h =================================================================== --- trunk/src/client/iclient/isoundmngr.h 2009-02-18 17:26:42 UTC (rev 3055) +++ trunk/src/client/iclient/isoundmngr.h 2009-02-19 05:24:51 UTC (rev 3056) @@ -130,7 +130,7 @@ virtual void ToggleMusic(bool toggle) = 0; /// Set whether ambient sounds will actually be played or not. - virtual void ToggleSounds(bool toggle) = 0; + virtual void ToggleAmbient(bool toggle) = 0; /// Set whether actions sounds will actually be played or not. virtual void ToggleActions(bool toggle) = 0; @@ -151,7 +151,7 @@ virtual bool PlayingMusic() = 0; /// This returns if we are playing ambient sounds as a setting or not - virtual bool PlayingSounds() = 0; + virtual bool PlayingAmbient() = 0; /// This returns if we are playing actions sounds as a setting or not virtual bool PlayingActions() = 0; Modified: trunk/src/client/psengine.cpp =================================================================== --- trunk/src/client/psengine.cpp 2009-02-18 17:26:42 UTC (rev 3055) +++ trunk/src/client/psengine.cpp 2009-02-19 05:24:51 UTC (rev 3056) @@ -1028,7 +1028,7 @@ void psEngine::MuteAllSounds(void) { - GetSoundManager()->ToggleSounds(false); + GetSoundManager()->ToggleAmbient(false); GetSoundManager()->ToggleMusic(false); GetSoundManager()->ToggleActions(false); GetSoundManager()->ToggleGUI(false); @@ -1554,7 +1554,7 @@ // load and apply the settings optionNode = mainNode->GetNode("ambient"); if (optionNode != NULL) - GetSoundManager()->ToggleSounds(optionNode->GetAttributeValueAsBool("on",true)); + GetSoundManager()->ToggleAmbient(optionNode->GetAttributeValueAsBool("on",true)); optionNode = mainNode->GetNode("actions"); if (optionNode != NULL) Modified: trunk/src/client/sound/pssoundmngr.cpp =================================================================== --- trunk/src/client/sound/pssoundmngr.cpp 2009-02-18 17:26:42 UTC (rev 3055) +++ trunk/src/client/sound/pssoundmngr.cpp 2009-02-19 05:24:51 UTC (rev 3056) @@ -65,6 +65,13 @@ soundEnabled = true; musicEnabled = true; + ambientEnabled = true; + actionsEnabled = true; + guiEnabled = true; + voicesEnabled = true; + loopBGM = true; + combatMusicEnabled = true; + musicCombat = false; musicVolume = 1.0; @@ -234,7 +241,7 @@ csRef<iSndSysSource> psSoundManager::StartAmbientSound(const char* name,bool loop) { - if(soundEnabled) + if(ambientEnabled) return StartSound(name,ambientVolume,loop); else return NULL; @@ -505,15 +512,15 @@ mapSoundSystem->EnableMusic( musicEnabled ); } -void psSoundManager::ToggleSounds(bool toggle) +void psSoundManager::ToggleAmbient(bool toggle) { if (!soundSystem) return; - // Enable Sounds + // Enable Ambient Sounds if (toggle) { - soundEnabled = true; + ambientEnabled = true; if ( currentSoundSector ) { int weather = currentSoundSector->GetWeather(); @@ -524,12 +531,12 @@ // Disable Sounds } else { - soundEnabled = false; + ambientEnabled = false; if ( currentSoundSector ) currentSoundSector->StopSounds( ); if ( lastSoundSector ) lastSoundSector->StopSounds(); } - mapSoundSystem->EnableSounds( soundEnabled ); + mapSoundSystem->EnableSounds( ambientEnabled ); } void psSoundManager::ToggleActions(bool toggle) @@ -802,7 +809,7 @@ if ( currentSoundSector ) { currentSoundSector->Music(musicEnabled); - currentSoundSector->Sounds(soundEnabled); + currentSoundSector->Sounds(ambientEnabled); } @@ -1916,7 +1923,7 @@ // Same weather and is not playing? if(MatchWeather(weather) && !mapSystem->FindSameActiveAmbient(this)) { - if( mapSystem->sndmngr->PlayingSounds() ) + if( mapSystem->sndmngr->PlayingAmbient() ) { mapSystem->RegisterActiveAmbient(this); // We're playing this now StartFade(FADE_UP); // PLAY! Modified: trunk/src/client/sound/pssoundmngr.h =================================================================== --- trunk/src/client/sound/pssoundmngr.h 2009-02-18 17:26:42 UTC (rev 3055) +++ trunk/src/client/sound/pssoundmngr.h 2009-02-19 05:24:51 UTC (rev 3056) @@ -138,7 +138,7 @@ void FadeSectorSounds( Fade_Direction dir ); virtual void ToggleMusic(bool toggle); - virtual void ToggleSounds(bool toggle); + virtual void ToggleAmbient(bool toggle); virtual void ToggleActions(bool toggle); virtual void ToggleGUI(bool toggle); virtual void ToggleVoices(bool toggle); @@ -146,7 +146,7 @@ virtual void ToggleCombatMusic(bool toggle); virtual bool PlayingMusic() {return musicEnabled;} - virtual bool PlayingSounds() {return soundEnabled;} + virtual bool PlayingAmbient() {return ambientEnabled;} virtual bool PlayingActions() {return actionsEnabled;} virtual bool PlayingGUI() {return guiEnabled;} virtual bool PlayingVoices() {return voicesEnabled;} @@ -214,6 +214,7 @@ bool soundEnabled; bool musicEnabled; + bool ambientEnabled; bool actionsEnabled; bool guiEnabled; bool voicesEnabled; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ko...@us...> - 2009-03-10 05:17:34
|
Revision: 3166 http://planeshift.svn.sourceforge.net/planeshift/?rev=3166&view=rev Author: kougaro Date: 2009-03-10 05:17:09 +0000 (Tue, 10 Mar 2009) Log Message: ----------- Fix loss of target using /slide or /rotate, the client now updates the item instead of deleting it and making a new one Modified Paths: -------------- trunk/src/client/pscelclient.cpp trunk/src/client/pscelclient.h Modified: trunk/src/client/pscelclient.cpp =================================================================== --- trunk/src/client/pscelclient.cpp 2009-03-10 00:54:11 UTC (rev 3165) +++ trunk/src/client/pscelclient.cpp 2009-03-10 05:17:09 UTC (rev 3166) @@ -359,13 +359,14 @@ { psPersistItem mesg( me ); - // We already have an entity with this id so we must have missed the remove object message - // so delete and remake it. + // We already have an entity with this id, updating the item GEMClientObject *found = (GEMClientObject*) FindObject(mesg.eid); - if(found) + GEMClientItem *foundItem = dynamic_cast<GEMClientItem*>(found); + if(foundItem) { - Debug3(LOG_CELPERSIST, 0, "Found existing item<%s> object with %s, removing.\n", found->GetName(), ShowID(mesg.eid)); - RemoveObject(found); + Debug3(LOG_CELPERSIST, 0, "Found existing item<%s> object with %s, updating.\n", found->GetName(), ShowID(mesg.eid)); + foundItem->UpdateItem( mesg ); + return; } GEMClientItem* newItem = new GEMClientItem( this, mesg ); @@ -1866,6 +1867,20 @@ cel->GetShadowManager()->CreateShadow(this); } +void GEMClientItem::UpdateItem( psPersistItem& mesg ) +{ + name = mesg.name; + Debug3(LOG_CELPERSIST, 0, "Item %s(%s) Updated", mesg.name.GetData(), ShowID(mesg.eid)); + pos = mesg.pos; + xRot = mesg.xRot; + yRot = mesg.yRot; + zRot = mesg.zRot; + sector = mesg.sector; + flags = mesg.flags; + + PostLoad(); +} + GEMClientActionLocation::GEMClientActionLocation( psCelClient* cel, psPersistActionLocation& mesg ) : GEMClientObject(cel, mesg.eid) { Modified: trunk/src/client/pscelclient.h =================================================================== --- trunk/src/client/pscelclient.h 2009-03-10 00:54:11 UTC (rev 3165) +++ trunk/src/client/pscelclient.h 2009-03-10 05:17:09 UTC (rev 3166) @@ -558,6 +558,8 @@ virtual ~GEMClientItem(); virtual GEMOBJECT_TYPE GetObjectType() { return GEM_ITEM; } + + void UpdateItem( psPersistItem& mesg ); protected: virtual void PostLoad(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mg...@us...> - 2009-03-14 09:17:07
|
Revision: 3203 http://planeshift.svn.sourceforge.net/planeshift/?rev=3203&view=rev Author: mgist Date: 2009-03-14 09:16:57 +0000 (Sat, 14 Mar 2009) Log Message: ----------- - Removed old files. Removed Paths: ------------- trunk/src/client/clientcachemanager.cpp trunk/src/client/clientcachemanager.h Deleted: trunk/src/client/clientcachemanager.cpp =================================================================== --- trunk/src/client/clientcachemanager.cpp 2009-03-14 08:39:18 UTC (rev 3202) +++ trunk/src/client/clientcachemanager.cpp 2009-03-14 09:16:57 UTC (rev 3203) @@ -1,217 +0,0 @@ -/* - * ClientCacheManager.cpp - * - * Copyright (C) 2004 Atomic Blue (in...@pl..., http://www.atomicblue.org) - * - * - * 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 the Free Software Foundation (version 2 of the License) - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - */ -#include <psconfig.h> -//============================================================================= -// Crystal Space Includes -//============================================================================= -#include <iengine/collection.h> -#include <iengine/engine.h> -#include <iengine/mesh.h> -#include <imap/loader.h> - -//============================================================================= -// Project Includes -//============================================================================= -#include "util/psxmlparser.h" - -#include "engine/loader.h" -#include "engine/psworld.h" - -//============================================================================= -// Local Includes -//============================================================================= -#include "clientcachemanager.h" -#include "globals.h" - -ClientCacheManager::ClientCacheManager() -{ - cache = psengine->GetEngine()->CreateCollection("psclientcache"); - stringset = csQueryRegistryTagInterface<iStringSet>(psengine->GetObjectRegistry(), - "crystalspace.shared.stringset"); -} - -ClientCacheManager::~ClientCacheManager() -{ - psengine->GetEngine()->RemoveCollection(cache); -} - -FactoryIndexEntry* ClientCacheManager::LoadNewFactory(const char* filename) -{ - csString file = filename; - - // Check if the file exists - if (!psengine->GetVFS()->Exists(filename)) - { - Error2("Couldn't find file %s",filename); - return NULL; - } - - csRef<iDocument> doc = ParseFile(psengine->GetObjectRegistry(),filename); - if (!doc) - { - Error2("Couldn't parse file %s",filename); - return NULL; - } - - csRef<iDocumentNode> root = doc->GetRoot(); - if (!root) - { - Error2("The file(%s) doesn't have a root",filename); - return NULL; - } - - csRef<iDocumentNode> meshNode; - csRef<iDocumentNode> libNode = root->GetNode("library"); - if (libNode) - meshNode = libNode->GetNode("meshfact"); - else - meshNode = root->GetNode("meshfact"); - if (!meshNode) - { - Error2("The file(%s) doesn't have a meshfact or library node", filename); - return NULL; - } - - csRef<FactoryIndexEntry> indexEntry; - indexEntry.AttachNew(new FactoryIndexEntry); - indexEntry->factname = meshNode->GetAttributeValue("name"); - - if(!indexEntry->factname) - { - Error2("The mesh with file %s doesn't have a factory name. This is very bad!", filename); - return NULL; - } - - indexEntry->filename = filename; - indexEntry->factory = NULL; - factIndex.Put(stringset->Request(filename), indexEntry); - - // Check if it's already loaded. - iMeshFactoryWrapper* meshW = psengine->GetEngine()->GetMeshFactories()->FindByName(indexEntry->factname); - if (meshW) - { - indexEntry->factory = meshW; - cache->Add(meshW->QueryObject()); - } - - if (!indexEntry->factory.IsValid()) - { - if(file.Find(".cal3d") != (size_t)-1) - { - if(!(psengine->GetGFXFeatures() & useAdvancedShaders)) - { - csRef<iDocumentNode> texNode = libNode->GetNode("textures"); - csRef<iDocumentNodeIterator> textures = texNode->GetNodes(); - while(textures->HasNext()) - { - csRef<iDocumentNode> texture = textures->Next(); - csRef<iDocumentNode> classNode = texture->GetNode("class"); - if(classNode) - { - csString texClass(classNode->GetContentsValue()); - if(texClass.Compare("normalmap")) - { - texNode->RemoveNode(texture); - } - } - } - csRef<iDocumentNode> matNode = libNode->GetNode("materials"); - csRef<iDocumentNodeIterator> materials = matNode->GetNodes(); - while(materials->HasNext()) - { - csRef<iDocumentNode> material = materials->Next(); - material->RemoveNodes(material->GetNodes("shadervar")); - csRef<iDocumentNodeIterator> shaders = material->GetNodes("shader"); - while(shaders->HasNext()) - { - material->RemoveNode(shaders->Next()); - } - } - } - } - - indexEntry->result = Loader::GetSingleton().GetLoader()->LoadNode(root, cache); - } - - return indexEntry; -} - -void ClientCacheManager::Precache() -{ - psengine->GetEngine()->PrecacheDraw(cache); -} - -FactoryIndexEntry* ClientCacheManager::GetFactoryEntry(const char* filename) -{ - // Search for a factory entry with the filename we've passed. - FactoryIndexEntry* indexEntry = factIndex.Get(stringset->Request(filename), NULL); - - bool checked = false; - while(true) - { - // If the factory entry exists... - if (indexEntry) - { - CS_ASSERT_MSG("Factory index != filename", indexEntry->filename == filename); - - // If it's loaded then we can return it. - if(indexEntry->factory) - { - // Disable decals on all movable meshes. Make more specific if/when we need this and it works. - indexEntry->factory->GetFlags().Set(CS_ENTITY_NODECAL); - return indexEntry; - } - else if(indexEntry->result->IsFinished()) - { - if(indexEntry->result->WasSuccessful()) - { - indexEntry->factory = cache->FindMeshFactory(indexEntry->factname); - } - else - { - // Something bad happened (probably a data problem). - csString msg; - msg.Format("Factory Entry %s failed to load!", filename); - CS_ASSERT_MSG(msg.GetData(), false); - } - } - else - { - // Try again later. - return NULL; - } - } - - if(checked) - { - // Try again later. - return NULL; - } - - // No such factory entry exists.. so create a new one. - indexEntry = LoadNewFactory(filename); - checked = true; - } - - // It looks like something bad happened. This should be caught before now.. so bail out screaming! - csString msg; - msg.Format("Factory Entry %s failed to load!", filename); - CS_ASSERT_MSG(msg.GetData(), false); - return NULL; -} Deleted: trunk/src/client/clientcachemanager.h =================================================================== --- trunk/src/client/clientcachemanager.h 2009-03-14 08:39:18 UTC (rev 3202) +++ trunk/src/client/clientcachemanager.h 2009-03-14 09:16:57 UTC (rev 3203) @@ -1,86 +0,0 @@ -/* - * ClientCacheManager.h - * - * Copyright (C) 2004 Atomic Blue (in...@pl..., http://www.atomicblue.org) - * - * - * 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 the Free Software Foundation (version 2 of the License) - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - */ - -#ifndef CLIENT_CACHE_MANAGER_HEADER -#define CLIENT_CACHE_MANAGER_HEADER - -//============================================================================= -// Crystal Space Includes -//============================================================================= -#include <csutil/hash.h> -#include <iutil/threadmanager.h> - -//============================================================================= -// Project Includes -//============================================================================= - -//============================================================================= -// Local Includes -//============================================================================= -#include "globals.h" - -struct iCollection; - -/** Holds details on a mesh factory. */ -struct FactoryIndexEntry : public csRefCount -{ - csString filename; - csString factname; - csRef<iMeshFactoryWrapper> factory; - csRef<iThreadReturn> result; -}; - -//----------------------------------------------------------------------------- - -/** Used to cache in the model files at startup. - * This is used to load all the model factories at startup so all loading is - * in one place and doesn't cause big pauses in the middle of the game - * session. - */ -class ClientCacheManager -{ -public: - ClientCacheManager(); - ~ClientCacheManager(); - - /** Checks the cache list for a particular factory. - * @param filename The model file that we want to get. - * @return The structure for this file if found. NULL otherwise. - */ - FactoryIndexEntry* GetFactoryEntry(const char* filename); - - /** - * Calls iEngine::PrecacheDraw on the collection. - */ - void Precache(); - -private: - - /** Loads a new model factory. - * @param filename The VFS file name of the model file to load. - * @param old Use the old functionallity (compatibility). - */ - FactoryIndexEntry* LoadNewFactory(const char* filename); - - csRef<iCollection> cache; - csRef<iStringSet> stringset; - csHash<csRef<FactoryIndexEntry>, csStringID> factIndex; -}; - -#endif This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <Ven...@us...> - 2009-03-25 06:53:17
|
Revision: 3305 http://planeshift.svn.sourceforge.net/planeshift/?rev=3305&view=rev Author: Vengeance2001 Date: 2009-03-25 06:53:07 +0000 (Wed, 25 Mar 2009) Log Message: ----------- Step 1 of supporting multiple voicing files for one response is to allow queueing and sequencing of the files. This commit does that and demos it by playing any voice file twice in a row. This commit along with a CS fix also should fix the memory leaks for sounds, where sound streams were constantly being added but never removed in the OpenAL renderer. Modified Paths: -------------- trunk/src/client/modehandler.cpp trunk/src/client/sound/pssoundmngr.cpp trunk/src/client/sound/pssoundmngr.h Modified: trunk/src/client/modehandler.cpp =================================================================== --- trunk/src/client/modehandler.cpp 2009-03-25 00:40:29 UTC (rev 3304) +++ trunk/src/client/modehandler.cpp 2009-03-25 06:53:07 UTC (rev 3305) @@ -2155,7 +2155,8 @@ else // does exist, and we're done { printf("Yes, it is cached already. Playing immediately.\n"); - soundmanager->StartVoiceSound(fname.GetData()); + soundmanager->StartVoiceSound(fname.GetData()); + soundmanager->StartVoiceSound(fname.GetData()); } } else @@ -2168,7 +2169,8 @@ return; } // Play sound file - soundmanager->StartVoiceSound(fname.GetData()); + soundmanager->StartVoiceSound(fname.GetData()); + soundmanager->StartVoiceSound(fname.GetData()); } } } Modified: trunk/src/client/sound/pssoundmngr.cpp =================================================================== --- trunk/src/client/sound/pssoundmngr.cpp 2009-03-25 00:40:29 UTC (rev 3304) +++ trunk/src/client/sound/pssoundmngr.cpp 2009-03-25 06:53:07 UTC (rev 3305) @@ -156,7 +156,18 @@ void psSoundManager::SourceRemoveNotification(iSndSysSource *pSource) { - printf("SourceAdd Notification\n"); + printf("SourceRemove Notification\n"); + if (currentVoiceSource && currentVoiceSource == pSource) + { + printf("Voice file ended. Checking for another.\n"); + voicingQueue.DeleteIndex(0); + + if (voicingQueue.GetSize() > 0) + { + printf("Playing next voice file.\n"); + currentVoiceSource = StartSound(voicingQueue.Get(0),voicesVolume,false); + } + } } @@ -259,7 +270,7 @@ csRef<iSndSysSource> psSoundManager::StartMusicSound(const char* name,bool loop) { - if(musicEnabled) + if (musicEnabled) return StartSound(name,musicVolume,loop); else return NULL; @@ -267,7 +278,7 @@ csRef<iSndSysSource> psSoundManager::StartAmbientSound(const char* name,bool loop) { - if(ambientEnabled) + if (ambientEnabled) return StartSound(name,ambientVolume,loop); else return NULL; @@ -275,7 +286,7 @@ csRef<iSndSysSource> psSoundManager::StartGUISound(const char* name,bool loop) { - if(guiEnabled) + if (guiEnabled) return StartSound(name,guiVolume,loop); else return NULL; @@ -283,10 +294,20 @@ csRef<iSndSysSource> psSoundManager::StartVoiceSound(const char* name,bool loop) { - if(voicesEnabled) - return StartSound(name,voicesVolume,loop); - else - return NULL; + if (!voicesEnabled) + return NULL; + + voicingQueue.Push(name); + + if (voicingQueue.GetSize() == 1) // this is the only voice file + { + currentVoiceSource = StartSound(name,voicesVolume,loop); + return currentVoiceSource; + } + else + { + return NULL; + } } csRef<iSndSysSource> psSoundManager::StartActionsSound(const char* name,bool loop) Modified: trunk/src/client/sound/pssoundmngr.h =================================================================== --- trunk/src/client/sound/pssoundmngr.h 2009-03-25 00:40:29 UTC (rev 3304) +++ trunk/src/client/sound/pssoundmngr.h 2009-03-25 06:53:07 UTC (rev 3305) @@ -28,6 +28,7 @@ #include <csutil/sysfunc.h> #include <csutil/ref.h> #include <csutil/parray.h> +#include <csutil/stringarray.h> #include <iutil/comp.h> #include "util/prb.h" #include "csutil/hash.h" @@ -218,8 +219,14 @@ private: csRef<iConfigManager> cfgmgr; + /// This array holds the currently playing voice file, plus any in queue, in order. + csStringArray voicingQueue; - bool soundEnabled; + /// This reference holds the current source, so the callback can know when to play the next voice + /// while other sounds are playing. + csRef<iSndSysSource> currentVoiceSource; + + bool soundEnabled; bool musicEnabled; bool ambientEnabled; bool actionsEnabled; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mg...@us...> - 2009-04-09 15:44:54
|
Revision: 3426 http://planeshift.svn.sourceforge.net/planeshift/?rev=3426&view=rev Author: mgist Date: 2009-04-09 15:44:40 +0000 (Thu, 09 Apr 2009) Log Message: ----------- - Set nodecal flag on mesh instead of meshfact. Modified Paths: -------------- trunk/src/client/charapp.cpp trunk/src/client/pscelclient.cpp Modified: trunk/src/client/charapp.cpp =================================================================== --- trunk/src/client/charapp.cpp 2009-04-09 15:26:21 UTC (rev 3425) +++ trunk/src/client/charapp.cpp 2009-04-09 15:44:40 UTC (rev 3426) @@ -509,6 +509,7 @@ void psCharAppearance::ProcessAttach(csRef<iMeshFactoryWrapper> factory, const char* meshFactName, csRef<iSpriteCal3DSocket> socket) { csRef<iMeshWrapper> meshWrap = engine->CreateMeshWrapper( factory, meshFactName ); + meshWrap->GetFlags().Set(CS_ENTITY_NODECAL); const char* socketName = socket->GetName(); // Given a socket name of "righthand", we're looking for a key in the form of "socket_righthand" @@ -565,7 +566,6 @@ csRef<iMeshFactoryWrapper> factory = Loader::GetSingleton().LoadFactory(attach.factName); if(factory.IsValid()) { - factory->GetFlags().Set(CS_ENTITY_NODECAL); ProcessAttach(factory, attach.factName, attach.socket); delayedAttach.PopFront(); } Modified: trunk/src/client/pscelclient.cpp =================================================================== --- trunk/src/client/pscelclient.cpp 2009-04-09 15:26:21 UTC (rev 3425) +++ trunk/src/client/pscelclient.cpp 2009-04-09 15:44:40 UTC (rev 3426) @@ -1206,7 +1206,6 @@ if(!nullmesh) { nullmesh = psengine->GetEngine()->CreateMeshFactory("crystalspace.mesh.object.null", "nullmesh"); - nullmesh->GetFlags().Set(CS_ENTITY_NODECAL); csRef<iNullFactoryState> nullstate = scfQueryInterface<iNullFactoryState> (nullmesh->GetMeshObjectFactory()); csBox3 bbox; bbox.AddBoundingVertex(csVector3(0.0f)); @@ -1214,6 +1213,7 @@ } pcmesh = psengine->GetEngine()->CreateMeshWrapper(nullmesh, name); + pcmesh->GetFlags().Set(CS_ENTITY_NODECAL); cel->AttachObject(pcmesh->QueryObject(), this); hasShadow = false; @@ -1251,8 +1251,8 @@ return; } - factory->GetFlags().Set(CS_ENTITY_NODECAL); pcmesh = factory->CreateMeshWrapper(); + pcmesh->GetFlags().Set(CS_ENTITY_NODECAL); psengine->GetEngine()->GetMeshes()->Add(pcmesh); if (!pcmesh) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <Kha...@us...> - 2009-04-29 00:10:57
|
Revision: 3589 http://planeshift.svn.sourceforge.net/planeshift/?rev=3589&view=rev Author: KhakiLord Date: 2009-04-29 00:10:41 +0000 (Wed, 29 Apr 2009) Log Message: ----------- Fixed tellnpcinternal appearing in chat and some small memory leaks. Modified Paths: -------------- trunk/src/client/cmdutil.cpp trunk/src/client/gui/chatwindow.cpp Modified: trunk/src/client/cmdutil.cpp =================================================================== --- trunk/src/client/cmdutil.cpp 2009-04-28 21:12:34 UTC (rev 3588) +++ trunk/src/client/cmdutil.cpp 2009-04-29 00:10:41 UTC (rev 3589) @@ -114,15 +114,15 @@ } else if (words[0] == "/confirm") { - csString errorString; + static csString errorString; HandleConfirm( words, errorString ); - return errorString.Detach(); + return errorString; } else if (words[0] == "/ping") { - csString temp; + static csString temp; temp.Format("Average Ping time: %i", msgqueue->GetPing()); - return temp.Detach(); + return temp; } else if (words[0] == "/screenshot") { Modified: trunk/src/client/gui/chatwindow.cpp =================================================================== --- trunk/src/client/gui/chatwindow.cpp 2009-04-28 21:12:34 UTC (rev 3588) +++ trunk/src/client/gui/chatwindow.cpp 2009-04-29 00:10:41 UTC (rev 3589) @@ -390,6 +390,9 @@ WordArray words(cmd); csString pPerson; csString text; + + // Used to hold error message between calls + static csString error; int chattype = 0; if (words.GetCount()==0) @@ -404,15 +407,17 @@ else { if (words.GetCount() == 1) - return PawsManager::GetSingleton().Translate("You must enter the text").Detach(); + { + error = PawsManager::GetSingleton().Translate("You must enter the text"); + return error; + } - inputText->SetText(words[0] + " "); + if (words[0] == "/say") { pPerson.Clear(); words.GetTail(1, text); chattype = CHAT_SAY; - inputText->SetText(""); DetermineChatTabAndSelect(CHAT_SAY); } else if (words[0] == "/tellnpcinternal") @@ -429,6 +434,7 @@ pPerson.Clear(); words.GetTail(1, text); chattype = CHAT_NPC; + inputText->SetText(words[0] + " "); DetermineChatTabAndSelect(CHAT_NPC); } else if (words[0] == "/report") @@ -436,6 +442,7 @@ pPerson.Clear(); words.GetTail(1,text); chattype = CHAT_REPORT; + inputText->SetText(words[0] + " "); DetermineChatTabAndSelect(CHAT_REPORT); } else if (words[0] == "/guild") @@ -443,6 +450,7 @@ pPerson.Clear(); words.GetTail(1,text); chattype = CHAT_GUILD; + inputText->SetText(words[0] + " "); DetermineChatTabAndSelect(CHAT_GUILD); } else if (words[0] == "/shout") @@ -450,6 +458,7 @@ pPerson.Clear(); words.GetTail(1,text); chattype = CHAT_SHOUT; + inputText->SetText(words[0] + " "); DetermineChatTabAndSelect(CHAT_SHOUT); } else if (words[0] == "/group") @@ -457,15 +466,20 @@ pPerson.Clear(); words.GetTail(1,text); chattype = CHAT_GROUP; + inputText->SetText(words[0] + " "); DetermineChatTabAndSelect(CHAT_GROUP); } else if (words[0] == "/tell") { pPerson = words[1]; if (words.GetCount() == 2) - return PawsManager::GetSingleton().Translate("You must enter the text").Detach(); + { + error = PawsManager::GetSingleton().Translate("You must enter the text"); + return error; + } words.GetTail(2,text); chattype = CHAT_TELL; + inputText->SetText(words[0] + " "); DetermineChatTabAndSelect(CHAT_TELL); } else if (words[0] == "/auction") @@ -473,6 +487,7 @@ pPerson.Clear(); words.GetTail(1,text); chattype = CHAT_AUCTION; + inputText->SetText(words[0] + " "); DetermineChatTabAndSelect(CHAT_AUCTION); } else if (words[0] == "/mypet") @@ -480,6 +495,7 @@ pPerson.Clear(); chattype = CHAT_PET_ACTION; words.GetTail(1,text); + inputText->SetText(words[0] + " "); DetermineChatTabAndSelect(CHAT_PET_ACTION); } else if (words[0] == "/me" || words[0] == "/my") @@ -533,8 +549,6 @@ DetermineChatTabAndSelect(CHAT_SAY); } } - else - inputText->SetText(""); } if (settings.enableBadWordsFilterOutgoing) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ko...@us...> - 2009-05-17 01:14:31
|
Revision: 3706 http://planeshift.svn.sourceforge.net/planeshift/?rev=3706&view=rev Author: kougaro Date: 2009-05-17 00:13:35 +0000 (Sun, 17 May 2009) Log Message: ----------- Reworked the code for npc rotating when you talk to them, corrects a crash and makes the npc rotates correctly, hopefully Modified Paths: -------------- trunk/src/client/pscamera.cpp trunk/src/client/pscamera.h trunk/src/client/psclientchar.cpp trunk/src/client/psclientchar.h Modified: trunk/src/client/pscamera.cpp =================================================================== --- trunk/src/client/pscamera.cpp 2009-05-17 00:10:31 UTC (rev 3705) +++ trunk/src/client/pscamera.cpp 2009-05-17 00:13:35 UTC (rev 3706) @@ -245,20 +245,17 @@ if (!diff.x) diff.x = 0.00001F; // div/0 protect - float angle = atan2(-diff.x,-diff.z); + float angle = atan2(diff.z,diff.x); float npcrot = target->GetRotation(); GEMClientActor* targetActor = dynamic_cast<GEMClientActor*>(target); - csVector3 velocity; - velocity = targetActor->GetVelocity(); - float velNormSquared = velocity.SquaredNorm(); - - + float velNormSquared = targetActor->GetVelocity().SquaredNorm(); + if((angle-npcrot) < PI && (angle-npcrot) > -PI && velNormSquared == 0) { - psengine->GetCharManager()->StoreTarget(); + npcOldRot = npcrot; target->SetPosition(target->GetPosition(), angle, target->GetSector()); } @@ -1434,7 +1431,7 @@ psClientCharManager* clientChar = psengine->GetCharManager(); if (npcModeTarget != clientChar->GetTarget() || npcModePosition != actor->GetMesh()->GetMovable()->GetFullPosition()) { - clientChar->GetTargetStored()->SetPosition(clientChar->GetTargetStored()->GetPosition(), clientChar->GetOldRot(), clientChar->GetTargetStored()->GetSector()); + npcModeTarget->SetPosition(npcModeTarget->GetPosition(), npcOldRot, npcModeTarget->GetSector()); SetCameraMode(lastCameraMode); break; } Modified: trunk/src/client/pscamera.h =================================================================== --- trunk/src/client/pscamera.h 2009-05-17 00:10:31 UTC (rev 3705) +++ trunk/src/client/pscamera.h 2009-05-17 00:13:35 UTC (rev 3706) @@ -669,6 +669,7 @@ GEMClientObject* npcModeTarget; csVector3 npcModePosition; + float npcOldRot; int fixedDistClip; }; Modified: trunk/src/client/psclientchar.cpp =================================================================== --- trunk/src/client/psclientchar.cpp 2009-05-17 00:10:31 UTC (rev 3705) +++ trunk/src/client/psclientchar.cpp 2009-05-17 00:13:35 UTC (rev 3706) @@ -383,12 +383,6 @@ Error1("Received psUserActionMessage for invalid object."); } -void psClientCharManager::StoreTarget() -{ - targetStored = target; - rotStored = targetStored->GetRotation(); -} - void psClientCharManager::HandlePlaySound( MsgEntry* me ) { csRef<iSoundManager> soundmanager = psengine->GetSoundManager(); Modified: trunk/src/client/psclientchar.h =================================================================== --- trunk/src/client/psclientchar.h 2009-05-17 00:10:31 UTC (rev 3705) +++ trunk/src/client/psclientchar.h 2009-05-17 00:13:35 UTC (rev 3706) @@ -107,16 +107,7 @@ * @return the target. */ GEMClientObject * GetTarget() { return target; }; - - /// Get the old target - GEMClientObject * GetTargetStored() { return targetStored; }; - ///get the old rotation - float GetOldRot() { return rotStored; }; - - /// Store the target in targetStored and its rotation into targetOldRot - void StoreTarget(); - protected: /// Change a trait on a character. void ChangeTrait( MsgEntry* me ); @@ -152,12 +143,6 @@ /// keeps track of what object you have targetted GEMClientObject * target; - /// previous target (for npccamera) - GEMClientObject * targetStored; - - ///previous rotation (for npccamera) - float rotStored; - psCelClient *cel; bool ready; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mg...@us...> - 2009-05-17 09:32:11
|
Revision: 3718 http://planeshift.svn.sourceforge.net/planeshift/?rev=3718&view=rev Author: mgist Date: 2009-05-17 09:32:03 +0000 (Sun, 17 May 2009) Log Message: ----------- - Fixes for loader plugin change. Modified Paths: -------------- trunk/src/client/charapp.cpp trunk/src/client/iclient/ibgloader.h trunk/src/client/pscamera.cpp trunk/src/client/psengine.cpp trunk/src/client/psengine.h trunk/src/client/zonehandler.cpp Modified: trunk/src/client/charapp.cpp =================================================================== --- trunk/src/client/charapp.cpp 2009-05-17 09:12:20 UTC (rev 3717) +++ trunk/src/client/charapp.cpp 2009-05-17 09:32:03 UTC (rev 3718) @@ -14,11 +14,11 @@ //============================================================================= // Project Includes //============================================================================= +#include "iclient/ibgloader.h" #include "util/log.h" #include "util/psstring.h" #include "effects/pseffect.h" #include "effects/pseffectmanager.h" -#include "engine/loader.h" //============================================================================= // Local Includes @@ -420,7 +420,7 @@ csString materialNameParsed = ParseStrings(part, materialName); bool failed = false; - csRef<iMaterialWrapper> material = Loader::GetSingleton().LoadMaterial(materialNameParsed, &failed); + csRef<iMaterialWrapper> material = psengine->GetLoader()->LoadMaterial(materialNameParsed, &failed); if(!failed) { if(!material.IsValid()) @@ -486,7 +486,7 @@ return false; } - csRef<iMeshFactoryWrapper> factory = Loader::GetSingleton().LoadFactory(meshFactName); + csRef<iMeshFactoryWrapper> factory = psengine->GetLoader()->LoadFactory(meshFactName); if(!factory.IsValid()) { Attachment attach(true); @@ -563,7 +563,7 @@ if(attach.factory) { - csRef<iMeshFactoryWrapper> factory = Loader::GetSingleton().LoadFactory(attach.factName); + csRef<iMeshFactoryWrapper> factory = psengine->GetLoader()->LoadFactory(attach.factName); if(factory.IsValid()) { ProcessAttach(factory, attach.factName, attach.socket); @@ -572,7 +572,7 @@ } else { - csRef<iMaterialWrapper> material = Loader::GetSingleton().LoadMaterial(attach.materialName); + csRef<iMaterialWrapper> material = psengine->GetLoader()->LoadMaterial(attach.materialName); if(material.IsValid()) { ProcessAttach(material, attach.materialName, attach.partName); Modified: trunk/src/client/iclient/ibgloader.h =================================================================== --- trunk/src/client/iclient/ibgloader.h 2009-05-17 09:12:20 UTC (rev 3717) +++ trunk/src/client/iclient/ibgloader.h 2009-05-17 09:32:03 UTC (rev 3718) @@ -25,16 +25,16 @@ class csVector3; struct iObjectRegistry; -struct iBgLoader +struct iBgLoader : public iBase { SCF_INTERFACE(iBgLoader, 1, 0, 0); - virtual void Setup(iObjectRegistry* _object_reg, uint gfxFeatures, float loadRange) = 0; + virtual void Setup(uint gfxFeatures, float loadRange) = 0; virtual csPtr<iMaterialWrapper> LoadMaterial(const char* name, bool* failed = NULL) = 0; virtual csPtr<iMeshFactoryWrapper> LoadFactory(const char* name) = 0; - THREADED_CALLABLE_IMPL2(Loader, PrecacheData, const char* path, bool recursive) = 0; + THREADED_INTERFACE2(PrecacheData, const char* path, bool recursive); virtual void UpdatePosition(const csVector3& pos, const char* sectorName, bool force) = 0; virtual void ContinueLoading(bool waiting) = 0; Modified: trunk/src/client/pscamera.cpp =================================================================== --- trunk/src/client/pscamera.cpp 2009-05-17 09:12:20 UTC (rev 3717) +++ trunk/src/client/pscamera.cpp 2009-05-17 09:32:03 UTC (rev 3718) @@ -47,8 +47,6 @@ #include "util/psstring.h" #include "util/strutil.h" -#include "engine/loader.h" - #include "gui/psmainwidget.h" #include "net/messages.h" @@ -1744,7 +1742,7 @@ shadowManager->SetShadowRange(dist); // control load distance. - Loader::GetSingleton().SetLoadRange(dist+dist/10); + psengine->GetLoader()->SetLoadRange(dist+dist/10); } float psCamera::GetDistanceClipping() Modified: trunk/src/client/psengine.cpp =================================================================== --- trunk/src/client/psengine.cpp 2009-05-17 09:12:20 UTC (rev 3717) +++ trunk/src/client/psengine.cpp 2009-05-17 09:32:03 UTC (rev 3718) @@ -113,12 +113,12 @@ #include "util/log.h" #include "util/strutil.h" #include "engine/psworld.h" -#include "engine/loader.h" #include "util/psutil.h" #include "util/consoleout.h" #include "entitylabels.h" #include "chatbubbles.h" #include "questionclient.h" +#include "iclient/ibgloader.h" ///////////////////////////////////////////////////////////////////////////// // PAWS Includes @@ -554,9 +554,9 @@ else if (level==1) { threadedWorldLoading = psengine->GetConfig()->GetBool("PlaneShift.Loading.ThreadedWorldLoad"); - loader = new Loader(); + loader = csQueryRegistry<iBgLoader>(object_reg); csRef<iThreadManager> tm = csQueryRegistry<iThreadManager>(object_reg); - Loader::GetSingleton().Init(object_reg, gfxFeatures, 200); + loader->Setup(gfxFeatures, 200); // Fill the loader cache. csRef<iStringArray> dirs = vfs->FindFiles("/planeshift/models/"); @@ -570,11 +570,11 @@ { if(tm->GetThreadCount() == 1) { - Loader::GetSingleton().PrecacheDataWait(files->Get(j), false); + loader->PrecacheDataWait(files->Get(j), false); } else { - modelPrecaches.Push(Loader::GetSingleton().PrecacheData(files->Get(j), false)); + modelPrecaches.Push(loader->PrecacheData(files->Get(j), false)); } } } @@ -591,11 +591,11 @@ { if(tm->GetThreadCount() == 1) { - Loader::GetSingleton().PrecacheDataWait(files->Get(j), false); + loader->PrecacheDataWait(files->Get(j), false); } else { - modelPrecaches.Push(Loader::GetSingleton().PrecacheData(files->Get(j), false)); + modelPrecaches.Push(loader->PrecacheData(files->Get(j), false)); } } } @@ -615,11 +615,11 @@ vpath.Append("world"); if(tm->GetThreadCount() == 1) { - Loader::GetSingleton().PrecacheDataWait(vpath.GetData(), false); + loader->PrecacheDataWait(vpath.GetData(), false); } else { - mapPrecaches.Push(Loader::GetSingleton().PrecacheData(vpath.GetData(), false)); + mapPrecaches.Push(loader->PrecacheData(vpath.GetData(), false)); } } } @@ -633,7 +633,7 @@ { csString vpath(maps->Get(i)); vpath.Append("world"); - mapPrecaches.Push(Loader::GetSingleton().PrecacheData(vpath.GetData(), false)); + mapPrecaches.Push(loader->PrecacheData(vpath.GetData(), false)); } } } Modified: trunk/src/client/psengine.h =================================================================== --- trunk/src/client/psengine.h 2009-05-17 09:12:20 UTC (rev 3717) +++ trunk/src/client/psengine.h 2009-05-17 09:32:03 UTC (rev 3718) @@ -38,6 +38,7 @@ class psCelClient; class ClientMsgHandler; class psClientCharManager; +struct iBgLoader; struct iCommandLineParser; struct iConfigManager; struct iDialogManager; @@ -61,7 +62,6 @@ class psMainWidget; class psQuestionClient; class psOptions; -class Loader; // Networking classes class psNetConnection; @@ -173,6 +173,7 @@ iDocumentSystem* GetXMLParser() { return xmlparser; } iSoundManager* GetSoundManager() { return soundmanager; } iConfigManager* GetConfig() { return cfgmgr; } ///< config file + iBgLoader* GetLoader() { return loader; } csRandomGen& GetRandomGen() { return random; } float GetRandom() { return random.Get(); } @@ -386,8 +387,8 @@ psQuestionClient* questionclient; PawsManager* paws; ///< Hold the ps AWS manager psMainWidget* mainWidget; ///< Hold the ps overridden version of the desktop - psInventoryCache* inventoryCache;///< inventory cache for client - Loader* loader; + psInventoryCache* inventoryCache;///< inventory cache for client + csRef<iBgLoader> loader; /* status, misc. vars */ bool gameLoaded; ///< determines if the game is loaded or not Modified: trunk/src/client/zonehandler.cpp =================================================================== --- trunk/src/client/zonehandler.cpp 2009-05-17 09:12:20 UTC (rev 3717) +++ trunk/src/client/zonehandler.cpp 2009-05-17 09:32:03 UTC (rev 3718) @@ -50,9 +50,9 @@ #include "gui/pawsloading.h" -#include "engine/loader.h" #include "engine/psworld.h" +#include "iclient/ibgloader.h" #include "iclient/isoundmngr.h" #include "psclientdr.h" @@ -232,10 +232,10 @@ { // Move the player to a temporary sector while we clean out the world. MovePlayerTo(msg.pos, "SectorWhereWeKeepEntitiesResidingInUnloadedMaps"); - Loader::GetSingleton().UpdatePosition(newPos, sectorToLoad, true); + psengine->GetLoader()->UpdatePosition(newPos, sectorToLoad, true); } - if(catchUp && Loader::GetSingleton().GetLoadingCount() == 0) + if(catchUp && psengine->GetLoader()->GetLoadingCount() == 0) { MovePlayerTo(msg.pos, msg.newSector); haveNewPos = false; @@ -430,9 +430,9 @@ int executed = 2; if(background) { - if(Loader::GetSingleton().HasValidPosition()) + if(psengine->GetLoader()->HasValidPosition()) { - if(Loader::GetSingleton().GetLoadingCount() == 0) + if(psengine->GetLoader()->GetLoadingCount() == 0) { executed = 0; psengine->GetEngine()->PrecacheDraw(); @@ -443,7 +443,7 @@ csSleep(1); // Continue loading the world. - Loader::GetSingleton().ContinueLoading(true); + psengine->GetLoader()->ContinueLoading(true); } } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mg...@us...> - 2009-05-25 14:23:28
|
Revision: 3778 http://planeshift.svn.sourceforge.net/planeshift/?rev=3778&view=rev Author: mgist Date: 2009-05-25 14:23:27 +0000 (Mon, 25 May 2009) Log Message: ----------- - Made material an object member. Modified Paths: -------------- trunk/src/client/weather.cpp trunk/src/client/weather.h Modified: trunk/src/client/weather.cpp =================================================================== --- trunk/src/client/weather.cpp 2009-05-25 14:20:51 UTC (rev 3777) +++ trunk/src/client/weather.cpp 2009-05-25 14:23:27 UTC (rev 3778) @@ -209,7 +209,6 @@ bool RainWeatherObject::CreateMesh() { - csRef<iMaterialWrapper> mat; if(!mfw) { // Create new rain @@ -361,7 +360,6 @@ bool SnowWeatherObject::CreateMesh() { - csRef<iMaterialWrapper> mat; if(!mfw) { // Create new snow Modified: trunk/src/client/weather.h =================================================================== --- trunk/src/client/weather.h 2009-05-25 14:20:51 UTC (rev 3777) +++ trunk/src/client/weather.h 2009-05-25 14:23:27 UTC (rev 3778) @@ -103,6 +103,7 @@ WeatherInfo* parent; csRef<iMeshWrapper> mesh; csRef<iMeshFactoryWrapper> mfw; + csRef<iMaterialWrapper> mat; csRef<iSndSysSource> weather_sound; // looping background weather sound }; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mg...@us...> - 2009-06-30 20:01:16
|
Revision: 3881 http://planeshift.svn.sourceforge.net/planeshift/?rev=3881&view=rev Author: mgist Date: 2009-06-30 20:01:13 +0000 (Tue, 30 Jun 2009) Log Message: ----------- - Small bgloader performance improvements. - Added initial support for water areas to the bgloader. - Added optional user failure handling to factory loading. Modified Paths: -------------- trunk/src/client/bgloader/loader.cpp trunk/src/client/bgloader/loader.h trunk/src/client/charapp.cpp trunk/src/client/iclient/ibgloader.h Modified: trunk/src/client/bgloader/loader.cpp =================================================================== --- trunk/src/client/bgloader/loader.cpp 2009-06-30 09:08:03 UTC (rev 3880) +++ trunk/src/client/bgloader/loader.cpp 2009-06-30 20:01:13 UTC (rev 3881) @@ -403,16 +403,10 @@ csRef<Sector> s; csString sectorName = node->GetAttributeValue("name"); + sectorName.Downcase(); { CS::Threading::ScopedReadLock lock(sLock); - for(size_t i=0; i<sectors.GetSize(); i++) - { - if(sectors[i]->name.CompareNoCase(sectorName)) - { - s = sectors[i]; - break; - } - } + s = sectortree.Get(sectorName, csRef<Sector>()); } if(!s.IsValid()) @@ -420,6 +414,7 @@ s = csPtr<Sector>(new Sector(sectorName)); CS::Threading::ScopedWriteLock lock(sLock); sectors.Push(s); + sectortree.Put(sectorName, s); } s->init = true; @@ -432,10 +427,46 @@ node = node->GetParent(); } - csRef<iDocumentNodeIterator> nodeItr2 = node->GetNodes("meshobj"); + csRef<iDocumentNodeIterator> nodeItr2 = node->GetNodes("key"); while(nodeItr2->HasNext()) { csRef<iDocumentNode> node2 = nodeItr2->Next(); + if(csString("water").Compare(node2->GetAttributeValue("name"))) + { + csRef<iDocumentNodeIterator> nodeItr3 = node2->GetNodes("area"); + while(nodeItr3->HasNext()) + { + csRef<iDocumentNode> area = nodeItr3->Next(); + WaterArea* wa = new WaterArea(); + s->waterareas.Push(wa); + + csRef<iDocumentNode> colour = area->GetNode("colour"); + if(colour.IsValid()) + { + syntaxService->ParseColor(colour, wa->colour); + } + else + { + // Default. + wa->colour = csColor4(0.0f, 0.17f, 0.49f, 0.6f); + } + + csRef<iDocumentNodeIterator> vs = area->GetNodes("v"); + while(vs->HasNext()) + { + csRef<iDocumentNode> v = vs->Next(); + csVector3 vector; + syntaxService->ParseVector(v, vector); + wa->bbox.AddBoundingVertex(vector); + } + } + } + } + + nodeItr2 = node->GetNodes("meshobj"); + while(nodeItr2->HasNext()) + { + csRef<iDocumentNode> node2 = nodeItr2->Next(); csRef<MeshObj> m = csPtr<MeshObj>(new MeshObj(node2->GetAttributeValue("name"), vfsPath, node2)); m->sector = s; @@ -781,16 +812,10 @@ } csString targetSector = node2->GetNode("sector")->GetContentsValue(); + targetSector.Downcase(); { CS::Threading::ScopedReadLock lock(sLock); - for(size_t i=0; i<sectors.GetSize(); i++) - { - if(targetSector.CompareNoCase(sectors[i]->name)) - { - p->targetSector = sectors[i]; - break; - } - } + p->targetSector = sectortree.Get(targetSector, csRef<Sector>()); } if(!p->targetSector.IsValid()) @@ -798,6 +823,7 @@ p->targetSector = csPtr<Sector>(new Sector(targetSector)); CS::Threading::ScopedWriteLock lock(sLock); sectors.Push(p->targetSector); + sectortree.Put(targetSector, p->targetSector); } if(!p->ww_given) @@ -949,13 +975,9 @@ sector = lastSector; } - for(size_t i=0; !sector.IsValid() && i<sectors.GetSize(); i++) + if(!sector.IsValid()) { - if(sectors[i]->name.Compare(sectorName)) - { - sector = sectors[i]; - break; - } + sector = sectortree.Get(csString(sectorName).Downcase(), csRef<Sector>()); } if(sector.IsValid()) @@ -1666,14 +1688,22 @@ return false; } -csPtr<iMeshFactoryWrapper> BgLoader::LoadFactory(const char* name) +csPtr<iMeshFactoryWrapper> BgLoader::LoadFactory(const char* name, bool* failed) { csRef<MeshFact> meshfact = meshfacts.Get(name, csRef<MeshFact>()); { - // Validation. - csString msg; - msg.Format("Invalid factory reference '%s'", name); - CS_ASSERT_MSG(msg.GetData(), meshfact.IsValid()); + if(!failed) + { + // Validation. + csString msg; + msg.Format("Invalid factory reference '%s'", name); + CS_ASSERT_MSG(msg.GetData(), meshfact.IsValid()); + } + else if(!meshfact.IsValid()) + { + *failed = true; + return csPtr<iMeshFactoryWrapper>(0); + } } if(LoadMeshFact(meshfact)) @@ -1709,5 +1739,27 @@ return csPtr<iMaterialWrapper>(0); } + +bool BgLoader::InWaterArea(const char* sector, csVector3* pos, csColor4** colour) const +{ + // Hack to work around the weird sector stuff we do. + if(!strcmp("SectorWhereWeKeepEntitiesResidingInUnloadedMaps", sector)) + return false; + + csRef<Sector> s = sectortree.Get(sector, csRef<Sector>()); + CS_ASSERT_MSG("Invalid sector passed to InWaterArea().", s.IsValid()); + + for(size_t i=0; i<s->waterareas.GetSize(); ++i) + { + if(s->waterareas[i]->bbox.In(*pos)) + { + *colour = &s->waterareas[i]->colour; + return true; + } + } + + return false; } + +} CS_PLUGIN_NAMESPACE_END(bgLoader) Modified: trunk/src/client/bgloader/loader.h =================================================================== --- trunk/src/client/bgloader/loader.h 2009-06-30 09:08:03 UTC (rev 3880) +++ trunk/src/client/bgloader/loader.h 2009-06-30 20:01:13 UTC (rev 3881) @@ -57,7 +57,7 @@ void Setup(uint gfxFeatures, float loadRange); csPtr<iMaterialWrapper> LoadMaterial(const char* name, bool* failed = NULL); - csPtr<iMeshFactoryWrapper> LoadFactory(const char* name); + csPtr<iMeshFactoryWrapper> LoadFactory(const char* name, bool* failed = NULL); THREADED_CALLABLE_DECL2(BgLoader, PrecacheData, csThreadReturn, const char*, path, bool, recursive, THREADEDL, false, false); void UpdatePosition(const csVector3& pos, const char* sectorName, bool force); @@ -74,6 +74,8 @@ bool HasValidPosition() const { return validPosition; } + bool InWaterArea(const char* sector, csVector3* pos, csColor4** colour) const; + private: class MeshGen; class MeshObj; @@ -92,6 +94,12 @@ useAll = (useHighShaders | useShadows | useMeshGen) }; + struct WaterArea + { + csBox3 bbox; + csColor4 colour; + }; + struct Shader { csString type; @@ -174,6 +182,14 @@ ambient = csColor(0.0f); } + ~Sector() + { + while(!waterareas.IsEmpty()) + { + delete waterareas.Pop(); + } + } + csString name; bool init; bool isLoading; @@ -188,6 +204,7 @@ csRefArray<Portal> portals; csRefArray<Portal> activePortals; csRefArray<Light> lights; + csArray<WaterArea*> waterareas; }; class MeshGen : public CS::Utility::FastRefCount<MeshObj> @@ -371,6 +388,7 @@ csRedBlackTreeMap<csString, csRef<Material> > materials; csRedBlackTreeMap<csString, csRef<MeshFact> > meshfacts; csRedBlackTreeMap<csString, csRef<MeshObj> > meshes; + csRedBlackTreeMap<csString, csRef<Sector> > sectortree; csRefArray<Sector> sectors; CS::Threading::ReadWriteMutex tLock; Modified: trunk/src/client/charapp.cpp =================================================================== --- trunk/src/client/charapp.cpp 2009-06-30 09:08:03 UTC (rev 3880) +++ trunk/src/client/charapp.cpp 2009-06-30 20:01:13 UTC (rev 3881) @@ -517,7 +517,14 @@ return false; } - csRef<iMeshFactoryWrapper> factory = psengine->GetLoader()->LoadFactory(meshFactName); + bool failed = false; + csRef<iMeshFactoryWrapper> factory = psengine->GetLoader()->LoadFactory(meshFactName, &failed); + if(failed) + { + Notify2(LOG_CHARACTER, "Mesh factory %s not found.", meshFactName ); + return false; + } + if(!factory.IsValid()) { Attachment attach(true); Modified: trunk/src/client/iclient/ibgloader.h =================================================================== --- trunk/src/client/iclient/ibgloader.h 2009-06-30 09:08:03 UTC (rev 3880) +++ trunk/src/client/iclient/ibgloader.h 2009-06-30 20:01:13 UTC (rev 3881) @@ -22,17 +22,18 @@ #include <iutil/threadmanager.h> +class csColor4; class csVector3; struct iObjectRegistry; struct iBgLoader : public virtual iBase { - SCF_INTERFACE(iBgLoader, 1, 0, 0); + SCF_INTERFACE(iBgLoader, 1, 1, 1); virtual void Setup(uint gfxFeatures, float loadRange) = 0; virtual csPtr<iMaterialWrapper> LoadMaterial(const char* name, bool* failed = NULL) = 0; - virtual csPtr<iMeshFactoryWrapper> LoadFactory(const char* name) = 0; + virtual csPtr<iMeshFactoryWrapper> LoadFactory(const char* name, bool* failed = NULL) = 0; THREADED_INTERFACE2(PrecacheData, const char* path, bool recursive); virtual void UpdatePosition(const csVector3& pos, const char* sectorName, bool force) = 0; @@ -48,6 +49,8 @@ virtual void SetLoadRange(float r) = 0; virtual bool HasValidPosition() const = 0; + + virtual bool InWaterArea(const char* sector, csVector3* pos, csColor4** colour) const = 0; }; #endif // __IBGLOADER_H__ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mg...@us...> - 2009-07-02 14:11:27
|
Revision: 3889 http://planeshift.svn.sourceforge.net/planeshift/?rev=3889&view=rev Author: mgist Date: 2009-07-02 13:48:37 +0000 (Thu, 02 Jul 2009) Log Message: ----------- - More cleanups. Modified Paths: -------------- trunk/src/client/pscelclient.cpp trunk/src/client/pscelclient.h Modified: trunk/src/client/pscelclient.cpp =================================================================== --- trunk/src/client/pscelclient.cpp 2009-07-02 13:37:24 UTC (rev 3888) +++ trunk/src/client/pscelclient.cpp 2009-07-02 13:48:37 UTC (rev 3889) @@ -83,6 +83,7 @@ #include "entitylabels.h" #include "shadowmanager.h" #include "pscharcontrol.h" +#include "pscamera.h" #include "psclientchar.h" #include "pscal3dcallback.h" #include "meshattach.h" @@ -792,6 +793,34 @@ // Update loader. psengine->GetLoader()->UpdatePosition(local_player->Pos(), sectorName, false); + + // Check if we're inside a water area. + csColor4* waterColour = 0; + if(psengine->GetLoader()->InWaterArea(sectorName, &psengine->GetPSCamera()->GetPosition(), &waterColour)) + { + psWeatherMessage::NetWeatherInfo fog; + fog.fogType = CS_FOG_MODE_EXP; + fog.fogColour = *waterColour; + fog.has_downfall = false; + fog.has_fog = true; + fog.has_lightning = false; + fog.sector = sectorName; + fog.fog_density = 100000; + fog.fog_fade = 0; + psengine->GetModeHandler()->ProcessFog(fog); + } + else + { + printf("Removing\n"); + psWeatherMessage::NetWeatherInfo fog; + fog.has_downfall = false; + fog.has_fog = false; + fog.has_lightning = false; + fog.sector = sectorName; + fog.fog_density = 0; + fog.fog_fade = 0; + psengine->GetModeHandler()->ProcessFog(fog); + } } if(loaded) @@ -1927,19 +1956,19 @@ } GEMClientItem::GEMClientItem( psCelClient* cel, psPersistItem& mesg ) - : GEMClientObject(cel, mesg.eid) + : GEMClientObject(cel, mesg.eid), post_load(new PostLoadData()) { name = mesg.name; Debug3(LOG_CELPERSIST, 0, "Item %s(%s) Received", mesg.name.GetData(), ShowID(mesg.eid)); type = mesg.type; factName = mesg.factname; solid = 0; - pos = mesg.pos; - xRot = mesg.xRot; - yRot = mesg.yRot; - zRot = mesg.zRot; - sector = mesg.sector; - flags = mesg.flags; + post_load->pos = mesg.pos; + post_load->xRot = mesg.xRot; + post_load->yRot = mesg.yRot; + post_load->zRot = mesg.zRot; + post_load->sector = mesg.sector; + post_load->flags = mesg.flags; if (!InitMesh()) { @@ -1955,9 +1984,9 @@ void GEMClientItem::PostLoad(bool nullmesh) { - Move(pos, yRot, sector); + Move(post_load->pos, post_load->yRot, post_load->sector); - Rotate(xRot, yRot, zRot); + Rotate(post_load->xRot, post_load->yRot, post_load->zRot); if (flags & psPersistItem::COLLIDE) { @@ -1968,19 +1997,24 @@ cel->GetEntityLabels()->OnObjectArrived(this); cel->GetShadowManager()->CreateShadow(this); + + delete post_load; + post_load = NULL; } void GEMClientItem::UpdateItem( psPersistItem& mesg ) { name = mesg.name; Debug3(LOG_CELPERSIST, 0, "Item %s(%s) Updated", mesg.name.GetData(), ShowID(mesg.eid)); - pos = mesg.pos; - xRot = mesg.xRot; - yRot = mesg.yRot; - zRot = mesg.zRot; - sector = mesg.sector; - flags = mesg.flags; + post_load = new PostLoadData(); + post_load->pos = mesg.pos; + post_load->xRot = mesg.xRot; + post_load->yRot = mesg.yRot; + post_load->zRot = mesg.zRot; + post_load->sector = mesg.sector; + post_load->flags = mesg.flags; + if(pcmesh.IsValid()) { PostLoad(false); Modified: trunk/src/client/pscelclient.h =================================================================== --- trunk/src/client/pscelclient.h 2009-07-02 13:37:24 UTC (rev 3888) +++ trunk/src/client/pscelclient.h 2009-07-02 13:48:37 UTC (rev 3889) @@ -589,12 +589,17 @@ private: // Post load data. - csVector3 pos; - float xRot; - float yRot; - float zRot; - csString sector; - uint32_t flags; + struct PostLoadData + { + csVector3 pos; + float xRot; + float yRot; + float zRot; + csString sector; + uint32_t flags; + }; + + PostLoadData* post_load; }; /** An action location on the client. */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ko...@us...> - 2009-07-02 17:52:00
|
Revision: 3891 http://planeshift.svn.sourceforge.net/planeshift/?rev=3891&view=rev Author: kougaro Date: 2009-07-02 17:51:59 +0000 (Thu, 02 Jul 2009) Log Message: ----------- npcs rotate correctly again, and now they do it over time Modified Paths: -------------- trunk/src/client/pscamera.cpp trunk/src/client/pscamera.h Modified: trunk/src/client/pscamera.cpp =================================================================== --- trunk/src/client/pscamera.cpp 2009-07-02 16:10:53 UTC (rev 3890) +++ trunk/src/client/pscamera.cpp 2009-07-02 17:51:59 UTC (rev 3891) @@ -46,6 +46,8 @@ //============================================================================= #include "iclient/ibgloader.h" +#include "engine/linmove.h" + #include "util/psstring.h" #include "util/strutil.h" @@ -238,28 +240,33 @@ if(GetCameraMode() != CAMERA_NPCTALK && actor->RangeTo(target, false) < NPC_MODE_DISTANCE) { //rotate the target so that it faces the player - csVector3 playerPos = psengine->GetCelClient()->GetMainPlayer()->Pos(); + csVector3 playerPos = psengine->GetCelClient()->GetMainPlayer()->GetPosition(); csVector3 targetPos = target->GetPosition(); csVector3 diff = playerPos - targetPos; if (!diff.x) diff.x = 0.00001F; // div/0 protect - float angle = atan2(diff.z,diff.x); + float angle = -atan2(diff.x,-diff.z); + Error2("Raw angle %f", angle); + if(angle < 0) angle += TWO_PI; + Error2("new angle %f", angle); float npcrot = target->GetRotation(); + Error2("npc angle %f", npcrot); GEMClientActor* targetActor = dynamic_cast<GEMClientActor*>(target); float velNormSquared = targetActor->GetVelocity().SquaredNorm(); - if((angle-npcrot) < PI && (angle-npcrot) > -PI && velNormSquared == 0) + if((angle-npcrot) < TWO_PI && (angle-npcrot) > 0 && velNormSquared == 0) { npcOldRot = npcrot; - target->SetPosition(target->GetPosition(), angle, target->GetSector()); + //target->Rotate(0.0f, angle, 0.0f); + targetActor->GetMovement()->SetAngularVelocity(3.0f, csVector3(0.0f, angle, 0.0f)); } - npcModeTarget = target; + npcModeTarget = targetActor; npcModePosition = actor->GetMesh()->GetMovable()->GetFullPosition(); SetCameraMode(CAMERA_NPCTALK); } @@ -1431,7 +1438,7 @@ psClientCharManager* clientChar = psengine->GetCharManager(); if (npcModeTarget != clientChar->GetTarget() || npcModePosition != actor->GetMesh()->GetMovable()->GetFullPosition()) { - npcModeTarget->SetPosition(npcModeTarget->GetPosition(), npcOldRot, npcModeTarget->GetSector()); + npcModeTarget->GetMovement()->SetAngularVelocity(2.5f, csVector3(0.0f, npcOldRot, 0.0f)); SetCameraMode(lastCameraMode); break; } Modified: trunk/src/client/pscamera.h =================================================================== --- trunk/src/client/pscamera.h 2009-07-02 16:10:53 UTC (rev 3890) +++ trunk/src/client/pscamera.h 2009-07-02 17:51:59 UTC (rev 3891) @@ -667,7 +667,7 @@ DistanceCfg distanceCfg; - GEMClientObject* npcModeTarget; + GEMClientActor* npcModeTarget; csVector3 npcModePosition; float npcOldRot; int fixedDistClip; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mg...@us...> - 2009-07-03 06:14:14
|
Revision: 3897 http://planeshift.svn.sourceforge.net/planeshift/?rev=3897&view=rev Author: mgist Date: 2009-07-03 06:14:13 +0000 (Fri, 03 Jul 2009) Log Message: ----------- - Fixed a crash on world load. - Changed items to use pseudo-instancing for rendering and a nullmesh for everything else. Modified Paths: -------------- trunk/src/client/chatbubbles.cpp trunk/src/client/entitylabels.cpp trunk/src/client/pscelclient.cpp trunk/src/client/pscelclient.h trunk/src/client/shadowmanager.cpp Modified: trunk/src/client/chatbubbles.cpp =================================================================== --- trunk/src/client/chatbubbles.cpp 2009-07-03 06:03:41 UTC (rev 3896) +++ trunk/src/client/chatbubbles.cpp 2009-07-03 06:14:13 UTC (rev 3897) @@ -437,7 +437,7 @@ return; } - const csBox3& boundBox = mesh->GetMeshObject()->GetObjectModel()->GetObjectBoundingBox(); + const csBox3& boundBox = actor->GetBBox(); unsigned int bubbleID = effectManager->RenderEffect("chatbubble", //effectName, csVector3(0, boundBox.Max(1) + 0.5f, 0), mesh); Modified: trunk/src/client/entitylabels.cpp =================================================================== --- trunk/src/client/entitylabels.cpp 2009-07-03 06:03:41 UTC (rev 3896) +++ trunk/src/client/entitylabels.cpp 2009-07-03 06:14:13 UTC (rev 3897) @@ -306,7 +306,7 @@ DeleteLabelOfObject(object); // make sure the old label is gone // Get the height of the model - const csBox3& boundBox = mesh->GetMeshObject()->GetObjectModel()->GetObjectBoundingBox(); + const csBox3& boundBox = object->GetBBox(); psEffectManager* effectMgr = psengine->GetEffectManager(); Modified: trunk/src/client/pscelclient.cpp =================================================================== --- trunk/src/client/pscelclient.cpp 2009-07-03 06:03:41 UTC (rev 3896) +++ trunk/src/client/pscelclient.cpp 2009-07-03 06:14:13 UTC (rev 3897) @@ -35,9 +35,11 @@ #include <iengine/sector.h> #include <iengine/scenenode.h> #include <imesh/object.h> +#include <imesh/objmodel.h> #include <imesh/spritecal3d.h> #include <imesh/nullmesh.h> #include <imesh/nullmesh.h> +#include <ivideo/material.h> #include <csgeom/math3d.h> //============================ @@ -176,6 +178,13 @@ unresSector = psengine->GetEngine()->CreateSector("SectorWhereWeKeepEntitiesResidingInUnloadedMaps"); + // Init nullmesh factory. + nullfact = psengine->GetEngine()->CreateMeshFactory("crystalspace.mesh.object.null", "nullmesh"); + csRef<iNullFactoryState> nullstate = scfQueryInterface<iNullFactoryState> (nullfact->GetMeshObjectFactory()); + csBox3 bbox; + bbox.AddBoundingVertex(csVector3(0.0f)); + nullstate->SetBoundingBox(bbox); + LoadEffectItems(); return true; @@ -206,7 +215,7 @@ bool psCelClient::IsReady() { - if ( local_player == NULL || + if ( local_player == NULL || local_player->linmove == NULL || (!psengine->ThreadedWorldLoading() && gameWorld == NULL)) return false; else @@ -793,7 +802,7 @@ // Update loader. psengine->GetLoader()->UpdatePosition(local_player->Pos(), sectorName, false); - +/* // Check if we're inside a water area. csColor4* waterColour = 0; if(psengine->GetLoader()->InWaterArea(sectorName, &psengine->GetPSCamera()->GetPosition(), &waterColour)) @@ -820,7 +829,7 @@ fog.fog_density = 0; fog.fog_fade = 0; psengine->GetModeHandler()->ProcessFog(fog); - } + }*/ } if(loaded) @@ -1124,7 +1133,15 @@ return list; } +csPtr<InstanceObject> psCelClient::FindInstanceObject(const char* name) const +{ + return csPtr<InstanceObject> (instanceObjects.Get(name, csRef<InstanceObject>())); +} +void psCelClient::AddInstanceObject(const char* name, csRef<InstanceObject> object) +{ + instanceObjects.Put(name, object); +} //------------------------------------------------------------------------------- @@ -1182,6 +1199,22 @@ pcmesh->GetMovable()->GetTransform().SetO2T (matrix); pcmesh->GetMovable ()->UpdateMove (); + + if(instance.IsValid()) + { + // Update the sector and position of real mesh. + if (sector) + { + instance->pcmesh->GetMovable ()->SetSector (sector); + instance->pcmesh->GetMovable()->SetPosition(0.0f); + } + + // Set instancing transform. + csReversibleTransform rt; + rt.SetO2T(matrix); + rt.SetO2TTranslation(pos); + position->SetValue(rt); + } } return true; @@ -1201,6 +1234,15 @@ pcmesh->GetMovable ()->GetTransform().SetO2T (xmatrix*ymatrix*zmatrix); pcmesh->GetMovable ()->UpdateMove (); + + // Set instancing transform. + if(instance.IsValid()) + { + csReversibleTransform rt; + rt.SetO2T(pcmesh->GetMovable ()->GetTransform().GetO2T()); + rt.SetO2TTranslation(pcmesh->GetMovable ()->GetPosition()); + position->SetValue(rt); + } } csVector3 GEMClientObject::GetPosition() @@ -1229,6 +1271,18 @@ return pcmesh->GetMovable()->GetSectors(); } +const csBox3& GEMClientObject::GetBBox() const +{ + if(instance.IsValid()) + { + return instance->bbox; + } + else + { + return pcmesh->GetMeshObject()->GetObjectModel()->GetObjectBoundingBox(); + } +} + csRef<iMeshWrapper> GEMClientObject::GetMesh() const { return pcmesh; @@ -1296,40 +1350,6 @@ return true; } -void GEMClientObject::CheckLoadStatus() -{ - csRef<iMeshFactoryWrapper> factory = psengine->GetLoader()->LoadFactory(factName); - if(!factory.IsValid()) - { - return; - } - - pcmesh = factory->CreateMeshWrapper(); - pcmesh->GetFlags().Set(CS_ENTITY_NODECAL); - psengine->GetEngine()->GetMeshes()->Add(pcmesh); - - if (!pcmesh) - { - Error2("Could not create Item because could not load %s file into mesh.", factName.GetData()); - return; - } - - csRef<iSpriteCal3DState> calstate = scfQueryInterface<iSpriteCal3DState> (pcmesh->GetMeshObject()); - if (calstate) - calstate->SetUserData((void *)this); - - charApp->SetMesh(pcmesh); - - cel->AttachObject(pcmesh->QueryObject(), this); - - psengine->UnregisterDelayedLoader(this); - - PostLoad(false); - - // Handle item effect if there is one. - cel->HandleItemEffect(factName, pcmesh); -} - void GEMClientObject::ChangeName(const char* name) { this->name = name; @@ -1955,6 +1975,31 @@ return strUnknown; } +void GEMClientActor::CheckLoadStatus() +{ + csRef<iMeshFactoryWrapper> factory = psengine->GetLoader()->LoadFactory(factName); + if(!factory.IsValid()) + { + return; + } + + pcmesh = factory->CreateMeshWrapper(); + pcmesh->GetFlags().Set(CS_ENTITY_NODECAL); + psengine->GetEngine()->GetMeshes()->Add(pcmesh); + + csRef<iSpriteCal3DState> calstate = scfQueryInterface<iSpriteCal3DState> (pcmesh->GetMeshObject()); + if (calstate) + calstate->SetUserData((void *)this); + + charApp->SetMesh(pcmesh); + + cel->AttachObject(pcmesh->QueryObject(), this); + + psengine->UnregisterDelayedLoader(this); + + PostLoad(false); +} + GEMClientItem::GEMClientItem( psCelClient* cel, psPersistItem& mesg ) : GEMClientObject(cel, mesg.eid), post_load(new PostLoadData()) { @@ -1979,9 +2024,88 @@ GEMClientItem::~GEMClientItem() { + if(instance) + { + // Remove instance. + instance->pcmesh->RemoveInstance(position); + } + delete solid; } +void GEMClientItem::CheckLoadStatus() +{ + csRef<iMeshFactoryWrapper> factory; + + // Check if an instance of the mesh already exists. + instance = cel->FindInstanceObject(factName); + if(!instance.IsValid()) + { + factory = psengine->GetLoader()->LoadFactory(factName); + if(!factory.IsValid()) + { + return; + } + + // Create the mesh. + instance = csPtr<InstanceObject>(new InstanceObject()); + instance->pcmesh = factory->CreateMeshWrapper(); + instance->pcmesh->GetFlags().Set(CS_ENTITY_NODECAL | CS_ENTITY_NOHITBEAM); + psengine->GetEngine()->GetMeshes()->Add(instance->pcmesh); + cel->AddInstanceObject(factName, instance); + + // Set appropriate shader. + csRef<iShaderManager> shman = csQueryRegistry<iShaderManager>(psengine->GetObjectRegistry()); + csRef<iStringSet> strings = csQueryRegistryTagInterface<iStringSet>( + psengine->GetObjectRegistry(), "crystalspace.shared.stringset"); + csStringID shadertype = strings->Request("base"); + + iMaterial* material = factory->GetMeshObjectFactory()->GetMaterialWrapper()->GetMaterial(); + iShader* shader = material->GetShader(shadertype); + if(!shader || !strcmp("lighting_default", shader->QueryObject()->GetName())) + { + shader = shman->GetShader("lighting_default_instance"); + } + else if(!strcmp("lighting_default_binalpha", shader->QueryObject()->GetName())) + { + shader = shman->GetShader("lighting_default_instance_binalpha"); + } + //else // Handle this case if/when it happens... + + material->SetShader(shadertype, shader); + shadertype = strings->Request("diffuse"); + material->SetShader(shadertype, shader); + + // Set biggest bbox so that instances aren't wrongly culled. + instance->bbox = factory->GetMeshObjectFactory()->GetObjectModel()->GetObjectBoundingBox(); + factory->GetMeshObjectFactory()->GetObjectModel()->SetObjectBoundingBox(csBox3(-CS_BOUNDINGBOX_MAXVALUE, + -CS_BOUNDINGBOX_MAXVALUE, -CS_BOUNDINGBOX_MAXVALUE, CS_BOUNDINGBOX_MAXVALUE, CS_BOUNDINGBOX_MAXVALUE, + CS_BOUNDINGBOX_MAXVALUE)); + } + + position = instance->pcmesh->AddInstance(csVector3(0.0f), csMatrix3()); + + // Init nullmesh factory. + factory = psengine->GetEngine()->CreateMeshFactory("crystalspace.mesh.object.null", factName + "_nullmesh"); + csRef<iNullFactoryState> nullstate = scfQueryInterface<iNullFactoryState> (factory->GetMeshObjectFactory()); + nullstate->SetBoundingBox(instance->bbox); + + pcmesh = factory->CreateMeshWrapper(); + pcmesh->GetFlags().Set(CS_ENTITY_NODECAL); + csRef<iNullMeshState> nullmeshstate = scfQueryInterface<iNullMeshState> (pcmesh->GetMeshObject()); + nullmeshstate->SetHitBeamMeshObject(instance->pcmesh->GetMeshObject()); + psengine->GetEngine()->GetMeshes()->Add(pcmesh); + + cel->AttachObject(pcmesh->QueryObject(), this); + + psengine->UnregisterDelayedLoader(this); + + PostLoad(false); + + // Handle item effect if there is one. + cel->HandleItemEffect(factName, pcmesh); +} + void GEMClientItem::PostLoad(bool nullmesh) { Move(post_load->pos, post_load->yRot, post_load->sector); Modified: trunk/src/client/pscelclient.h =================================================================== --- trunk/src/client/pscelclient.h 2009-07-03 06:03:41 UTC (rev 3896) +++ trunk/src/client/pscelclient.h 2009-07-03 06:14:13 UTC (rev 3897) @@ -87,6 +87,12 @@ } }; +struct InstanceObject : public CS::Utility::FastRefCount<InstanceObject> +{ + csRef<iMeshWrapper> pcmesh; + csBox3 bbox; +}; + /** * Client version of the Cel Manager */ @@ -130,13 +136,9 @@ bool ignore_others; - struct InstanceObject : public CS::Utility::FastRefCount<InstanceObject> - { - csRef<iMeshWrapper> pcmesh; - csRef<csShaderVariable> instances; - }; + csRedBlackTreeMap<csString, csRef<InstanceObject> > instanceObjects; - csRedBlackTreeMap<csString, csRef<InstanceObject> > meshObjects; + csRef<iMeshFactoryWrapper> nullfact; public: @@ -245,6 +247,24 @@ */ csArray<GEMClientObject*> FindNearbyEntities (iSector* sector, const csVector3& pos, float radius, bool doInvisible = false); + /** + * Search for an instance object and return it if existing. Else return 0 csPtr. + */ + csPtr<InstanceObject> FindInstanceObject(const char* name) const; + + /** + * Add an instance object to the tree. + */ + void AddInstanceObject(const char* name, csRef<InstanceObject> object); + + /** + * Returns the nullmesh factory. + */ + iMeshFactoryWrapper* GetNullFact() const + { + return nullfact; + } + protected: friend class GEMClientActor; @@ -346,6 +366,9 @@ /** Get list of sectors that entity is in */ virtual iSectorList* GetSectors() const; + /** Return the bounding box of this entity. */ + virtual const csBox3& GetBBox() const; + EID GetEID() { return eid; } csRef<iMeshWrapper> pcmesh; @@ -390,7 +413,7 @@ /** * Delayed mesh loading. */ - void CheckLoadStatus(); + virtual void CheckLoadStatus() {} /** * Delayed load 'post-process'. @@ -412,7 +435,8 @@ psEffect * shadow; bool hasShadow; - + csRef<InstanceObject> instance; + csRef<csShaderVariable> position; }; class psDRMessage; @@ -500,6 +524,11 @@ // The following hash is used by GetAnimIndex(). csHash<int,csStringID> anim_hash; + /** + * Delayed mesh loading. + */ + virtual void CheckLoadStatus(); + csString race; csString helmGroup; csString BracerGroup; @@ -582,6 +611,11 @@ void UpdateItem( psPersistItem& mesg ); + /** + * Delayed mesh loading. + */ + virtual void CheckLoadStatus(); + protected: virtual void PostLoad(bool nullmesh); Modified: trunk/src/client/shadowmanager.cpp =================================================================== --- trunk/src/client/shadowmanager.cpp 2009-07-03 06:03:41 UTC (rev 3896) +++ trunk/src/client/shadowmanager.cpp 2009-07-03 06:14:13 UTC (rev 3897) @@ -148,7 +148,7 @@ return; // calculate a suitable size for this shadow - const csBox3& boundBox = mesh->GetMeshObject()->GetObjectModel()->GetObjectBoundingBox(); + const csBox3& boundBox = object->GetBBox(); float scale = (boundBox.Max(0) + boundBox.Max(2)) * 0.75f; if (scale < 0.35f) scale = 0.35f; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mg...@us...> - 2009-07-05 01:41:07
|
Revision: 3917 http://planeshift.svn.sourceforge.net/planeshift/?rev=3917&view=rev Author: mgist Date: 2009-07-05 01:41:03 +0000 (Sun, 05 Jul 2009) Log Message: ----------- - Fixed some checks. Modified Paths: -------------- trunk/src/client/bgloader/loader.cpp trunk/src/client/bgloader/loader.h trunk/src/client/pscelclient.cpp Modified: trunk/src/client/bgloader/loader.cpp =================================================================== --- trunk/src/client/bgloader/loader.cpp 2009-07-04 21:28:21 UTC (rev 3916) +++ trunk/src/client/bgloader/loader.cpp 2009-07-05 01:41:03 UTC (rev 3917) @@ -103,8 +103,8 @@ shaders.Push(file->GetContentsValue()); rets.Push(tloader->LoadShader(vfs->GetCwd(), file->GetContentsValue())); - shadersByUsageType.Register(node->GetAttributeValue("name"), - strings->Request(node->GetNode("type")->GetContentsValue())); + shadersByUsageType.Put(strings->Request(node->GetNode("type")->GetContentsValue()), + node->GetAttributeValue("name")); } // Wait for shader loads to finish. @@ -118,7 +118,7 @@ { csStringArray t; csStringID id = strings->Request(usageType); - csArray<const char*> all = shadersByUsageType.RequestAll(id); + csArray<csString> all = shadersByUsageType.GetAll(id); for(size_t i=0; i<all.GetSize(); ++i) { Modified: trunk/src/client/bgloader/loader.h =================================================================== --- trunk/src/client/bgloader/loader.h 2009-07-04 21:28:21 UTC (rev 3916) +++ trunk/src/client/bgloader/loader.h 2009-07-05 01:41:03 UTC (rev 3917) @@ -24,7 +24,7 @@ #include <csgfx/shadervar.h> #include <csutil/redblacktree.h> #include <csutil/scf_implementation.h> -#include <csutil/strhashr.h> +#include <csutil/hash.h> #include <csutil/threading/rwmutex.h> #include <csutil/threadmanager.h> @@ -387,7 +387,7 @@ csRefArray<MeshObj> finalisableMeshes; csRefArray<MeshObj> deleteQueue; - csStringHashReversible shadersByUsageType; + csHash<csString, csStringID> shadersByUsageType; csRedBlackTreeMap<csString, csRef<Texture> > textures; csRedBlackTreeMap<csString, csRef<Material> > materials; csRedBlackTreeMap<csString, csRef<MeshFact> > meshfacts; Modified: trunk/src/client/pscelclient.cpp =================================================================== --- trunk/src/client/pscelclient.cpp 2009-07-04 21:28:21 UTC (rev 3916) +++ trunk/src/client/pscelclient.cpp 2009-07-05 01:41:03 UTC (rev 3917) @@ -806,12 +806,15 @@ { if(local_player) { - const char* sectorName = local_player->GetSector()->QueryObject()->GetName(); - if(!sectorName) - return; + if(psengine->ThreadedWorldLoading()) + { + const char* sectorName = local_player->GetSector()->QueryObject()->GetName(); + if(!sectorName) + return; - // Update loader. - psengine->GetLoader()->UpdatePosition(local_player->Pos(), sectorName, false); + // Update loader. + psengine->GetLoader()->UpdatePosition(local_player->Pos(), sectorName, false); + } /* // Check if we're inside a water area. csColor4* waterColour = 0; @@ -2090,15 +2093,18 @@ csStringArray shaders = psengine->GetLoader()->GetShaderName("default"); csStringArray shadersa = psengine->GetLoader()->GetShaderName("default_alpha"); - if(!shader || shaders.Contains(shader->QueryObject()->GetName())) + if(!shader || shaders.Contains(shader->QueryObject()->GetName()) != csArrayItemNotFound) { shader = shman->GetShader(psengine->GetLoader()->GetShaderName("instance")[0]); } - else if(shadersa.Contains(shader->QueryObject()->GetName())) + else if(shadersa.Contains(shader->QueryObject()->GetName()) != csArrayItemNotFound) { shader = shman->GetShader(psengine->GetLoader()->GetShaderName("instance_alpha")[0]); } - //else // Handle this case if/when it happens... + else + { + Error3("Unhandled shader %s for mesh %s!\n", shader->QueryObject()->GetName(), factName); + } // Construct a new material using the selected shaders. csRef<iTextureWrapper> tex = psengine->GetEngine()->GetTextureList()->CreateTexture(material->GetTexture()); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mg...@us...> - 2009-07-05 04:54:03
|
Revision: 3918 http://planeshift.svn.sourceforge.net/planeshift/?rev=3918&view=rev Author: mgist Date: 2009-07-05 04:53:57 +0000 (Sun, 05 Jul 2009) Log Message: ----------- - Fixed some memory issues. Modified Paths: -------------- trunk/src/client/bgloader/loader.cpp trunk/src/client/bgloader/loader.h trunk/src/client/iclient/ibgloader.h trunk/src/client/pscelclient.cpp Modified: trunk/src/client/bgloader/loader.cpp =================================================================== --- trunk/src/client/bgloader/loader.cpp 2009-07-05 01:41:03 UTC (rev 3917) +++ trunk/src/client/bgloader/loader.cpp 2009-07-05 04:53:57 UTC (rev 3918) @@ -21,13 +21,13 @@ #include <cstool/collider.h> #include <cstool/vfsdirchange.h> #include <csutil/scanstr.h> +#include <csutil/scfstringarray.h> #include <iengine/movable.h> #include <iengine/portal.h> #include <imap/services.h> #include <imesh/object.h> #include <iutil/cfgmgr.h> #include <iutil/document.h> -#include <iutil/stringarray.h> #include <iutil/object.h> #include <iutil/plugin.h> #include <ivaria/collider.h> @@ -114,18 +114,18 @@ } } -csStringArray BgLoader::GetShaderName(const char* usageType) const +csPtr<iStringArray> BgLoader::GetShaderName(const char* usageType) const { - csStringArray t; + csRef<iStringArray> t = csPtr<iStringArray>(new scfStringArray()); csStringID id = strings->Request(usageType); csArray<csString> all = shadersByUsageType.GetAll(id); for(size_t i=0; i<all.GetSize(); ++i) { - t.Push(all[i]); + t->Push(all[i]); } - return t; + return csPtr<iStringArray>(t); } THREADED_CALLABLE_IMPL2(BgLoader, PrecacheData, const char* path, bool recursive) Modified: trunk/src/client/bgloader/loader.h =================================================================== --- trunk/src/client/bgloader/loader.h 2009-07-05 01:41:03 UTC (rev 3917) +++ trunk/src/client/bgloader/loader.h 2009-07-05 04:53:57 UTC (rev 3918) @@ -77,7 +77,7 @@ bool InWaterArea(const char* sector, csVector3* pos, csColor4** colour) const; - csStringArray GetShaderName(const char* usageType) const; + csPtr<iStringArray> GetShaderName(const char* usageType) const; private: class MeshGen; Modified: trunk/src/client/iclient/ibgloader.h =================================================================== --- trunk/src/client/iclient/ibgloader.h 2009-07-05 01:41:03 UTC (rev 3917) +++ trunk/src/client/iclient/ibgloader.h 2009-07-05 04:53:57 UTC (rev 3918) @@ -23,13 +23,12 @@ #include <iutil/threadmanager.h> class csColor4; -class csStringArray; class csVector3; struct iObjectRegistry; struct iBgLoader : public virtual iBase { - SCF_INTERFACE(iBgLoader, 1, 2, 0); + SCF_INTERFACE(iBgLoader, 1, 3, 0); virtual void Setup(uint gfxFeatures, float loadRange) = 0; @@ -53,7 +52,7 @@ virtual bool InWaterArea(const char* sector, csVector3* pos, csColor4** colour) const = 0; - virtual csStringArray GetShaderName(const char* usageType) const = 0; + virtual csPtr<iStringArray> GetShaderName(const char* usageType) const = 0; }; #endif // __IBGLOADER_H__ Modified: trunk/src/client/pscelclient.cpp =================================================================== --- trunk/src/client/pscelclient.cpp 2009-07-05 01:41:03 UTC (rev 3917) +++ trunk/src/client/pscelclient.cpp 2009-07-05 04:53:57 UTC (rev 3918) @@ -27,6 +27,7 @@ #include <cstool/collider.h> #include <iutil/cfgmgr.h> #include <iutil/objreg.h> +#include <iutil/stringarray.h> #include <iutil/vfs.h> #include <ivaria/collider.h> #include <iengine/engine.h> @@ -2091,15 +2092,17 @@ iMaterial* material = factory->GetMeshObjectFactory()->GetMaterialWrapper()->GetMaterial(); iShader* shader = material->GetShader(shadertype); - csStringArray shaders = psengine->GetLoader()->GetShaderName("default"); - csStringArray shadersa = psengine->GetLoader()->GetShaderName("default_alpha"); - if(!shader || shaders.Contains(shader->QueryObject()->GetName()) != csArrayItemNotFound) + csRef<iStringArray> shaders = psengine->GetLoader()->GetShaderName("default"); + csRef<iStringArray> shadersa = psengine->GetLoader()->GetShaderName("default_alpha"); + if(!shader || shaders->Contains(shader->QueryObject()->GetName()) != csArrayItemNotFound) { - shader = shman->GetShader(psengine->GetLoader()->GetShaderName("instance")[0]); + csRef<iStringArray> shaderName = psengine->GetLoader()->GetShaderName("instance"); + shader = shman->GetShader(shaderName->Get(0)); } - else if(shadersa.Contains(shader->QueryObject()->GetName()) != csArrayItemNotFound) + else if(shadersa->Contains(shader->QueryObject()->GetName()) != csArrayItemNotFound) { - shader = shman->GetShader(psengine->GetLoader()->GetShaderName("instance_alpha")[0]); + csRef<iStringArray> shaderName = psengine->GetLoader()->GetShaderName("instance_alpha"); + shader = shman->GetShader(shaderName->Get(0)); } else { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mg...@us...> - 2009-07-07 20:11:28
|
Revision: 3943 http://planeshift.svn.sourceforge.net/planeshift/?rev=3943&view=rev Author: mgist Date: 2009-07-07 20:11:17 +0000 (Tue, 07 Jul 2009) Log Message: ----------- - Save final position before rotate. Modified Paths: -------------- trunk/src/client/psslotmgr.cpp trunk/src/client/psslotmgr.h Modified: trunk/src/client/psslotmgr.cpp =================================================================== --- trunk/src/client/psslotmgr.cpp 2009-07-07 19:49:28 UTC (rev 3942) +++ trunk/src/client/psslotmgr.cpp 2009-07-07 20:11:17 UTC (rev 3943) @@ -72,7 +72,8 @@ // Drop the item at the current position. if(isRotating) { - return DropItem(); + DropItem(); + return true; } // Else begin rotate... @@ -188,7 +189,6 @@ { // Get WS position. psPoint p = PawsManager::GetSingleton().GetMouse()->GetPosition(); - csVector3 pt3d; iMeshWrapper *mesh = psengine->GetPSCamera()->Get3DPointFrom2D(p.x, p.y, &pt3d); // If mesh under mouse is valid (so the position is valid). @@ -238,7 +238,6 @@ else { // Else we use it to determine item position. - csVector3 pt3d; iMeshWrapper *mesh = psengine->GetPSCamera()->Get3DPointFrom2D(p.x, p.y, &pt3d); outline->GetMovable()->SetPosition(pt3d); @@ -247,38 +246,29 @@ outline->GetMovable()->UpdateMove(); } -bool psSlotManager::DropItem() +void psSlotManager::DropItem() { - // Get final WS position. + // Get final rotation. psPoint p = PawsManager::GetSingleton().GetMouse()->GetPosition(); - csVector3 pt3d; - iMeshWrapper *mesh = psengine->GetPSCamera()->Get3DPointFrom2D(p.x, p.y, &pt3d); float yrot = 6 * PI * ((float)p.x - basePoint.x) / psengine->GetG2D()->GetWidth(); - // Check that the position is valid (not in the goop of nothing). - if(mesh) - { - // Send drop message. - psSlotMovementMsg msg( draggingSlot.containerID, draggingSlot.slotID, - CONTAINER_WORLD, 0, draggingSlot.stackCount, &pt3d, - &yrot); - msg.SendMessage(); + // Send drop message. + psSlotMovementMsg msg( draggingSlot.containerID, draggingSlot.slotID, + CONTAINER_WORLD, 0, draggingSlot.stackCount, &pt3d, + &yrot); + msg.SendMessage(); - // Remove outline mesh. - outline->GetMovable()->SetSector(0); - outline.Invalidate(); + // Remove outline mesh. + outline->GetMovable()->SetSector(0); + outline.Invalidate(); - // Show inventory window again. - PawsManager::GetSingleton().GetMainWidget()->FindWidget("InventoryWindow")->Show(); + // Show inventory window again. + PawsManager::GetSingleton().GetMainWidget()->FindWidget("InventoryWindow")->Show(); - isDragging = false; - isPlacing = false; - isRotating = false; - - return true; - } - - return false; + // Reset flags. + isDragging = false; + isPlacing = false; + isRotating = false; } void psSlotManager::Handle( pawsSlot* slot, bool grabOne, bool grabAll ) Modified: trunk/src/client/psslotmgr.h =================================================================== --- trunk/src/client/psslotmgr.h 2009-07-07 19:49:28 UTC (rev 3942) +++ trunk/src/client/psslotmgr.h 2009-07-07 20:11:17 UTC (rev 3943) @@ -48,6 +48,7 @@ bool isPlacing; bool isRotating; + csVector3 pt3d; psPoint basePoint; csArray<pawsSlot*> slotsInUse; @@ -60,7 +61,7 @@ void PlaceItem(); void UpdateItem(); - bool DropItem(); + void DropItem(); csString draggedMesh; csRef<iMeshWrapper> outline; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mg...@us...> - 2009-07-09 06:17:16
|
Revision: 3953 http://planeshift.svn.sourceforge.net/planeshift/?rev=3953&view=rev Author: mgist Date: 2009-07-09 06:17:14 +0000 (Thu, 09 Jul 2009) Log Message: ----------- - Added support for vector3 shadervars to the bgloader. - Improved bgloader comments. Modified Paths: -------------- trunk/src/client/bgloader/loader.cpp trunk/src/client/bgloader/loader.h trunk/src/client/iclient/ibgloader.h Modified: trunk/src/client/bgloader/loader.cpp =================================================================== --- trunk/src/client/bgloader/loader.cpp 2009-07-08 18:15:54 UTC (rev 3952) +++ trunk/src/client/bgloader/loader.cpp 2009-07-09 06:17:14 UTC (rev 3953) @@ -163,6 +163,7 @@ vfsPath = vfs->GetCwd(); } + // Begin document parsing. csRef<iDocumentNode> root = doc->GetRoot()->GetNode("library"); if(!root.IsValid()) { @@ -174,6 +175,7 @@ csRef<iDocumentNode> node; csRef<iDocumentNodeIterator> nodeItr; + // Parse referenced libraries. nodeItr = root->GetNodes("library"); while(nodeItr->HasNext()) { @@ -181,12 +183,14 @@ PrecacheDataTC(ret, false, node->GetContentsValue(), true); } + // Parse needed plugins. node = root->GetNode("plugins"); if(node.IsValid()) { rets.Push(tloader->LoadNode(vfs->GetCwd(), node)); } + // Parse referenced shaders. node = root->GetNode("shaders"); if(node.IsValid()) { @@ -198,6 +202,7 @@ node = node->GetNode("file"); { + // Keep track of shaders that have already been parsed. CS::Threading::ScopedWriteLock lock(sLock); if(shaders.Contains(node->GetContentsValue()) == csArrayItemNotFound) { @@ -208,11 +213,13 @@ if(loadShader) { + // Dispatch shader load to a thread. rets.Push(tloader->LoadShader(vfs->GetCwd(), node->GetContentsValue())); } } } + // Parse all referenced textures. node = root->GetNode("textures"); if(node.IsValid()) { @@ -228,6 +235,7 @@ } } + // Parse all referenced materials. node = root->GetNode("materials"); if(node.IsValid()) { @@ -241,6 +249,7 @@ materials.Put(m->name, m); } + // Parse the texture for a material. Construct a shader variable for it. if(node->GetNode("texture")) { node = node->GetNode("texture"); @@ -264,6 +273,7 @@ node = node->GetParent(); } + // Parse the shaders attached to this material. csRef<iDocumentNodeIterator> nodeItr2 = node->GetNodes("shader"); while(nodeItr2->HasNext()) { @@ -272,12 +282,16 @@ node = node->GetParent(); } + // Parse the shader variables attached to this material. nodeItr2 = node->GetNodes("shadervar"); while(nodeItr2->HasNext()) { node = nodeItr2->Next(); + + // Parse the different types. Currently texture, vector2 and vector3 are supported. if(csString("texture").Compare(node->GetAttributeValue("type"))) { + // Ignore some shader variables if the functionality they bring is not enabled. if(gfxFeatures & (useHighShaders | useMediumShaders | useLowShaders | useLowestShaders)) { if(!strcmp(node->GetAttributeValue("name"), "tex height") || @@ -326,17 +340,25 @@ csScanStr (node->GetContentsValue(), "%f,%f", &sv.vec2.x, &sv.vec2.y); m->shadervars.Push(sv); } + else if(csString("vector3").Compare(node->GetAttributeValue("type"))) + { + ShaderVar sv(node->GetAttributeValue("name"), csShaderVariable::VECTOR3); + csScanStr (node->GetContentsValue(), "%f,%f,%f", &sv.vec3.x, &sv.vec3.y, &sv.vec3.z); + m->shadervars.Push(sv); + } node = node->GetParent(); } } } + // Parse all mesh factories. nodeItr = root->GetNodes("meshfact"); while(nodeItr->HasNext()) { node = nodeItr->Next(); csRef<MeshFact> mf = csPtr<MeshFact>(new MeshFact(node->GetAttributeValue("name"), vfsPath, node)); + // Parse mesh params to get the materials that we depend on. if(node->GetNode("params")->GetNode("material")) { csRef<Material> material; @@ -394,6 +416,7 @@ mf->checked.Push(false); } + // Parse terrain cells for materials. if(node->GetNode("params")->GetNode("cells")) { node = node->GetNode("params")->GetNode("cells")->GetNode("celldefault")->GetNode("basematerial"); @@ -447,6 +470,7 @@ meshfacts.Put(mf->name, mf); } + // Parse all sectors. nodeItr = root->GetNodes("sector"); while(nodeItr->HasNext()) { @@ -460,16 +484,21 @@ s = sectortree.Get(sectorName, csRef<Sector>()); } + // This sector may have already been created (referenced by a portal somewhere else). if(!s.IsValid()) { + // But if not then create its representation. s = csPtr<Sector>(new Sector(sectorName)); CS::Threading::ScopedWriteLock lock(sLock); sectors.Push(s); sectortree.Put(sectorName, s); } + // Get culler properties. s->init = true; s->culler = node->GetNode("cullerp")->GetContentsValue(); + + // Get ambient lighting. if(node->GetNode("ambient")) { node = node->GetNode("ambient"); @@ -478,6 +507,7 @@ node = node->GetParent(); } + // Get water bodies in this sector. csRef<iDocumentNodeIterator> nodeItr2 = node->GetNodes("key"); while(nodeItr2->HasNext()) { @@ -514,6 +544,7 @@ } } + // Get all mesh instances in this sector. nodeItr2 = node->GetNodes("meshobj"); while(nodeItr2->HasNext()) { @@ -521,12 +552,14 @@ csRef<MeshObj> m = csPtr<MeshObj>(new MeshObj(node2->GetAttributeValue("name"), vfsPath, node2)); m->sector = s; + // alwaysloaded ignores range checks. If the sector is loaded then so is this mesh. if(node2->GetAttributeValueAsBool("alwaysloaded")) { ++s->alwaysLoadedCount; m->alwaysLoaded = true; } + // Get world space position. csRef<iDocumentNode> move = node2->GetNode("move"); if(move.IsValid()) { @@ -536,6 +569,7 @@ move = move->GetParent(); } + // Check for a params file and switch to use it to continue parsing. if(node2->GetNode("paramsfile")) { csRef<iDocument> pdoc = docsys->CreateDocument(); @@ -544,6 +578,7 @@ node2 = pdoc->GetRoot(); } + // Parse all materials and shader variables this mesh depends on. csRef<iDocumentNodeIterator> nodeItr3 = node2->GetNode("params")->GetNodes("submesh"); while(nodeItr3->HasNext()) { @@ -664,6 +699,7 @@ } node2 = node2->GetParent(); + // Continue material parsing. if(node2->GetNode("material")) { node2 = node2->GetNode("material"); @@ -684,7 +720,7 @@ node2 = node2->GetParent(); } - + // materialpalette for terrain. if(node2->GetNode("materialpalette")) { nodeItr3 = node2->GetNode("materialpalette")->GetNodes("material"); @@ -745,6 +781,7 @@ meshes.Put(m->name, m); } + // Parse mesh generators (for foliage, rocks etc.) if(gfxFeatures & useMeshGen) { nodeItr2 = node->GetNodes("meshgen"); @@ -815,6 +852,7 @@ } } + // Parse all portals. nodeItr2 = node->GetNodes("portals"); while(nodeItr2->HasNext()) { @@ -824,6 +862,7 @@ csRef<iDocumentNode> node2 = nodeItr3->Next(); csRef<Portal> p = csPtr<Portal>(new Portal(node2->GetAttributeValue("name"))); + // Warping if(node2->GetNode("matrix")) { p->warp = true; @@ -843,6 +882,7 @@ syntaxService->ParseVector(node2->GetNode("ww"), p->ww); } + // Other options. if(node2->GetNode("clip")) { p->clip = true; @@ -886,6 +926,7 @@ } } + // Parse all sector lights. nodeItr2 = node->GetNodes("light"); while(nodeItr2->HasNext()) { @@ -1334,6 +1375,7 @@ } } + // Check all meshes in this sector. for(size_t i=0; i<sector->meshes.GetSize(); i++) { if(!sector->meshes[i]->loading) @@ -1356,6 +1398,7 @@ } } + // Check all meshgen in this sector. for(size_t i=0; i<sector->meshgen.GetSize(); i++) { if(!sector->meshgen[i]->loading) @@ -1374,6 +1417,7 @@ } } + // Check all portals in this sector... and recurse into the sectors they lead to. for(size_t i=0; i<sector->portals.GetSize(); i++) { if(depth < maxPortalDepth && sector->portals[i]->InRange(loadBox)) @@ -1460,6 +1504,7 @@ } } + // Check all sector lights. for(size_t i=0; i<sector->lights.GetSize(); i++) { if(sector->lights[i]->InRange(loadBox)) @@ -1479,8 +1524,10 @@ } } + // Check whether this sector is empty and should be unloaed. if(sector->objectCount == sector->alwaysLoadedCount && sector->object.IsValid()) { + // Unload all 'always loaded' meshes before destroying sector. for(size_t i=0; i<sector->meshes.GetSize(); i++) { if(sector->meshes[i]->alwaysLoaded) @@ -1493,6 +1540,7 @@ } } + // Remove the sector from the engine. engine->GetSectors()->Remove(sector->object); sector->object.Invalidate(); } @@ -1683,14 +1731,15 @@ for(size_t i=0; i<material->shadervars.GetSize(); i++) { + csShaderVariable* var = mat->GetVariableAdd(svstrings->Request(material->shadervars[i].name)); + var->SetType(material->shadervars[i].type); + if(material->shadervars[i].type == csShaderVariable::TEXTURE) { for(size_t j=0; j<material->textures.GetSize(); j++) { if(material->textures[j]->name.Compare(material->shadervars[i].value)) { - csShaderVariable* var = mat->GetVariableAdd(svstrings->Request(material->shadervars[i].name)); - var->SetType(material->shadervars[i].type); csRef<iTextureWrapper> tex = scfQueryInterface<iTextureWrapper>(material->textures[j]->status->GetResultRefPtr()); var->SetValue(tex); break; @@ -1699,10 +1748,12 @@ } else if(material->shadervars[i].type == csShaderVariable::VECTOR2) { - csShaderVariable* var = mat->GetVariableAdd(svstrings->Request(material->shadervars[i].name)); - var->SetType(material->shadervars[i].type); var->SetValue(material->shadervars[i].vec2); } + else if(material->shadervars[i].type == csShaderVariable::VECTOR3) + { + var->SetValue(material->shadervars[i].vec3); + } } ++material->useCount; Modified: trunk/src/client/bgloader/loader.h =================================================================== --- trunk/src/client/bgloader/loader.h 2009-07-08 18:15:54 UTC (rev 3952) +++ trunk/src/client/bgloader/loader.h 2009-07-09 06:17:14 UTC (rev 3953) @@ -53,30 +53,98 @@ BgLoader(iBase *p); virtual ~BgLoader(); + /** + * Plugin initialisation. + */ bool Initialize(iObjectRegistry* _object_reg); + /** + * Sets key settings and performs a shader parse. + * @param gfxFeatures Mask of available graphics features. + * @param loadRange The maximum range within which the loader should check for objects. + */ void Setup(uint gfxFeatures, float loadRange); + /** + * Start loading a material into the engine. Returns 0 if the material is not yet loaded. + * @param failed Pass a boolean to be able to manually handle a failed load. + */ csPtr<iMaterialWrapper> LoadMaterial(const char* name, bool* failed = NULL); + + /** + * Start loading a mesh factory into the engine. Returns 0 if the factory is not yet loaded. + * @param failed Pass a boolean to be able to manually handle a failed load. + */ csPtr<iMeshFactoryWrapper> LoadFactory(const char* name, bool* failed = NULL); + /** + * Pass a data file to be cached. This method will parse your data and add it to it's + * internal world representation. You may then request that these objects are loaded. + * @param recursive Mark true if this is a recursive call (no vfs chdir needed). + * If you don't know, set this to false. + * This call will be dispatched to a thread, so it will return immediately. + * You should wait for parsing to finish before calling UpdatePosition(). + */ THREADED_CALLABLE_DECL2(BgLoader, PrecacheData, csThreadReturn, const char*, path, bool, recursive, THREADEDL, false, false); + + /** + * Update your position in the world. + * Calling this will trigger per-object checks and initiate (un)loading if the object + * is within a given threshold (loadRange). + * @param pos Your world space position. + * @param sectorName The name of the sector that you are currently in. + * @param force Forces the checks to be done (normally they won't if you e.g. haven't moved). + */ void UpdatePosition(const csVector3& pos, const char* sectorName, bool force); + /** + * Call this function to finalise a number of loading objects. + * Useful when you are waiting for a load to finish (load into the world, teleport), + * but want to continue rendering while you wait. + * Will return after processing a number of objects. + * @param waiting Set as 'true' if you wish the loader to not return until all objects are loaded. + */ void ContinueLoading(bool waiting); + /** + * Returns a pointer to the Crystal Space threaded loader. + */ iThreadedLoader* GetLoader() { return tloader; } + /** + * Returns the number of objects currently loading. + */ size_t GetLoadingCount() { return loadingMeshes.GetSize() + finalisableMeshes.GetSize(); } + /** + * Returns a pointer to the object registry. + */ iObjectRegistry* GetObjectRegistry() const { return object_reg; } + /** + * Update the load range initially passed to the loader in Setup(). + */ void SetLoadRange(float r) { loadRange = r; } + /** + * Request to know whether the current world position stored by the loader is valid. + * Returns false until the first call of UpdatePosition(). + */ bool HasValidPosition() const { return validPosition; } + /** + * Request to know whether you are currently positioned in a water body. + * @param sector The sector that you are checking. + * @param pos The world space position that you are checking. + * @param colour Will contain the colour of the water that you are positioned in. + */ bool InWaterArea(const char* sector, csVector3* pos, csColor4** colour) const; + /** + * Returns an array of the available shaders for a given type. + * @param usageType The type of shader you wish to have. + * E.g. 'default_alpha' to get an array of all default world alpha shaders. + */ csPtr<iStringArray> GetShaderName(const char* usageType) const; private: @@ -97,6 +165,10 @@ useAll = (useHighShaders | useShadows | useMeshGen) }; + /******************************************************** + * Data structures representing components of the world. + *******************************************************/ + struct WaterArea { csBox3 bbox; @@ -120,6 +192,7 @@ csShaderVariable::VariableType type; csString value; csVector2 vec2; + csVector3 vec3; ShaderVar(const char* name, csShaderVariable::VariableType type) : name(name), type(type), vec2(0.0f) @@ -343,6 +416,9 @@ csBox3 bbox; }; + /***********************************************************************/ + + /* Internal unloading methods. */ void CleanDisconnectedSectors(Sector* sector); void FindConnectedSectors(csRefArray<Sector>& connectedSectors, Sector* sector); void CleanSector(Sector* sector); @@ -351,6 +427,8 @@ void CleanMeshFact(MeshFact* meshfact); void CleanMaterial(Material* material); void CleanTexture(Texture* texture); + + /* Internal loading methods. */ void LoadSector(const csVector3& pos, const csBox3& loadBox, const csBox3& unloadBox, Sector* sector, uint depth); void FinishMeshLoad(MeshObj* mesh); @@ -360,8 +438,7 @@ bool LoadMaterial(Material* material); bool LoadTexture(Texture* texture); - float loadRange; - + // Pointers to other needed plugins. iObjectRegistry* object_reg; csRef<iEngine> engine; csRef<iTextureManager> txtmgr; @@ -372,21 +449,26 @@ csRef<iStringSet> strings; csRef<iCollideSystem> cdsys; csRef<iSyntaxService> syntaxService; + + // Our load range ^_^ + float loadRange; + + // Currently enabled graphics features. uint gfxFeatures; + + // Whether the current position is valid. bool validPosition; // Limit on how many portals deep we load. static const int maxPortalDepth = 3; + // The last valid sector. csRef<Sector> lastSector; + + // The last valid position. csVector3 lastPos; - csStringArray shaders; - csRefArray<MeshGen> loadingMeshGen; - csRefArray<MeshObj> loadingMeshes; - csRefArray<MeshObj> finalisableMeshes; - csRefArray<MeshObj> deleteQueue; - + // Stores world representation. csHash<csString, csStringID> shadersByUsageType; csRedBlackTreeMap<csString, csRef<Texture> > textures; csRedBlackTreeMap<csString, csRef<Material> > materials; @@ -395,6 +477,13 @@ csRedBlackTreeMap<csString, csRef<Sector> > sectortree; csRefArray<Sector> sectors; + csStringArray shaders; + csRefArray<MeshGen> loadingMeshGen; + csRefArray<MeshObj> loadingMeshes; + csRefArray<MeshObj> finalisableMeshes; + csRefArray<MeshObj> deleteQueue; + + // Locks on the RBTrees. CS::Threading::ReadWriteMutex tLock; CS::Threading::ReadWriteMutex mLock; CS::Threading::ReadWriteMutex mfLock; Modified: trunk/src/client/iclient/ibgloader.h =================================================================== --- trunk/src/client/iclient/ibgloader.h 2009-07-08 18:15:54 UTC (rev 3952) +++ trunk/src/client/iclient/ibgloader.h 2009-07-09 06:17:14 UTC (rev 3953) @@ -27,32 +27,100 @@ struct iObjectRegistry; struct iThreadedLoader; +/** + * Interface to the background loader plugin. + */ struct iBgLoader : public virtual iBase { SCF_INTERFACE(iBgLoader, 1, 3, 0); + /** + * Sets key settings and performs a shader parse. + * @param gfxFeatures Mask of available graphics features. + * @param loadRange The maximum range within which the loader should check for objects. + */ virtual void Setup(uint gfxFeatures, float loadRange) = 0; + /** + * Start loading a material into the engine. Returns 0 if the material is not yet loaded. + * @param failed Pass a boolean to be able to manually handle a failed load. + */ virtual csPtr<iMaterialWrapper> LoadMaterial(const char* name, bool* failed = NULL) = 0; + + /** + * Start loading a mesh factory into the engine. Returns 0 if the factory is not yet loaded. + * @param failed Pass a boolean to be able to manually handle a failed load. + */ virtual csPtr<iMeshFactoryWrapper> LoadFactory(const char* name, bool* failed = NULL) = 0; + /** + * Pass a data file to be cached. This method will parse your data and add it to it's + * internal world representation. You may then request that these objects are loaded. + * @param recursive Mark true if this is a recursive call (no vfs chdir needed). + * If you don't know, set this to false. + * This call will be dispatched to a thread, so it will return immediately. + * You should wait for parsing to finish before calling UpdatePosition(). + */ THREADED_INTERFACE2(PrecacheData, const char* path, bool recursive); + + /** + * Update your position in the world. + * Calling this will trigger per-object checks and initiate (un)loading if the object + * is within a given threshold (loadRange). + * @param pos Your world space position. + * @param sectorName The name of the sector that you are currently in. + * @param force Forces the checks to be done (normally they won't if you e.g. haven't moved). + */ virtual void UpdatePosition(const csVector3& pos, const char* sectorName, bool force) = 0; + /** + * Call this function to finalise a number of loading objects. + * Useful when you are waiting for a load to finish (load into the world, teleport), + * but want to continue rendering while you wait. + * Will return after processing a number of objects. + * @param waiting Set as 'true' if you wish the loader to not return until all objects are loaded. + */ virtual void ContinueLoading(bool waiting) = 0; + /** + * Returns a pointer to the Crystal Space threaded loader. + */ virtual iThreadedLoader* GetLoader() = 0; + /** + * Returns the number of objects currently loading. + */ virtual size_t GetLoadingCount() = 0; + /** + * Returns a pointer to the object registry. + */ virtual iObjectRegistry* GetObjectRegistry() const = 0; + /** + * Update the load range initially passed to the loader in Setup(). + */ virtual void SetLoadRange(float r) = 0; + /** + * Request to know whether the current world position stored by the loader is valid. + * Returns false until the first call of UpdatePosition(). + */ virtual bool HasValidPosition() const = 0; + /** + * Request to know whether you are currently positioned in a water body. + * @param sector The sector that you are checking. + * @param pos The world space position that you are checking. + * @param colour Will contain the colour of the water that you are positioned in. + */ virtual bool InWaterArea(const char* sector, csVector3* pos, csColor4** colour) const = 0; + /** + * Returns an array of the available shaders for a given type. + * @param usageType The type of shader you wish to have. + * E.g. 'default_alpha' to get an array of all default world alpha shaders. + */ virtual csPtr<iStringArray> GetShaderName(const char* usageType) const = 0; }; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |