Ne znam kako da pocnem da objasnim ono sto mi treba, valjda ce te razumeti.
Pratim jedan NGD (Newton Game Dynamics) physics tutorijal vezan za materijale i njihovu interakciju.
http://newtondynamics.com/wiki/index.php5?title=Tu.....ial_System
Ako pogledate klasu MaterialManager, ocigledno autor tog tutorijala je veliki ljubitelj C jezika, a i da se videti da je bez potrebe preterao sa "obfuskacijom" koda (verovatno da prikaze sebi da je "kul" a nije jedini koji tako radi, a usto me mnogo nerviraju tako sa tim stilom ), u vezi generisanja hash-eva za parove materijala.
Pa sam resio da to sebi uprostim sa klasama iz C++ standardne biblioteke koje vec imaju te funkcionalnosti a "skrivaju" nepotrebne detalje:
#include <iostream>
#include <unordered_map>
// tipovi materijala
enum E_MAT_TYPE
{
EMT_WOOD = 0,
EMT_CONCRETE = 1,
EMT_WATER = 2,
EMT_DIRT = 3,
EMT_METAL = 4
};
// par materijala
// npr. { EMT_WOOD, EMT_DIRT } je isto sto i { EMT_DIRT, EMT_WOOD }
struct MatPair
{
int id0;
int id1;
MatPair(int _id0, int _id1)
: id0(_id0), id1(_id1)
{}
bool operator == (const MatPair& o) const
{
if((id0 == o.id0 && id1 == o.id1) || (id0 == o.id1 && id1 == o.id0))
return true;
return false;
}
};
// fizicke interakcije izmedju parova
struct MatInteraction
{
//float restitution;
//float staticFriction;
//float kineticFriction;
float value; // samo za test
};
// iz WIKI artikla
namespace std
{
template <>
class hash<MatPair>
{
public :
size_t operator () (const MatPair& m ) const
{
return hash<int>()(m.id0) ^ hash<int>()(m.id1);
}
};
}
class MatInterManager
{
private:
std::unordered_map<MatPair, MatInteraction> mMat;
// ako nema u mMap onda koristimo default
MatInteraction defInteraction;
public:
MatInterManager()
{
defInteraction.value = 0.0f;
}
// ova metoda se poziva samo u procesu "ucitavanja"
void addInteraction(int id0, int id1, const MatInteraction& mInt)
{
mMat[MatPair(id0, id1)] = mInt;
}
// ova metoda se poziva vise puta u jednom frejmu
// pa je neophodno da bude brza
MatInteraction getInteraction(int id0, int id1)
{
auto it = mMat.find(MatPair(id0, id1));
if(it != mMat.end())
return (*it).second;
return defInteraction;
}
};
// test
int main()
{
MatInteraction intWoodConcrete = { 1.0f };
MatInteraction intWoodWater = { 2.0f };
MatInteraction intWoodDirt = { 3.0f };
MatInteraction intWoodMetal = { 4.0f };
MatInterManager mgr;
mgr.addInteraction(EMT_WOOD, EMT_CONCRETE, intWoodConcrete);
mgr.addInteraction(EMT_WOOD, EMT_WATER, intWoodWater);
mgr.addInteraction(EMT_WOOD, EMT_DIRT, intWoodDirt);
mgr.addInteraction(EMT_WOOD, EMT_METAL, intWoodMetal);
auto inter0 = mgr.getInteraction(EMT_DIRT, EMT_WOOD); // treba da vrati "intWoodDirt"
std::cout << "DIRT + WOOD = " << inter0.value << std::endl;
auto inter1 = mgr.getInteraction(EMT_DIRT, EMT_DIRT); // treba da vrati default
std::cout << "DIRT + DIRT = " << inter1.value << std::endl;
return 0;
}
Nije mi jasno generisanje hash-eva (isecak sto sam uzeo iz WIKI artikla), odnosno da li mi je ovako garantovana unikatnost parova elemenata?
Imate mozda bolju ideju?
Ako treba jos detalja, recite pa da dodam.
Hvala na izdvojenom vremenu.
|