tge/engine/dgl/materialPropertyMap.cc
2017-04-17 06:17:10 -06:00

172 lines
5.4 KiB
C++
Executable File

//-----------------------------------------------------------------------------
// Torque Game Engine
// Copyright (C) GarageGames.com, Inc.
//-----------------------------------------------------------------------------
#include "dgl/materialPropertyMap.h"
ConsoleFunction( addMaterialMapping, bool, 2, 99, "(string matName, ...) Set up a material mapping. See MaterialPropertyMap for details.")
{
MaterialPropertyMap* pMap = static_cast<MaterialPropertyMap*>(Sim::findObject("MaterialPropertyMap"));
if (pMap == NULL) {
Con::errorf(ConsoleLogEntry::General, "Error, cannot find the global material map object");
return false;
}
return pMap->addMapping(argc - 1, argv + 1);
}
IMPLEMENT_CONOBJECT(MaterialPropertyMap);
MaterialPropertyMap::MaterialPropertyMap()
{
VECTOR_SET_ASSOCIATION(mMapEntries);
}
MaterialPropertyMap::~MaterialPropertyMap()
{
}
const MaterialPropertyMap::MapEntry* MaterialPropertyMap::getMapEntry(StringTableEntry name) const
{
// DMMNOTE: Really slow. Shouldn't be a problem since these are one time scans
// for each object, but might want to replace this with a hash table
//
const MapEntry* ret = NULL;
for (S32 i = 0; i < mMapEntries.size(); i++) {
if (dStricmp(mMapEntries[i].name, name) == 0) {
ret = &mMapEntries[i];
break;
}
}
return ret;
}
const MaterialPropertyMap::MapEntry* MaterialPropertyMap::getMapEntryFromIndex(S32 index) const
{
const MapEntry* ret = NULL;
if(index < mMapEntries.size())
ret = &mMapEntries[index];
return ret;
}
S32 MaterialPropertyMap::getIndexFromName(StringTableEntry name) const
{
S32 ret = -1;
for (S32 i = 0; i < mMapEntries.size(); i++) {
if (dStricmp(mMapEntries[i].name, name) == 0) {
ret = i;
break;
}
}
return ret;
}
MaterialPropertyMap::MapEntry* MaterialPropertyMap::getNCMapEntry(StringTableEntry name)
{
return const_cast<MapEntry*>(getMapEntry(name));
}
bool MaterialPropertyMap::addMapping(const S32 argc, const char** argv)
{
const char* matName = StringTable->insert(argv[0]);
MapEntry* pEntry = getNCMapEntry(matName);
if (pEntry != NULL) {
Con::warnf(ConsoleLogEntry::General, "Warning, overwriting material properties for: %s", matName);
} else {
mMapEntries.increment();
pEntry = &mMapEntries.last();
pEntry->sound = -1;
pEntry->puffColor[0].set(0.0f, 0.0f, 0.0f);
pEntry->puffColor[1].set(0.0f, 0.0f, 0.0f);
}
pEntry->name = matName;
pEntry->detailMapName = NULL;
pEntry->environMapName = NULL;
pEntry->matType = Default;
pEntry->matFlags = 0;
for (U32 i = 1; S32(i) < argc; i++) {
const char* param = argv[i];
if (dStrnicmp(param, "detail:", dStrlen("detail:")) == 0) {
// Set the detail map
const char* pColon = dStrchr(param, ':');
pColon++;
while (*pColon == ' ' || *pColon == '\t')
pColon++;
pEntry->detailMapName = StringTable->insert(pColon);
}
else if (dStrnicmp(param, "environment:", dStrlen("environment:")) == 0) {
// Set the detail map
const char* pColon = dStrchr(param, ':');
pColon++;
while (*pColon == ' ' || *pColon == '\t')
pColon++;
const char* start = pColon;
while (*pColon != ' ')
pColon++;
const char* end = pColon;
pColon++;
char buffer[256];
dStrncpy(buffer, start, end - start);
buffer[end - start] = '\0';
pEntry->environMapName = StringTable->insert(buffer);
pEntry->environMapFactor = dAtof(pColon);
}
else if (dStrnicmp(param, "color:", dStrlen("color:")) == 0) {
const char* curChar = dStrchr(param, ':');
curChar++;
while (*curChar == ' ' || *curChar == '\t')
curChar++;
char buffer[5][256];
S32 index = 0;
for(S32 x = 0; x < 5; ++x, index = 0)
{
while(*curChar != ' ' && *curChar != '\0')
buffer[x][index++] = *curChar++;
buffer[x][index++] = '\0';
while(*curChar == ' ')
++curChar;
}
pEntry->puffColor[0].set(dAtof(buffer[0]), dAtof(buffer[1]), dAtof(buffer[2]), dAtof(buffer[3]));
pEntry->puffColor[1].set(dAtof(buffer[0]), dAtof(buffer[1]), dAtof(buffer[2]), dAtof(buffer[4]));
}
else if (dStrnicmp(param, "sound:", dStrlen("sound:")) == 0) {
// Set the detail map
const char* pColon = dStrchr(param, ':');
pColon++;
while (*pColon == ' ' || *pColon == '\t')
pColon++;
const char* start = pColon;
while(*pColon != ' ' && *pColon != '\0')
pColon++;
const char* end = pColon;
pColon++;
char buffer[256];
dStrncpy(buffer, start, end - start);
buffer[end - start] = '\0';
pEntry->sound = dAtoi(buffer);
}
else if (param[0] == '\0') {
// Empty statement allowed, does nothing
}
else {
Con::warnf(ConsoleLogEntry::General, "Warning, misunderstood material parameter: %s in materialEntry %s", param, matName);
}
}
return true;
}