Browse Source

Texturkoordinaten können im m2 datei editor manuell angepasst werden

Kolja Strohm 6 years ago
parent
commit
c2105b4e90

+ 93 - 15
KSGClient/NachLogin/Editor/Karte/Dateien/KEDModel2DEditor.cpp

@@ -13,7 +13,7 @@ using namespace Model2DEditor;
 
 // Inhalt der VertexData Klasse aus KEDModel2DEditor.h
 // Konstruktor
-VertexData::VertexData( Vec2< float > v, Punkt t )
+VertexData::VertexData( Vec2< float > v, Vertex t )
 {
     vertex = v;
     textur = t;
@@ -35,6 +35,11 @@ void VertexData::nachOben( float num )
         vertex.y -= num;
 }
 
+void VertexData::setTextur( Vertex tp )
+{
+    textur = tp;
+}
+
 void VertexData::saveTextur( Punkt tPos, Punkt tGr )
 {
     textur = vertex - tPos;
@@ -106,13 +111,14 @@ PolygonData::PolygonData( Polygon2D &pg )
 {
     name = pg.name->getText();
     vd = new RCArray< VertexData >();
+    transparent = 0;
     sichtbar = 1;
     ref = 1;
     int anz = pg.vertex->getEintragAnzahl();
     for( int i = 0; i < anz; i++ )
     {
         Vec2< float > v( 0, 0 );
-        Punkt t( 0, 0 );
+        Vertex t( 0, 0 );
         if( pg.vertex->hat( i ) )
             v = pg.vertex->get( i );
         if( pg.tKordinaten && pg.tKordinaten->hat( i ) )
@@ -128,7 +134,7 @@ PolygonData::~PolygonData()
 }
 
 // nicht constant
-void PolygonData::addVertex( Vec2< float >v, Punkt t )
+void PolygonData::addVertex( Vec2< float >v, Vertex t )
 {
     vd->add( new VertexData( v, t ) );
 }
@@ -173,6 +179,11 @@ void PolygonData::setSichtbar( bool s )
     sichtbar = s;
 }
 
+void PolygonData::setTransparent( bool t )
+{
+    transparent = t;
+}
+
 void PolygonData::setName( const char *name )
 {
     this->name = name;
@@ -216,6 +227,11 @@ void PolygonData::getM2( Polygon2D &pd, bool textur ) const
     }
 }
 
+bool PolygonData::istTransparent() const
+{
+    return transparent;
+}
+
 // Reference Counting
 PolygonData *PolygonData::getThis()
 {
@@ -249,16 +265,6 @@ Data::Data( Model2DData *mdl )
         if( mdl->polygons->hat( i ) )
         {
             pd->add( new PolygonData( mdl->polygons->get( i ) ) );
-            if( !tPos.x && !tPos.y )
-            {
-                if( mdl->polygons->get( i ).tKordinaten && mdl->polygons->get( i ).vertex
-                    && mdl->polygons->get( i ).tKordinaten->hat( 0 ) && mdl->polygons->get( i ).vertex->hat( 0 ) )
-                {
-                    Punkt p = (Punkt)mdl->polygons->get( i ).vertex->get( 0 );
-                    Punkt tp = mdl->polygons->get( i ).tKordinaten->get( 0 );
-                    tPos = p - tp;
-                }
-            }
         }
     }
     if( mdl )
@@ -345,6 +351,14 @@ void Data::setTextur( Bild *t )
     if( textur )
         textur->release();
     textur = t;
+    if( pd->getEintragAnzahl() > 0 && pd->z( 0 )->zVertex( 0 ) )
+    {
+        Vertex p = pd->z( 0 )->zVertex( 0 )->getPos();
+        Vertex tp = pd->z( 0 )->zVertex( 0 )->getTPos();
+        tp.x *= t->getBreite();
+        tp.y *= t->getHeight();
+        tPos = p - tp;
+    }
 }
 
 void Data::select( Punkt p1, Punkt p2 )
@@ -427,7 +441,32 @@ EditorListe::EditorListe( Schrift *zSchrift )
     ram->setPosition( 720, 10 );
     scroll = new VScrollBar();
     schrift = zSchrift->getThis();
-    pName = initTextFeld( 0, 0, 80, 20, schrift, TextFeld::Style::TextFeld, "" );
+    pName = initTextFeld( 0, 0, 70, 20, schrift, TextFeld::Style::TextFeld, "" );
+    texturKoordF = initFenster( 10, 10, 150, 80, zSchrift, ( Fenster::Style::normal | Fenster::Style::TitelHintergrund | Fenster::Style::BodyHintergrund ) & ~Fenster::Style::Sichtbar, "Texturkoordinaten" );
+    texturKoordF->setKBgFarbe( 0xFF000000 );
+    texturKoordF->setTBgFarbe( 0xFF000000 );
+    texturKoordF->setClosingMe( _closeFensterME );
+    tkxT = initTextFeld( 10, 10, 30, 20, zSchrift, TextFeld::Style::Text, "x:" );
+    tkyT = initTextFeld( 10, 40, 30, 20, zSchrift, TextFeld::Style::Text, "y:" );
+    tkx = initTextFeld( 40, 10, 90, 20, zSchrift, TextFeld::Style::TextFeld, "" );
+    tky = initTextFeld( 40, 40, 90, 20, zSchrift, TextFeld::Style::TextFeld, "" );
+    int *polIP = &polI, *verIP = &verI;
+    TextFeld *tkxTmp = tkx;
+    TextFeld *tkyTmp = tky;
+    auto saveTK = [ polIP, verIP, tkxTmp, tkyTmp ]( void *p, void *o, TastaturEreignis te )
+    {
+        Data *data = (Data*)p;
+        data->zPolygon( *polIP )->zVertex( *verIP )->setTextur( Vertex( (float)(double)*tkxTmp->zText(), (float)(double)*tkyTmp->zText() ) );
+        return 1;
+    };
+    tkx->setNTastaturEreignis( saveTK );
+    tky->setNTastaturEreignis( saveTK );
+    texturKoordF->addMember( tkxT );
+    texturKoordF->addMember( tkyT );
+    texturKoordF->addMember( tkx );
+    texturKoordF->addMember( tky );
+    polI = 0;
+    verI = 0;
     data = 0;
     ref = 1;
 }
@@ -441,6 +480,11 @@ EditorListe::~EditorListe()
     if( data )
         data->release();
     schrift->release();
+    texturKoordF->release();
+    tkxT->release();
+    tkyT->release();
+    tkx->release();
+    tky->release();
 }
 
 // nicht constant
@@ -453,6 +497,7 @@ void EditorListe::setDataZ( Data *d )
 
 void EditorListe::doMausEreignis( MausEreignis &me )
 {
+    texturKoordF->doMausEreignis( me );
     me.mx -= ram->getX();
     me.my -= ram->getY();
     if( me.mx < 0 || me.my < 0 || me.mx > ram->getBreite() || me.my > ram->getHeight() )
@@ -480,10 +525,17 @@ void EditorListe::doMausEreignis( MausEreignis &me )
             }
             else if( me.mx > 115 && me.my > y + 1 && me.mx < 132 && me.my < y + 19 )
             { // Löschen
+                if( polI == i )
+                    texturKoordF->removeStyle( Fenster::Style::Sichtbar );
                 data->removePolygon( i );
                 rend = 1;
                 break;
             }
+            else if( me.mx > 95 && me.my > y + 5 && me.mx < 105 && me.my < y + 15 )
+            {
+                data->zPolygon( i )->setTransparent( !data->zPolygon( i )->istTransparent() );
+                rend = 1;
+            }
             else if( me.mx > 0 && me.my > y && me.mx < 133 && me.my < y + 20 )
             { // Polygon Auswählen und Abwählen
                 if( data->getSelectedPolygon() != i )
@@ -501,6 +553,8 @@ void EditorListe::doMausEreignis( MausEreignis &me )
                     y += 20;
                     if( me.mx > 115 && me.my > y + 1 && me.mx < 132 && me.my < y + 19 )
                     { // Löschen
+                        if( polI == i && verI == j )
+                            texturKoordF->removeStyle( Fenster::Style::Sichtbar );
                         pd->removeVertex( j );
                         rend = 1;
                     }
@@ -509,6 +563,16 @@ void EditorListe::doMausEreignis( MausEreignis &me )
                         pd->zVertex( j )->setSichtbar( !pd->zVertex( j )->istSichtbar() );
                         rend = 1;
                     }
+                    else if( me.mx > 5 && me.my > y + 5 && me.mx < 15 && me.my < y + 15 )
+                    { // Sichtbar und Unsichtbar
+                        polI = i;
+                        verI = j;
+                        tkx->setNTastaturEreignisParameter( data );
+                        tky->setNTastaturEreignisParameter( data );
+                        tkx->setText( Text() += pd->zVertex( j )->getTPos().x );
+                        tky->setText( Text() += pd->zVertex( j )->getTPos().y );
+                        texturKoordF->addStyle( Fenster::Style::Sichtbar );
+                    }
                     else if( me.my > y && me.my < y + 20 && me.mx > 0 && me.mx < 133 )
                     { // Auswählen und Abwählen
                         pd->zVertex( j )->setAuswahl( !pd->zVertex( j )->istAusgewählt() );
@@ -526,12 +590,14 @@ void EditorListe::doMausEreignis( MausEreignis &me )
 
 void EditorListe::doTastaturEreignis( TastaturEreignis &te )
 {
+    texturKoordF->doTastaturEreignis( te );
     if( data && data->getSelectedPolygon() >= 0 )
         pName->doTastaturEreignis( te );
 }
 
 bool EditorListe::tick( double zeit )
 {
+    rend |= texturKoordF->tick( zeit );
     if( data && data->getSelectedPolygon() >= 0 )
         rend |= pName->tick( zeit );
     bool ret = rend;
@@ -580,6 +646,15 @@ void EditorListe::render( Bild &zRObj )
         }
         zRObj.drawLinie( Punkt( 115, y + 1 ), Punkt( 132, y + 18 ), 0xFFFF0000 );
         zRObj.drawLinie( Punkt( 132, y + 1 ), Punkt( 115, y + 18 ), 0xFFFF0000 );
+        if( data->zPolygon( i )->istTransparent() )
+        {
+            zRObj.drawLinieH( 95, y + 5, 10, 0xFFFFFFFF );
+            zRObj.drawLinieH( 95, y + 15, 10, 0xFFFFFFFF );
+            zRObj.drawLinieV( 95, y + 5, 10, 0xFFFFFFFF );
+            zRObj.drawLinieV( 105, y + 5, 10, 0xFFFFFFFF );
+        }
+        else
+            zRObj.fillRegion( 95, y + 5, 10, 10, 0xFFFFFFFF );
         if( ausgeklappt.hat( i ) && ausgeklappt.get( i ) )
         {
             zRObj.drawDreieck( Punkt( 10, 4 + y ), Punkt( 4, 16 + y ), Punkt( 16, 16 + y ), 0xFFFFFFFF );
@@ -597,6 +672,8 @@ void EditorListe::render( Bild &zRObj )
                     name += j;
                     schrift->setDrawPosition( 20, y + 4 );
                     schrift->renderText( &name, zRObj, 0xFFFFFFFF );
+                    zRObj.drawLinieH( 5, y + 5, 10, 0xFFFFFFFF );
+                    zRObj.drawLinieV( 10, y + 5, 10, 0xFFFFFFFF );
                     zRObj.drawLinie( Punkt( 115, y + 1 ), Punkt( 132, y + 18 ), 0xFFFF0000 );
                     zRObj.drawLinie( Punkt( 132, y + 1 ), Punkt( 115, y + 18 ), 0xFFFF0000 );
                     if( pd->zVertex( j )->istSichtbar() )
@@ -620,6 +697,7 @@ void EditorListe::render( Bild &zRObj )
     schrift->unlock();
     scroll->update( maxH, ram->getHeight() - 2 );
     zRObj.releaseDrawOptions();
+    texturKoordF->render( zRObj );
 }
 
 // Reference Counting
@@ -1009,8 +1087,8 @@ void GUI::doMausEreignis( MausEreignis &me )
 {
     if( !sichtbar )
         return;
-    editor->doMausEreignis( me );
     liste->doMausEreignis( me );
+    editor->doMausEreignis( me );
     bool vera = me.verarbeitet;
     speichern->doMausEreignis( me );
     if( me.id == ME_RLinks && me.verarbeitet && !vera )

+ 14 - 2
KSGClient/NachLogin/Editor/Karte/Dateien/KEDModel2DEditor.h

@@ -6,6 +6,7 @@
 #include <Bild.h>
 #include <Model2D.h>
 #include <DateiDialog.h>
+#include <Fenster.h>
 
 using namespace Framework;
 
@@ -22,10 +23,11 @@ namespace Model2DEditor
 
     public:
         // Konstruktor
-        VertexData( Vec2< float > v, Punkt t );
+        VertexData( Vec2< float > v, Vertex t );
         // nicht constant
         void nachLinks( float num );
         void nachOben( float num );
+        void setTextur( Vertex tp );
         void saveTextur( Punkt tPos, Punkt tGr );
         void select( Punkt p1, Punkt p2 );
         void deSelect();
@@ -46,6 +48,7 @@ namespace Model2DEditor
     private:
         RCArray< VertexData > *vd;
         Text name;
+        bool transparent;
         bool sichtbar;
         int ref;
 
@@ -55,7 +58,7 @@ namespace Model2DEditor
         // Destruktor
         ~PolygonData();
         // nicht constant
-        void addVertex( Vec2< float >v, Punkt t );
+        void addVertex( Vec2< float >v, Vertex t );
         void removeVertex( int num );
         void nachLinks( float num );
         void nachOben( float num );
@@ -63,6 +66,7 @@ namespace Model2DEditor
         void select( Punkt p1, Punkt p2 );
         void deSelect();
         void setSichtbar( bool s );
+        void setTransparent( bool t );
         void setName( const char *name );
         // constant
         const char *getName() const;
@@ -70,6 +74,7 @@ namespace Model2DEditor
         VertexData *zVertex( int num ) const;
         int getVertexAnzahl() const;
         void getM2( Polygon2D &pd, bool textur ) const;
+        bool istTransparent() const;
         // Reference Counting
         PolygonData *getThis();
         PolygonData *release();
@@ -124,6 +129,13 @@ namespace Model2DEditor
         Array< bool > ausgeklappt;
         Schrift *schrift;
         TextFeld *pName;
+        Fenster *texturKoordF;
+        TextFeld *tkxT;
+        TextFeld *tkyT;
+        TextFeld *tkx;
+        TextFeld *tky;
+        int polI;
+        int verI;
         int ref;
 
     public:

+ 2 - 0
KSGClient/NachLogin/Einstellungen/Einstellungen.cpp

@@ -33,6 +33,7 @@ Einstellungen::~Einstellungen()
 // nicht constant
 void Einstellungen::setSichtbar()
 {
+    // TODO
 	//-------------------
 	f->setStyle( Fenster::Style::Sichtbar, f->hatStyleNicht( Fenster::Style::Sichtbar ) );
 }
@@ -49,6 +50,7 @@ bool Einstellungen::okME( MausEreignis &me )
 	if( me.id == ME_RLinks )
 	{
 		f->removeStyle( Fenster::Style::Sichtbar );
+        // TODO
 		//-----------------------------
 	}
 	return 1;

+ 3 - 2
KSGClient/Netzwerk/Klients/EditorK.cpp

@@ -2600,6 +2600,7 @@ bool EditorKlient::deModelSpeichern( Text *zDatei, Text *zModel, Model2DData *zD
                         for( int i = 0; i < anz; i++ )
                         {
                             Polygon2D pol = zData->polygons->get( i );
+                            klient->sendeEncrypted( (char*)&pol.transparent, 1 );
                             char nLän = pol.name->getLength();
                             klient->sendeEncrypted( &nLän, 1 );
                             if( nLän )
@@ -2609,9 +2610,9 @@ bool EditorKlient::deModelSpeichern( Text *zDatei, Text *zModel, Model2DData *zD
                             for( int j = 0; j < anz2; j++ )
                             {
                                 Vertex v = pol.vertex->get( j );
-                                Punkt p;
+                                Vertex p;
                                 if( pol.tKordinaten )
-                                    p = pol.tKordinaten->hat( j ) ? pol.tKordinaten->get( j ) : Punkt( 0, 0 );
+                                    p = pol.tKordinaten->hat( j ) ? pol.tKordinaten->get( j ) : Vertex( 0, 0 );
                                 klient->sendeEncrypted( (char*)&v.x, 4 );
                                 klient->sendeEncrypted( (char*)&v.y, 4 );
                                 klient->sendeEncrypted( (char*)&p.x, 4 );