Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Dr. Best Senior JLI'ler
Alter: 34 Anmeldedatum: 17.06.2004 Beiträge: 269 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 19.09.2006, 18:31 Titel: Enumeration - Namensstring zu Wert, geht das? |
|
|
Tach,
ich hab nur ne kurze Frage. Wenn's nicht geht hab ich schon ne aufwendigere Lösung parat.
Ich möchte ein Dateiformat zur Verwaltung von Effekten schreiben. Dieses soll auch beinhalten welche Shaderkonstante was für eine Information erhält (zum Beispiel Welttransformationsmatrix, Materialfarbe oder Lichtrichtung). In meinem Programm habe ich das über eine Enumeration gelöst. Aber wie soll ich das jetzt in dem Dateiformat machen? Wenn ich einfach die Werte der Enumeration in das Dateiformat schreibe wäre das sehr inflexibel und unpraktisch. Daher wäre es mir lieber wenn ich im Dateiformat zum Beispiel so etwas schreiben könnte:
Vertex_Shader_Constant 4 VS_CONST_WORLD_TRANS_1
Um der vierten Vertexshaderkonstante die erste Zeile der Welttransformationsmatrix zuzuweisen. Doch um das so machen zu können bräuchte ich eine Möglichkeit aus der String, die den Namen des gewünschten Werts enthält den entsprechenden Wert zu kriegen. Gibt es da irgendeine direkte Möglichkeit für?
Ansonsten werde ich einfach ein Stringarray mit den Namen anlegen und nach dem richtigen Suchen. Aber das wäre sicherlich nicht die schönste Lösung. Also, für jede hilfreiche Antwort bin ich dankbar . |
|
Nach oben |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 19.09.2006, 18:59 Titel: |
|
|
Doch ich dneke schon, das eine Tabelle die schönste Lösung ist. Anders wirds wohl nicht gehen, da ja irgendwie kein logischer Zusammenhang zwischen Name und Wert besteht. Es mag auch DX Funktionen geben, die von Konstanten den String, bzw. den Wert zurückgeben, aber letzendlich wird das alles über Tabellen laufen. _________________ https://jonathank.de/games/ |
|
Nach oben |
|
|
Dragon Super JLI'ler
Alter: 38 Anmeldedatum: 24.05.2004 Beiträge: 340 Wohnort: Sachsen Medaillen: Keine
|
Verfasst am: 19.09.2006, 19:16 Titel: |
|
|
Mach es doch mit einer std::map. Das sollte am einfachsten sein.
CPP: | std::map<std::string, DWORD> CONSTMAP;
// und so fügst du dann alles ein
CONSTMAP["VS_CONST_WORLD_TRANS_1"] = VS_CONST_WORLD_TRANS_1;
// und über einen string bekommst du die Konstante
std::string blabla = "VS_CONST_WORLD_TRANS_1";
DWORD iConst = CONSTMAP[blabla];
|
Okey, das war jetzt aus dem Kopf. Mit einem Makro kannst du dass einfügen der Konstanten noch vereinfachen. Aber das bekomme ich nicht aus dem Kopf hin. _________________ Nur wenn man ein Ziel sieht, kann man es auch treffen.
___________
Mein Leben, Freunde und die Spieleentwicklung |
|
Nach oben |
|
|
Dr. Best Senior JLI'ler
Alter: 34 Anmeldedatum: 17.06.2004 Beiträge: 269 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 19.09.2006, 19:38 Titel: |
|
|
Na, wenn's nicht geht werd ich's wohl über ne Liste angehen. Allerdings ehr über klassische char-Arrays. Ich definiere einfach einmal als Membervariable einer Klasse zur Verwaltung von gemeinsamen Daten ein Array von 32*Anzahl der Enumerationselemente chars und schreibe dann eine Memberfunktion um in diesem Array per strcmp die richtige String zu finden. Dabei ist wenigstens die Erstellung des Arrays kein großer Aufwand und lässt sich recht einfach aktualisieren wenn sich etwas ändert:
CPP: | char VSConstantEnumName[9][32]={
"PS_CONST_MANUAL_SETTABLE",
"PS_CONST_LIGHT_AMBIENT_COLOR",
"PS_CONST_LIGHT0_COLOR",
"PS_CONST_LIGHT1_COLOR",
"PS_CONST_LIGHT2_COLOR",
"PS_CONST_MAT_AMBIENT",
"PS_CONST_MAT_DIFFUSE",
"PS_CONST_MAT_EMISSIVE"
}; |
Der Arrayindex is dann der Enumerationswert. |
|
Nach oben |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 19.09.2006, 20:43 Titel: |
|
|
Mit welcher Shadersprache arbeitest du? HLSl bietet zB wirklich ne gigantische Menge an Möglichkeiten die Daten gut zu nutzen. _________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
Nach oben |
|
|
Dr. Best Senior JLI'ler
Alter: 34 Anmeldedatum: 17.06.2004 Beiträge: 269 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 19.09.2006, 21:19 Titel: |
|
|
Ich arbeite immernoch mit D3D 8 (hängt mit der Zielgruppe meiner Engine zusammen). Entsprechend schreibe ich meine Shader in Assemblercode ohne große Nutzung von D3DX, also auch ohne fx-dateien. |
|
Nach oben |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 20.09.2006, 14:43 Titel: |
|
|
Ich würde dann doch eher std::string benutzen. Das Array kann antürlich coonstant und sttic sein. _________________ https://jonathank.de/games/ |
|
Nach oben |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 20.09.2006, 15:35 Titel: |
|
|
funktioniert nicht auch ne std::map?
CPP: | struct r_ConstTable
{
enum Enumeration
{
CONST1,
CONST2,
...
}
};
std::map<r_ConstTable::Enumeration, std::string> m_ConstTableMap; |
Edit: Mist Dragon hats ja schon vorgeschlagen _________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
Nach oben |
|
|
Dr. Best Senior JLI'ler
Alter: 34 Anmeldedatum: 17.06.2004 Beiträge: 269 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 20.09.2006, 17:17 Titel: |
|
|
Ich denke das Array ist für mich doch die einfachste Lösung. Ich verwende in meinem Code zur Zeit kaum die STL und müsste einiges abändern um sie sicher anwenden zu können.
Um es mal mit der Aufteilung von C++ in vier Teilsprachenauszudrücken, die in Tipp 1 von Effektiv C++ Programmieren beschrieben wird, könnte man sagen, dass ich ehr den C mit Klassen Teil verwende und die STL größtenteils außer Acht lasse. Ich weiß, dass das nicht unbedingt überall sinnvoll ist und ich werde es vielleicht auch irgendwann mal ändern.
Aber für dieses Problem werde ich jetzt erstmal bei dieser Lösung bleiben. Ein klarer Vorteil davon ist auch, dass ich um aus der Enumeration das Stringarray zu machen lediglich eine Kopie des Codes machen muss in der ich ein paar Sachen automatisch ersetzen lasse. Außerdem ist es ja wirklich keine besonders große Arbeit eine Schleife mit ein paar strcmp if-statements zu schreiben. |
|
Nach oben |
|
|
David Super JLI'ler
Alter: 39 Anmeldedatum: 13.10.2005 Beiträge: 315
Medaillen: Keine
|
Verfasst am: 21.09.2006, 14:25 Titel: |
|
|
Vorschlag:
CPP: | #include <iostream>
#include <string>
#include <algorithm>
#include <functional>
template< typename Type >
struct funct_cmp : public std::binary_function< std::pair< std::string, Type >, const std::string, bool >
{
bool operator()( const std::pair< std::string, Type > &p1, const std::string &name ) const
{
return p1.first == name;
}
};
template< typename Type >
inline Type find_type( const std::string &name, const std::pair< std::string, Type > *Container, std::size_t size )
{
const std::pair< std::string, Type > *result =
std::find_if( Container, Container+size-1, std::bind2nd( funct_cmp< Type >(), name ) );
if ( result == Container+size )
throw std::logic_error( "No result found" );
return result->second;
}
#define ENUM_START( Type, Name ) struct std::pair< std::string, Type > Name[] = {
#define ENUM( Ident, Value ) std::make_pair( #Ident, Value ),
#define ENUM_END() };
ENUM_START( int, Constants )
ENUM( FOO1, 1 )
ENUM( FOO2, 2 )
ENUM( FOO3, 3 )
ENUM_END()
int main()
{
try
{
std::cout << find_type< int >( "FOO3", Constants, 3 );
}
catch ( std::logic_error &e )
{
std::cout << e.what();
}
}
|
Ist zwar STL allerdings kannst du das auch recht schnell ohne STL konvertieren. Ich finde der Array-Vorschlag ist irgendwie unschön da die Werte in einer Enumeration auch nicht stetig ansteigend sind sondern frei wählbar sein dürfen.
grüße |
|
Nach oben |
|
|
Dr. Best Senior JLI'ler
Alter: 34 Anmeldedatum: 17.06.2004 Beiträge: 269 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 21.09.2006, 15:34 Titel: |
|
|
Dann hätte ich ja garkeine Enumeration mehr und keinen eigenen Datentyp für diese Information . Um meinen Code darauf anzupassen wären schon größere Änderungen nötig. Außerdem wäre es für andere Nutzer meiner Engine sehr unkomfortabel.
Da finde ich die Arraylösung sehr viel angenehmer. Da hat man dann nur ein zusätzliches Array und eine Memberfunktion, ändern muss man nix. Und wenn es mal dazu kommen sollte, dass ich den Enumerationselementen Manuell Werte zuweisen muss, was ehr unwahrscheinlich ist kann ich ja einfach eine Struktur die eine char[32] string und eine integer enthält erstellen und das Array dann mit fast der gleichen Schreibweise erstellen. |
|
Nach oben |
|
|
David Super JLI'ler
Alter: 39 Anmeldedatum: 13.10.2005 Beiträge: 315
Medaillen: Keine
|
Verfasst am: 21.09.2006, 15:54 Titel: |
|
|
Wenn du meinst... |
|
Nach oben |
|
|
|