#pragma once #include #include #include "Array.h" #include "Mat3.h" #include "Punkt.h" #include "Rect2.h" namespace Framework { typedef Vec2< float > Vertex; class Bild; struct WeltInfo { float airResistance; bool hasSize; bool circular; Punkt size; }; class Object2D { protected: std::queue< std::function< void() > > actions; Vertex position; Vertex speed; float rSpeed; float rotation; float size; bool collision; int ref; public: __declspec( dllexport ) Object2D(); __declspec( dllexport ) virtual ~Object2D(); // Übergibt einen Void Funktionspointer auf eine Aktion die einmalig vom Hauptthread ausgeführt werden soll. (Passiert nach dem Tick) __declspec( dllexport ) void postAction( std::function< void() > action ); // Fügt einen Schub in die ausbreitungsrichtung der Explusion zur Bewegung des Objektes hinzu // worldPos: Die Position des Explusionsuhrsprungs // intensity: Die Intensität der Explusion __declspec( dllexport ) void explosion( Vertex worldPos, float intensity ); // Übt auf das Objekt einen Impuls aus, der sowohl die geschwindigkeit, als auch die Drehungsgeschwindigkeit des Objektes beeinflusst // start: Die Startposition des Impulses in der Welt // speed: Die Geschwindigkeit des Impulses in der Welt // strength: Stärke des aufpralls __declspec( dllexport ) virtual void impuls( Vertex start, Vertex speed, float strength = 1.f ); // Setzt die Geschwindigkeit des Objektes in der Welt // speed: Anzahl der zurückgelegten Koordinaten pro Sekunde __declspec( dllexport ) void setSpeed( Vertex speed ); // Setzt die Geschwindigkeit des Objektes in der Welt // x: Anzahl der zurückgelegten x Koordinaten pro Sekunde // y: Anzahl der zurückgelegten y Koordinaten pro Sekunde __declspec( dllexport ) void setSpeed( float x, float y ); // Setzt die Position des Objektes in der Welt // pos: Die Position in Weltkoordinaten __declspec( dllexport ) void setPosition( Vertex pos ); // Setzt die Position des Objektes in der Welt // x: Die X Position in Weltkoordinaten // y: Die Y Position in Weltkoordinaten __declspec( dllexport ) void setPosition( float x, float y ); // Setzt die Rotationsgeschwindigkeit in Radiant pro Sekunde // ds: Die neue Rptationsgeschwindigkeit __declspec( dllexport ) void setDrehungSpeed( float ds ); // Setzt die Drehung des Models gegen den Uhrzeigersinn // drehung: Der winkel in Bogenmas __declspec( dllexport ) void setDrehung( float drehung ); // Fügt zum aktuellen Drehungswinkel etwas hinzu // drehung: Der Winkel in Bogenmas, der hinzugefügt werden soll __declspec( dllexport ) void addDrehung( float drehung ); // Setzt die Skallierung des Modells // size: Der Faktor, mit dem Skalliert wird __declspec( dllexport ) void setSize( float size ); // Addiert zur Skallierung einen bestimmten Wert hinzu // size: Der Wert, der zur skallierung hinzugefügt werden soll __declspec( dllexport ) void addSize( float size ); // Legt fest, ob andere Objekte mit diesem Objekt zusammenschtoßen können // handle: 0, falls keine Kollisionen existieren __declspec( dllexport ) void setCollision( bool handle ); // Prüft ob eine Collision mit einem anderen Objekt vorliegt und passt die Geschwindigkeiten beider Objekte entsprechend an __declspec( dllexport ) virtual bool handleCollision( Object2D *obj ); // Verarbeitet vargangene Zeit und aktualisiert die Position und die Drehung des Objektes in der Welt // zeit: Die vergangene Zeit in Sekunden __declspec( dllexport ) virtual bool tick( const WeltInfo &info, double zeit ); // Zeichnet das Objekt in ein Bild // kamMat: Due Kamera Matrix, welche einen Punkt aus Weltkoordinaten in Bildschirmkoordinaten umwandelt // zRObj: Das Bild, in welches gezeichnet werden soll // ignoreTransparentFlag: wenn 1, dann werden auch collisionen mit transparenten polygonen beachtet virtual void render( Mat3< float > &kamMat, Bild &zRObj, const char *ignoreTransparentFlag ) = 0; // Gibt zurück, ob ein Punkt in dem Objekt enthalten ist // p: Der Punkt // ignoreTransparentFlag: wenn 1, dann werden auch collisionen mit transparenten polygonen beachtet __declspec( dllexport ) virtual bool istPunktInnen( Vertex p, bool ignoreTransparentFlag = 0 ) const; // Überprüft, ob eine Linie im Objekt enthalten ist // a: Der startpunkt der Linie // b: Der endpunkt der Linie // ignoreTransparentFlag: wenn 1, dann werden auch collisionen mit transparenten polygonen beachtet __declspec( dllexport ) virtual bool istLinieInnen( Vertex a, Vertex b, bool ignoreTransparentFlag = 0 ) const; // Überprüft, ob sich das Objekt mit einem anderen Überschneidet // zObj: Ein Zeiger auf das andere Objekt ohne erhöhten Reference Counter // sp: Ein Zeiger auf einen Punkt, in dem der Schnittpunkt gespeichert wird // end: 0, falls alle Ecken beider Objekte überprüft werdden sollen. 1, falls nur die Punkte dieses Models im anderen gesucht werden sollen __declspec( dllexport ) virtual bool istModelInnen( const Object2D *zObj, Vertex *sp = 0, bool end = 0, bool ignoreTransparent = 0 ) const; // Gibt eine Matrix zurück, welche einen Punkt aus Objektkoordinaten in Bildschirmkoordinaten umrechnet __declspec( dllexport ) Mat3< float > getObjectMatrix() const; // Gibt eine Matrix zurück, welche einen Punkt aus Bildschirmkoordinaten in Objektkoordinaten umrechnet __declspec( dllexport ) Mat3< float > getInverseObjectMatrix() const; // Rechnet einen Punkt aus Welt Koordinaten in Objektkoordinaten um // worldPos: Die Position des Punktes in der Welt __declspec( dllexport ) Vertex getObjectPos( Vertex worldPos ) const; // Rechnet eine Richtung aus Weltkoordinaten in Objektkoordinaten um // worldDir: Die Richtung in Weltkoordinaten __declspec( dllexport ) Vertex getObjectDir( Vertex worldDir ) const; // Rechnet einen Punkt aus Objektkoordinaten in Weltkoordinaten um // worldPos: Die Position des Punktes in Objektkoordinaten __declspec( dllexport ) Vertex getWorldPos( Vertex objectPos ) const; // Rechnet eine Richtung aus Objektkoordinaten in Weltkoordinaten um // worldDir: Die Richtung in Objektkoordinaten __declspec( dllexport ) Vertex getWorldDir( Vertex objectDir ) const; // Gibt die Geschwindigkeit des Objektes zurück __declspec( dllexport ) Vertex getSpeed() const; // gibt die Position des Objektes zurück __declspec( dllexport ) Vertex getPosition() const; // gibt die Drehgeschwindigkeit des Objektes zurück __declspec( dllexport ) float getDrehungSpeed() const; // gibt die Drehung des Objektes zurück __declspec( dllexport ) float getDrehung() const; // gibt den Skallierungs Objektes zurück __declspec( dllexport ) float getSize() const; // Gibt eine Boundingbox zurück, in der sich alle Punkte des Objektes befinden ( in Weltkoordinaten) __declspec( dllexport ) virtual Rect2< float > getBoundingBox() const = 0; // Bestimmt den Aufschlagspunkt eines Strahls, der von pos ausgehend in Richtung dir abgegeben wird. // pos: Der Stützvektor der Linie // dir: Der richtungsvektor der Linie // hitPoint: eine referenz auf die variable in dem der schnittpunkt gespeichert werden soll // return: 1, fals ein Schnittpunkt existiert __declspec( dllexport ) virtual bool calcHitPoint( Vertex pos, Vertex dir, Vertex &hitpoint ) const; // Ermittelt die Fläche des Objektes, welche rechtwinklich zum Bewegungsvektor steht __declspec( dllexport ) virtual float getLuftWiederstand() const; // Gibt die Masse des Objektes zurück __declspec( dllexport ) virtual float getMasse() const; // Legt fest, ob andere Objekte mit diesem Objekt zusammenschtoßen können // return: 0, falls keine Kollisionen existieren __declspec( dllexport ) bool canCollide(); // Erhöht den Reference Counter um 1 und gibt this zurück __declspec( dllexport ) Object2D *getThis(); // Verringert den Reference Counter um 1 (bei 0 löscht sich das Objekt selbst) // Gibt 0 zurück __declspec( dllexport ) Object2D *release(); }; class Welt2D { private: RCArray< Object2D > *objects; WeltInfo info; int ref; void render( Mat3< float > &kamMat, Punkt size, Bild &zRObj, int xOffset, int yOffset, const char *kamName ); public: __declspec( dllexport ) Welt2D(); __declspec( dllexport ) ~Welt2D(); __declspec( dllexport ) void setAirResistance( float resistance ); __declspec( dllexport ) void setSize( int width, int height ); __declspec( dllexport ) void setSize( bool hasSize ); __declspec( dllexport ) void setCircular( bool circular ); __declspec( dllexport ) Object2D *zObjectAt( int x, int y, bool ignoreTransparentFlag = 0 ); __declspec( dllexport ) Object2D *getObjectAt( int x, int y, bool ignoreTransparentFlag = 0 ); __declspec( dllexport ) void addObject( Object2D *obj ); __declspec( dllexport ) void removeObject( Object2D *zObj ); __declspec( dllexport ) void removeAll(); __declspec( dllexport ) void explosion( Vertex worldPos, float intensity, float maxRad ); __declspec( dllexport ) void impuls( Vertex worldPos, Vertex worldDir ); __declspec( dllexport ) bool tick( double zeit ); __declspec( dllexport ) void render( Mat3< float > &kamMat, Punkt size, Bild &zRObj, const char *kamName ); __declspec( dllexport ) const WeltInfo &getWorldInfo() const; __declspec( dllexport ) Iterator< Object2D * > getMembers(); __declspec( dllexport ) Welt2D *getThis(); __declspec( dllexport ) Welt2D *release(); }; }