#pragma once #include "Vec2.h" #include "Array.h" #include "Mat4.h" #include "Zeichnung3D.h" struct ID3D11Buffer; namespace Framework { struct Polygon2D; //! Model2D.h class Textur; //! Textur.h class Model2DData; //! Model2D.h class DXBuffer; //! DXBuffer.h class Render3D; //! Render3D.h class Model3DTextur; //! Model3D.h class Model3DList; //! Model3DList.h class Animation3D; //! Animation3D.h class Welt3D; //! Welt3D.h //! Repräsentiert einen Knochen eines 3D Models. Kann annimiert werden class Knochen { private: Vec3< float > pos; Vec3< float > winkel; Knochen *geschwister; Knochen *kinder; int id; public: //! Konstruktor __declspec( dllexport ) Knochen( int id ); //! Destruktor __declspec( dllexport ) ~Knochen(); //! Setzt die Position des Knochens relativ zum Model Ursprung //! \param pos Die Position __declspec( dllexport ) void setPosition( Vec3< float > &pos ); //! Setzt die Drehung des Knochens relativ zum Model Ursprung //! \param winkel Ein Vektor der die Drehung um die verschiedenen Achsen als Komponenten hat __declspec( dllexport ) void setDrehung( Vec3< float > &winkel ); //! Fügt dem Knochen ein Geschwister Knochen hinzu //! \param k Der Knochen, der hinzugefügt werden soll void addGeschwisterKnochen( Knochen *k ); //! Fügt einem bestimmten Knochen ein Kind Knochen hinzu //! \param id Die id des Knochens, wo der Knochen als Kind hinzugefügt werden soll //! \param k Der Knochen, der hinzugefügt werden soll __declspec( dllexport ) void addKind( int id, Knochen *k ); //! Berechnet die Matrizen des Knochen und die von all seinen Geschwister Knochen und Kind Knochen //! \param elternMat Die fertig berechnete Matrix des Elternknochens //! \param matBuffer Ein Array, in dem alle berechneten Matrizen gespeichert werden sollen //! \param scaleFactor Die skallierung des Objektes //! \param kamMatrix Die vereiniegung der view und projektions Matrizen __declspec( dllexport ) void kalkulateMatrix( Mat4< float > &elternMat, Mat4< float > *matBuffer, float scaleFactor, Mat4< float > &kamMat ); //! Gibt den ersten Geschwisterknochen zurück __declspec( dllexport ) Knochen *zGeschwister() const; //! Gibt den ersten KindKnochen zurück __declspec( dllexport ) Knochen *zKind() const; //! Kopiert den Knochen mit allen Geschwister Knochen und Kind Knochen __declspec( dllexport ) Knochen *kopiereKnochen() const; //! Gibt die Id des Knochens zurück __declspec( dllexport ) int getId() const; //! Gibt die Drehung des Knochens zurück __declspec( dllexport ) Vec3< float > getDrehung() const; //! Gibt die Position des Knochens zurück __declspec( dllexport ) Vec3< float > getPosition() const; //! Gibt den Radius des Knochens zurück float getRadius() const; friend Animation3D; }; //! Repräsentiert alle Knochen eines Models, mit denen es Annimiert werden kann class Skelett { private: Knochen *k; int nextId; int ref; public: //! Konstruktor __declspec( dllexport ) Skelett(); //! Destruktor __declspec( dllexport ) ~Skelett(); //! Gibt die Id des nächsten Knochens zurück und berechnet die neue Id für den Knochen danach //! Es können maximal MAX_KNOCHEN_ANZ Knochen für ein Skelett existieren. Wenn diese Zahl überschritten wird, so wird -1 zurückgegeben __declspec( dllexport ) int getNextKnochenId(); //! setzt die Id des nächsten Knochens //! \param id die nächste id __declspec( dllexport ) void setNextKnochenId( int id ); //! Fügt dem Skellet einen Knochen hinzu //! \param k Der Knochen //! \param elternId Die Id des Eltern Knochens. Wenn der Knochen kein Elternknochen besitzt, kannder Parameter weggelassen werden. __declspec( dllexport ) void addKnochen( Knochen *k, int elternId = -1 ); //! Berechnet die Matrizen der Knochen //! \param modelMatrix Die Matrix, die das Skelett in den Raum der Welt transformiert //! \param matBuffer Ein Array von Matrizen, der durch die Knochen Matrizen gefüllt wird //! \param scaleFactor Die skallierung des Objektes //! \param kamMatrix Die vereiniegung der view und projektions Matrizen //! \return gibt die Anzahl der verwendeten Matrizen zurück __declspec( dllexport ) int kalkulateMatrix( Mat4< float > &modelMatrix, Mat4< float > *matBuffer, float scaleFactor, Mat4< float > &kamMatrix ); //! Berechnet den Radius des Skeletts __declspec( dllexport ) float getRadius() const; //! gibt den Wurzel Knochen zurück __declspec( dllexport ) Knochen *zKnochen() const; //! Kopiert das Skelett __declspec( dllexport ) Skelett *kopiereSkelett() const; //! Gibt die id des nächsten Knochens zurück ohne sie zu erhöhen __declspec( dllexport ) int zNextKnochenId() const; //! Erhöht den Reference Counting Zähler. //! \return this. __declspec( dllexport ) Skelett *getThis(); //! Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Zeichnung automatisch gelöscht. //! \return 0. __declspec( dllexport ) Skelett *release(); friend Animation3D; }; //! Eine struktor um für eine Ecke eines 3D Models die Raum Position, die Textur Koordinaten und den zugehörigen Knochen speichert struct Vertex3D { Vec3< float > pos; //! Die Position der Ecke basierend zur Position des Knochens Vec2< float > tPos; //! Die Textur Koordinaten der Ecke Vec3< float > normal; //! Die Normale (zeigt nach außen und steht senkrecht auf der Oberfläche des models) int knochenId; //! Die Id des Knochens, mit dem sich die Ecke bei einer Annimation mitbewegt }; //! Eine Struktur, die alle Dreiecke eines 3D Polygons speichert struct Polygon3D { int *indexList; //! Die Liste mit den IDs der Ecken int indexAnz; //! Die Länge der Liste mit den Ids der Ecken //! Konstruktor __declspec( dllexport ) Polygon3D(); //! Destruktor __declspec( dllexport ) ~Polygon3D(); }; //! Speichert alle Geometrischen Daten eines Modells, also //! Raum - und Textur Koordinaten und Knochenzugehörigkeit aller Eckpunkte class Model3DData { private: Skelett *skelett; Vertex3D *vertexList; int vertexCount; Array< Polygon3D * > *polygons; float ambientFactor; float diffusFactor; float specularFactor; float radius; int id; int ref; public: //! Konstruktor __declspec( dllexport ) Model3DData(); //! Destruktor __declspec( dllexport ) ~Model3DData(); //! Löscht alle Model daten __declspec( dllexport ) void clearModel(); //! Berechnet die normalen für die Eckpunkte des Modells __declspec( dllexport ) void calculateNormals(); //! Setzt den Zeiger auf ein standartmäßig verwendete Skelett //! \param s Das Skelett, das verwendet werden soll __declspec( dllexport ) void setSkelettZ( Skelett *s ); //! Setzt einen Zeiger auf eine Liste mit allen Vertecies des Models //! \param vertexList Ein Array mit Vertecies //! \param anz Die Anzahl der Vertecies im Array __declspec( dllexport ) void setVertecies( Vertex3D *vertexList, int anz ); //! Fügt ein Polygon zum Model hinzu //! \param polygon Das Polygon, das hinzugefügt erden soll __declspec( dllexport ) void addPolygon( Polygon3D *polygon ); //! Git den Factor an, mit dem das umgebungslicht (textur farbe) multipliziert wird //! \param f der neue Faktor (von 0 bis 1, ambient + specular + diffuse = 1) __declspec( dllexport ) void setAmbientFactor( float f ); //! Git den Factor an, mit dem die Lichtfarbe von Lichtquellen multipliziert wird //! \param f der neue Faktor (von 0 bis 1, ambient + specular + diffuse = 1) __declspec( dllexport ) void setDiffusFactor( float f ); //! Git den Factor an, mit dem die Reflektion von Lichtquellen multipliziert wird //! \param f der neue Faktor (von 0 bis 1, ambient + specular + diffuse = 1) __declspec( dllexport ) void setSpecularFactor( float f ); //! Konvertiert ein 2d Model zu 3D //! \param model Das 2d Model, das zu 3d konvertiert werden soll //! \param z Die z koordinate aller punkte des Models __declspec( dllexport ) void copyModel2D( Model2DData *model, float z ); //! Entfernt ein Polygon //! \param index Der Index des Polygons __declspec( dllexport ) void removePolygon( int index ); //! Berechnet die Matrizen der Knochen des Standart Skeletts //! \param modelMatrix Die Matrix, die das Skelett in den Raum der Welt transformiert //! \param matBuffer Ein Array von Matrizen, der durch die Knochen Matrizen gefüllt wird //! \param scaleFactor Die Skallierung des Modells //! \param kamMatrix Die vereiniegung der view und projektions Matrizen //! \return gibt die Anzahl der verwendeten Matrizen zurück. 0, falls kein Standart Skelett gesetzt wurde int kalkulateMatrix( Mat4< float > &modelMatrix, Mat4< float > *matBuffer, float scaleFactor, Mat4< float > &kamMatrix ) const; //! Gibt die Anzahl an Polygonen zurück __declspec( dllexport ) int getPolygonAnzahl() const; //! Gibt ein bestimmtes Polygon zurück //! \param index Der Index des Polygons __declspec( dllexport ) Polygon3D *getPolygon( int index ) const; //! Gibt einen Iterator zurück, mit dem sich die Polygons auflisten lassen __declspec( dllexport ) Iterator< Polygon3D * > getPolygons() const; //! Gibt den radius einer Kugel zurück, die das gesammte Model umschließt __declspec( dllexport ) float getRadius() const; //! Gibt die Id der Daten zurück, wenn sie in einer Model3DList registriert wurden. (siehe Framework::zM3DRegister()) __declspec( dllexport ) int getId() const; //! Git den Factor an, mit dem das umgebungslicht (textur farbe) multipliziert wird __declspec( dllexport ) float getAmbientFactor() const; //! Git den Factor an, mit dem die Lichtfarbe von Lichtquellen multipliziert wird __declspec( dllexport ) float getDiffusFactor() const; //! Git den Factor an, mit dem die Reflektion von Lichtquellen multipliziert wird __declspec( dllexport ) float getSpecularFactor() const; //! Gibt eine Kopie des Skeletts zurück, welches für annimationen verwendet werden kann __declspec( dllexport ) Skelett *copySkelett() const; //! Gibt die Anzahl an Vertices zurück __declspec( dllexport ) int getVertexAnzahl() const; //! Gibt einen Buffer mit allen Vertecies des Models zurück __declspec( dllexport ) const Vertex3D *zVertexBuffer() const; //! Erhöht den Reference Counting Zähler. //! \return this. __declspec( dllexport ) Model3DData *getThis(); //! Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Zeichnung automatisch gelöscht. //! \return 0. __declspec( dllexport ) Model3DData *release(); friend Model3DList; }; //! Speichert eine Liste mit Texturen und für welche Polygone welche Textur benutzt werden soll class Model3DTextur { private: RCArray< Textur > *textures; int ref; public: //! Konstruktor __declspec( dllexport ) Model3DTextur(); //! Destruktor __declspec( dllexport ) ~Model3DTextur(); //! Legt fest, welche Textur für welches Polygon ist //! \param pI Der Index des Polygons //! \param txt Die Textur des Polygons __declspec( dllexport ) void setPolygonTextur( int pI, Textur *txt ); //! Gibt einen Zeiger auf die Textur eines Polygons zurück ohne erhöhten Reference Counter //! \param i Der Index des Polygons __declspec( dllexport ) Textur *zPolygonTextur( int i ) const; //! Erhöht den Reference Counting Zähler. //! \return this. __declspec( dllexport ) Model3DTextur *getThis(); //! Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Zeichnung automatisch gelöscht. //! \return 0. __declspec( dllexport ) Model3DTextur *release(); }; //! Eine Zeichnung des 3D Frameworks, die ein 3D Model mit Textur und Animation darstellen kann class Model3D : public Zeichnung3D { protected: struct AnimationData { Animation3D *a; double speed; double offset; AnimationData *getThis(); AnimationData *release(); }; Skelett *skelett; Model3DData *model; Model3DTextur *textur; RCArray< AnimationData > *animations; float ambientFactor; float diffusFactor; float specularFactor; public: //! Konstruktor __declspec( dllexport ) Model3D(); //! Destruktor __declspec( dllexport ) virtual ~Model3D(); //! Fügt eine Animation hinzu //! \param a Die neue Animation __declspec( dllexport ) void addAnimation( Animation3D *a, double speed = 1 ); //! Entfernt eine Animation //! \param zA Die zu entfernende Animation __declspec( dllexport ) void removeAnimation( Animation3D *zA ); //! Setzt die Daten des Models //! \param data Die Daten __declspec( dllexport ) void setModelDaten( Model3DData *data ); //! Setzt die zum Zeichnen zu benutzenden Texturen //! \param txt Ein Liste mit Texturen zu den verschiedenen Polygonen zugeordnet __declspec( dllexport ) void setModelTextur( Model3DTextur *txt ); //! Git den Factor an, mit dem das umgebungslicht (textur farbe) multipliziert wird //! \param f der neue Faktor (von 0 bis 1, ambient + specular + diffuse = 1) __declspec( dllexport ) void setAmbientFactor( float f ); //! Git den Factor an, mit dem die Lichtfarbe von Lichtquellen multipliziert wird //! \param f der neue Faktor (von 0 bis 1, ambient + specular + diffuse = 1) __declspec( dllexport ) void setDiffusFactor( float f ); //! Git den Factor an, mit dem die Reflektion von Lichtquellen multipliziert wird //! \param f der neue Faktor (von 0 bis 1, ambient + specular + diffuse = 1) __declspec( dllexport ) void setSpecularFactor( float f ); //! Errechnet die Matrizen aller Knochen des Skeletts des Models //! \param viewProj Die miteinander multiplizierten Kameramatrizen //! \param matBuffer Ein Array mit Matrizen, der gefüllt werden soll //! \return Die Anzahl der Matrizen, die das Model benötigt __declspec( dllexport ) int errechneMatrizen( Mat4< float > &viewProj, Mat4< float > *matBuffer ) override; //! Verarbeitet die vergangene Zeit //! \param tickval Die zeit in sekunden, die seit dem letzten Aufruf der Funktion vergangen ist //! \return true, wenn sich das Objekt verändert hat, false sonnst. __declspec( dllexport ) virtual bool tick( double tickval ) override; //! Gibt die Textur zurück __declspec( dllexport ) Model3DTextur *getTextur(); //! Gibt die Textur zurück (ohne erhöhten Reference Counter) __declspec( dllexport ) Model3DTextur *zTextur(); //! Gibt die ModelDaten zurück __declspec( dllexport ) Model3DData *getModelData(); //! Gibt die ModelDaten zurück (ohne erhöhten Reference Counter) __declspec( dllexport ) Model3DData *zModelData(); //! prüft, ob ein Strahl dieses Objekt trifft //! \param point der startpunkt des Strahls in Weltkoordinaten //! \param dir die Richtung des Strahls in Weltkoordinaten //! \param maxSqDist Die maximale quadratische distanz die erlaubt ist //! \param pId die Id des Polygons, zu dem der Schnittpunkt gehört //! \return den quadratischen Abstand des Schnittpunktes zum Ursprung des Strahls oder -1, wenn kein schnittpunkt existiert __declspec( dllexport ) virtual float traceRay( Vec3< float > &point, Vec3< float > &dir, float maxSqDist, int &pId ) const; //! berechnet die Farbe des Schnittpunktes deines Strahls //! \param point der startpunkt des Strahls in Weltkoordinaten //! \param dir die Richtung des Strahls in Weltkoordinaten //! \param zWelt die Welt, aus der der Strahl kommt //! \return die Farbe des Schnittpunktes __declspec( dllexport ) virtual int traceRay( Vec3< float > &point, Vec3< float > &dir, int pId, Welt3D *zWelt ) const; //! Gibt die Id der Daten zurück, wenn sie in einer Model3DList registriert wurden. (siehe Framework::zM3DRegister()) __declspec( dllexport ) int getDatenId() const; //! Git den Factor an, mit dem das umgebungslicht (textur farbe) multipliziert wird __declspec( dllexport ) float getAmbientFactor() const; //! Git den Factor an, mit dem die Lichtfarbe von Lichtquellen multipliziert wird __declspec( dllexport ) float getDiffusFactor() const; //! Git den Factor an, mit dem die Reflektion von Lichtquellen multipliziert wird __declspec( dllexport ) float getSpecularFactor() const; //! Gibt die Anzahl an Vertices zurück __declspec( dllexport ) int getVertexAnzahl() const; //! Gibt einen Buffer mit allen Vertecies des Models zurück __declspec( dllexport ) const Vertex3D *zVertexBuffer() const; }; }