|
@@ -12,7 +12,8 @@ using namespace Framework;
|
|
// Inhalt der Kam3D Klasse
|
|
// Inhalt der Kam3D Klasse
|
|
// Konstruktor
|
|
// Konstruktor
|
|
Kam3D::Kam3D()
|
|
Kam3D::Kam3D()
|
|
- : ReferenceCounter()
|
|
|
|
|
|
+ : ReferenceCounter(),
|
|
|
|
+ rend( 0 )
|
|
{
|
|
{
|
|
openingAngle = (float)PI / 4;
|
|
openingAngle = (float)PI / 4;
|
|
minZ = 0.1f;
|
|
minZ = 0.1f;
|
|
@@ -55,6 +56,7 @@ void Kam3D::updateMatrix()
|
|
void Kam3D::setPosition( Vec3< float > pos )
|
|
void Kam3D::setPosition( Vec3< float > pos )
|
|
{
|
|
{
|
|
this->pos = pos;
|
|
this->pos = pos;
|
|
|
|
+ rend = 1;
|
|
updateMatrix();
|
|
updateMatrix();
|
|
}
|
|
}
|
|
|
|
|
|
@@ -66,6 +68,8 @@ void Kam3D::scrollIn( float val )
|
|
Mat4< float > tmp = tmp.rotationY( rotY ) * tmp.rotationX( rotX ) * tmp.rotationZ( rotZ );
|
|
Mat4< float > tmp = tmp.rotationY( rotY ) * tmp.rotationX( rotX ) * tmp.rotationZ( rotZ );
|
|
n = tmp * n * val;
|
|
n = tmp * n * val;
|
|
pos += n;
|
|
pos += n;
|
|
|
|
+ rend = 1;
|
|
|
|
+ updateMatrix();
|
|
}
|
|
}
|
|
|
|
|
|
// zppmt heraus, indem sich die Kamera etwas von dem Blockziel entfernt
|
|
// zppmt heraus, indem sich die Kamera etwas von dem Blockziel entfernt
|
|
@@ -76,13 +80,15 @@ void Kam3D::scrollOut( float val )
|
|
Mat4< float > tmp = tmp.rotationY( rotY ) * tmp.rotationX( rotX ) * tmp.rotationZ( rotZ );
|
|
Mat4< float > tmp = tmp.rotationY( rotY ) * tmp.rotationX( rotX ) * tmp.rotationZ( rotZ );
|
|
n = tmp * n * val;
|
|
n = tmp * n * val;
|
|
pos -= n;
|
|
pos -= n;
|
|
|
|
+ rend = 1;
|
|
|
|
+ updateMatrix();
|
|
}
|
|
}
|
|
|
|
|
|
// Richtet die Kamera so aus, dass sie genau auf einen bestimmten Punkt zeigt
|
|
// Richtet die Kamera so aus, dass sie genau auf einen bestimmten Punkt zeigt
|
|
// ziel: Der Punkt, auf den die Kamera zeigen soll
|
|
// ziel: Der Punkt, auf den die Kamera zeigen soll
|
|
void Kam3D::setAusrichtung( Vec3< float > ziel )
|
|
void Kam3D::setAusrichtung( Vec3< float > ziel )
|
|
{
|
|
{
|
|
- Vec3< float > target = ( ziel - pos ).normalize();
|
|
|
|
|
|
+ Vec3< float > target = (ziel - pos).normalize();
|
|
if( Vec3< float >( 0, target.y, target.z ).getLength() == 0 )
|
|
if( Vec3< float >( 0, target.y, target.z ).getLength() == 0 )
|
|
rotX = 0;
|
|
rotX = 0;
|
|
else
|
|
else
|
|
@@ -96,6 +102,7 @@ void Kam3D::setAusrichtung( Vec3< float > ziel )
|
|
if( target.x < 0 )
|
|
if( target.x < 0 )
|
|
rotY = -rotY;
|
|
rotY = -rotY;
|
|
rotZ = 0;
|
|
rotZ = 0;
|
|
|
|
+ rend = 1;
|
|
updateMatrix();
|
|
updateMatrix();
|
|
}
|
|
}
|
|
|
|
|
|
@@ -106,6 +113,7 @@ void Kam3D::setRotation( Vec3< float > rotation )
|
|
rotX = rotation.x;
|
|
rotX = rotation.x;
|
|
rotY = rotation.y;
|
|
rotY = rotation.y;
|
|
rotZ = rotation.z;
|
|
rotZ = rotation.z;
|
|
|
|
+ rend = 1;
|
|
updateMatrix();
|
|
updateMatrix();
|
|
}
|
|
}
|
|
|
|
|
|
@@ -147,7 +155,7 @@ void Kam3D::setBildschirmSize( int br, int h
|
|
|
|
|
|
// Setzt die Welt, die gezeichnet werden soll
|
|
// Setzt die Welt, die gezeichnet werden soll
|
|
// w: Die Welt
|
|
// w: Die Welt
|
|
-void Kam3D::setWelt( Welt3D *w )
|
|
|
|
|
|
+void Kam3D::setWelt( Welt3D* w )
|
|
{
|
|
{
|
|
if( welt )
|
|
if( welt )
|
|
welt->release();
|
|
welt->release();
|
|
@@ -191,7 +199,8 @@ void Kam3D::removeStyle( __int64 style )
|
|
// return: true, wenn sich das Bild neu gezeichnet werden muss, false sonnst.
|
|
// return: true, wenn sich das Bild neu gezeichnet werden muss, false sonnst.
|
|
bool Kam3D::tick( double tv )
|
|
bool Kam3D::tick( double tv )
|
|
{
|
|
{
|
|
- bool ret = 0;
|
|
|
|
|
|
+ bool ret = rend;
|
|
|
|
+ rend = 0;
|
|
if( hatStyle( Style::Rotatable ) )
|
|
if( hatStyle( Style::Rotatable ) )
|
|
{
|
|
{
|
|
if( getTastenStand( T_Oben ) )
|
|
if( getTastenStand( T_Oben ) )
|
|
@@ -266,7 +275,7 @@ bool Kam3D::tick( double tv )
|
|
|
|
|
|
// Verarbeitet ein Mausereignis
|
|
// Verarbeitet ein Mausereignis
|
|
// me: Das Mausereignis, das verarbeitet werden soll
|
|
// me: Das Mausereignis, das verarbeitet werden soll
|
|
-void Kam3D::doMausEreignis( MausEreignis &me )
|
|
|
|
|
|
+void Kam3D::doMausEreignis( MausEreignis& me )
|
|
{
|
|
{
|
|
if( me.verarbeitet )
|
|
if( me.verarbeitet )
|
|
return;
|
|
return;
|
|
@@ -275,7 +284,7 @@ void Kam3D::doMausEreignis( MausEreignis &me )
|
|
MausEreignis3D me3d;
|
|
MausEreignis3D me3d;
|
|
me3d.id = me.id;
|
|
me3d.id = me.id;
|
|
me3d.verarbeitet = me.verarbeitet;
|
|
me3d.verarbeitet = me.verarbeitet;
|
|
- Vec3< float > mausP = Vec3< float >( ( me.mx - viewport.x ) / ( 0.5f * viewport.width ) - 1, ( me.my - viewport.y ) / ( 0.5f * viewport.height ) - 1, 0 );
|
|
|
|
|
|
+ Vec3< float > mausP = Vec3< float >( (me.mx - viewport.x) / (0.5f * viewport.width) - 1, (me.my - viewport.y) / (0.5f * viewport.height) - 1, 0 );
|
|
Vec3< float > mausT = Vec3< float >( mausP.x, mausP.y, 1 );
|
|
Vec3< float > mausT = Vec3< float >( mausP.x, mausP.y, 1 );
|
|
Mat4< float > mat = proj * view;
|
|
Mat4< float > mat = proj * view;
|
|
mat = mat.getInverse();
|
|
mat = mat.getInverse();
|
|
@@ -289,7 +298,7 @@ void Kam3D::doMausEreignis( MausEreignis &me )
|
|
|
|
|
|
// Verarbeitet ein Tastaturereignis
|
|
// Verarbeitet ein Tastaturereignis
|
|
// te: das Tastaturereignis, das verarbeitet werden soll
|
|
// te: das Tastaturereignis, das verarbeitet werden soll
|
|
-void Kam3D::doTastaturEreignis( TastaturEreignis &te )
|
|
|
|
|
|
+void Kam3D::doTastaturEreignis( TastaturEreignis& te )
|
|
{
|
|
{
|
|
|
|
|
|
}
|
|
}
|
|
@@ -299,7 +308,7 @@ void Kam3D::doTastaturEreignis( TastaturEreignis &te )
|
|
// return: 1, falls alle Styles in style gesetzt wurden
|
|
// return: 1, falls alle Styles in style gesetzt wurden
|
|
bool Kam3D::hatStyle( __int64 style ) const
|
|
bool Kam3D::hatStyle( __int64 style ) const
|
|
{
|
|
{
|
|
- return ( this->style | style ) == this->style;
|
|
|
|
|
|
+ return (this->style | style) == this->style;
|
|
}
|
|
}
|
|
|
|
|
|
// Gibt zurück, ob bestimmte Styles nicht gesetzt wurden
|
|
// Gibt zurück, ob bestimmte Styles nicht gesetzt wurden
|
|
@@ -307,17 +316,17 @@ bool Kam3D::hatStyle( __int64 style ) const
|
|
// return: 1, falls alle Styles in style nicht gesetzt wurden
|
|
// return: 1, falls alle Styles in style nicht gesetzt wurden
|
|
bool Kam3D::hatStyleNicht( __int64 style ) const
|
|
bool Kam3D::hatStyleNicht( __int64 style ) const
|
|
{
|
|
{
|
|
- return ( this->style | style ) != this->style;
|
|
|
|
|
|
+ return (this->style | style) != this->style;
|
|
}
|
|
}
|
|
|
|
|
|
// Gibt einen Zeiger auf den Viewport zurück
|
|
// Gibt einen Zeiger auf den Viewport zurück
|
|
-const ViewPort *Kam3D::zViewPort() const
|
|
|
|
|
|
+const ViewPort* Kam3D::zViewPort() const
|
|
{
|
|
{
|
|
return &viewport;
|
|
return &viewport;
|
|
}
|
|
}
|
|
|
|
|
|
// Gibt die Position der Kamera in der Welt zurück
|
|
// Gibt die Position der Kamera in der Welt zurück
|
|
-const Vec3< float > &Kam3D::getWorldPosition() const
|
|
|
|
|
|
+const Vec3< float >& Kam3D::getWorldPosition() const
|
|
{
|
|
{
|
|
return pos;
|
|
return pos;
|
|
}
|
|
}
|
|
@@ -326,11 +335,11 @@ const Vec3< float > &Kam3D::getWorldPosition() const
|
|
// screen: die Position auf dem Bildschirm, die übersetzt werden soll
|
|
// screen: die Position auf dem Bildschirm, die übersetzt werden soll
|
|
const Vec3< float > Kam3D::getWorldPosition( Punkt screen ) const
|
|
const Vec3< float > Kam3D::getWorldPosition( Punkt screen ) const
|
|
{
|
|
{
|
|
- Vec3< float > point = Vec3< float >( ( screen.x - viewport.x ) / ( 0.5f * viewport.width ) - 1, ( viewport.height - ( screen.y - viewport.y ) ) / ( 0.5f * viewport.height ) - 1, 0.1f );
|
|
|
|
|
|
+ Vec3< float > point = Vec3< float >( (screen.x - viewport.x) / (0.5f * viewport.width) - 1, (viewport.height - (screen.y - viewport.y)) / (0.5f * viewport.height) - 1, 0.1f );
|
|
Mat4< float > mat = getProjectionMatrix();
|
|
Mat4< float > mat = getProjectionMatrix();
|
|
Mat4< float > inv = getViewMatrix().getInverse();
|
|
Mat4< float > inv = getViewMatrix().getInverse();
|
|
- point.x = ( point.x * 0.1f ) / mat.elements[ 0 ][ 0 ];
|
|
|
|
- point.y = ( point.y * 0.1f ) / mat.elements[ 1 ][ 1 ];
|
|
|
|
|
|
+ point.x = (point.x * 0.1f) / mat.elements[ 0 ][ 0 ];
|
|
|
|
+ point.y = (point.y * 0.1f) / mat.elements[ 1 ][ 1 ];
|
|
return inv * point;
|
|
return inv * point;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -338,39 +347,45 @@ const Vec3< float > Kam3D::getWorldPosition( Punkt screen ) const
|
|
// screen: die Position auf dem Bildschirm, die übersetzt werden soll
|
|
// screen: die Position auf dem Bildschirm, die übersetzt werden soll
|
|
const Vec3< float > Kam3D::getWorldDirection( Punkt screen ) const
|
|
const Vec3< float > Kam3D::getWorldDirection( Punkt screen ) const
|
|
{
|
|
{
|
|
- Vec3< float > point = Vec3< float >( ( screen.x - viewport.x ) / ( 0.5f * viewport.width ) - 1, ( viewport.height - ( screen.y - viewport.y ) ) / ( 0.5f * viewport.height ) - 1, 0.1f );
|
|
|
|
|
|
+ Vec3< float > point = Vec3< float >( (screen.x - viewport.x) / (0.5f * viewport.width) - 1, (viewport.height - (screen.y - viewport.y)) / (0.5f * viewport.height) - 1, 0.1f );
|
|
Vec3< float > pointT = Vec3< float >( point.x, point.y, 1 );
|
|
Vec3< float > pointT = Vec3< float >( point.x, point.y, 1 );
|
|
Mat4< float > mat = getProjectionMatrix();
|
|
Mat4< float > mat = getProjectionMatrix();
|
|
Mat4< float > inv = getViewMatrix().getInverse();
|
|
Mat4< float > inv = getViewMatrix().getInverse();
|
|
- point.x = ( point.x * 0.1f ) / mat.elements[ 0 ][ 0 ];
|
|
|
|
- point.y = ( point.y * 0.1f ) / mat.elements[ 1 ][ 1 ];
|
|
|
|
- pointT.x = ( pointT.x ) / mat.elements[ 0 ][ 0 ];
|
|
|
|
- pointT.y = ( pointT.y ) / mat.elements[ 1 ][ 1 ];
|
|
|
|
|
|
+ point.x = (point.x * 0.1f) / mat.elements[ 0 ][ 0 ];
|
|
|
|
+ point.y = (point.y * 0.1f) / mat.elements[ 1 ][ 1 ];
|
|
|
|
+ pointT.x = (pointT.x) / mat.elements[ 0 ][ 0 ];
|
|
|
|
+ pointT.y = (pointT.y) / mat.elements[ 1 ][ 1 ];
|
|
point = inv * point;
|
|
point = inv * point;
|
|
pointT = inv * pointT;
|
|
pointT = inv * pointT;
|
|
return pointT - point;
|
|
return pointT - point;
|
|
}
|
|
}
|
|
|
|
|
|
// Gibt die Projektionsmatrix der Kamera zurück
|
|
// Gibt die Projektionsmatrix der Kamera zurück
|
|
-const Mat4< float > &Kam3D::getProjectionMatrix() const
|
|
|
|
|
|
+const Mat4< float >& Kam3D::getProjectionMatrix() const
|
|
{
|
|
{
|
|
return proj;
|
|
return proj;
|
|
}
|
|
}
|
|
|
|
|
|
// Gibt die Ansichtsmatrix der Kamera zurück
|
|
// Gibt die Ansichtsmatrix der Kamera zurück
|
|
-const Mat4< float > &Kam3D::getViewMatrix() const
|
|
|
|
|
|
+const Mat4< float >& Kam3D::getViewMatrix() const
|
|
{
|
|
{
|
|
return view;
|
|
return view;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+//! Gibt die Rotation um die einzelnen axen zurück
|
|
|
|
+const Vec3< float > Kam3D::getRotation() const
|
|
|
|
+{
|
|
|
|
+ return { rotX, rotY, rotZ };
|
|
|
|
+}
|
|
|
|
+
|
|
// Gibt die Welt zurück
|
|
// Gibt die Welt zurück
|
|
-Welt3D *Kam3D::getWelt() const
|
|
|
|
|
|
+Welt3D* Kam3D::getWelt() const
|
|
{
|
|
{
|
|
- return welt ? dynamic_cast<Welt3D *>( welt->getThis() ) : 0;
|
|
|
|
|
|
+ return welt ? dynamic_cast<Welt3D*>(welt->getThis()) : 0;
|
|
}
|
|
}
|
|
|
|
|
|
// Gibt die Welt zurück
|
|
// Gibt die Welt zurück
|
|
-Welt3D *Kam3D::zWelt() const
|
|
|
|
|
|
+Welt3D* Kam3D::zWelt() const
|
|
{
|
|
{
|
|
return welt;
|
|
return welt;
|
|
}
|
|
}
|