Svenska 3D-Tåg - Forum

Svenska 3D-Tåg - Forum (http://www.e-buzz.se/forum/index.php)
-   Trainz - Allmänt om Trainz (http://www.e-buzz.se/forum/forumdisplay.php?f=10)
-   -   Texture-replacement funkar inte. (http://www.e-buzz.se/forum/showthread.php?t=37164)

RobertE 2018-12-10 23:27

Texture-replacement funkar inte.
 
Hej!

Jag har problem med Texture-replacement. Jag har skrivit rätt config och gjort en texturegroup.

Men den finns inte på vagnen. När man klickar på vagnen och ska bytta texture, så saknas den rutan "Texture-replacement"

Jag vet inte vad som är fel.


Kod:

mesh-table
{
  default
  {
    mesh                                "c22_x2000_ub2x_body/c22_x2000_ub2x_body.im"
    auto-create                        1
   
    effects
    {
      textures
      {
        kind                            "texture-replacement"
        texture                        "main_steering.texture"
      }
    }
  }
}


blomsson 2018-12-11 03:05

4 bifogad(e) fil(er)
Hej Robert!

Ett enkelt svar är att det inte räcker att endast definiera texture-replacement i configen, utan det krävs en del scriptande också, men det kanske du redan vet?

Om du inte vet det så visar jag ett par exempel nedan.

Koden nedan är en del av configen för en vägkur som har två stycken manöverlådor. De använder samma modell men med olika texturer.
Kod:

    effects
    {
      fk
      {
        kind                            "texture-replacement"
        texture                        "varning.texture"
      }
    }

Bilden nedan visar hur mappen med filerna ser ut.

Bifogad fil 77210
Här kan man se "fk.tga" och "fk.texture.txt". Texture filen är den som ska användas vid byte av texturer, ett vanligt misstag som görs är att man använder bildfilen istället för texture filen.
Om man bara behöver, som i det här fallet, byta ut en textur som inte finns i en texture-group, används denna funktion: SetFXTextureReplacementTexture(string effect, string texture);
Kod:

    public void Init(Asset ass)
    {
        inherited(ass);
       
        SetFXTextureReplacementTexture("fk", "fk.texture");
    }

Här har jag lagt texture bytet direkt i Init() eftersom objektet alltid kommer ha det utseendet om det visas.

Om man däremot behöver skapa valmöjligheter och/eller vill använda sig av textur-grupper så blir det genaste lite mer komplicerat och framförallt en massa mer kodande!
Men jag tänkte ge ett ganska kort(!) exempel med lite config- och kod-utdrag.

I HB T Systemgränstavlor kan man välja på lite olika typer av tavlor, bl.a. dessa tre:
Bifogad fil 77214Bifogad fil 77215Bifogad fil 77216
För att åstadkomma detta är texturerna inlagda i en textur-grupp som det finns en referens till i configens kuid-tabell. Den referensen används till att hämta textur-gruppens texturer. För att byta ut texturen används en annan version av samma funktion som tidigare: SetFXTextureReplacement(string effect, Asset texture_asset, int texture_index);

Lite utdrag från Systemtavlans configfil:
Kod:

mesh-table
{
  default_effectsmesh
  {
    mesh-asset                          <kuid2:609407:100125:1>
    mesh                                "645x645 romb texture.trainzmesh"
    auto-create                        0
   
    effects
    {
      texture_645r
      {
        kind                            "texture-replacement"
        texture                        "baseyellow.texture"
      }
    }
  }

// Flera mesher finns i mesh-tabellen
}

kuid-table
{
  hb_signalscriptlibrary                <kuid2:609407:100055:1>
  meshlibrary                          <kuid:609407:100125>
  infotavla645syst                      <kuid:609407:100089>
  infotavla510                          <kuid:609407:100086>
}

Lite kodutdrag från scriptfilen, observera att inte all kod är med, dessutom så ärver tavlorna från HB_Tavlor som finns i Scriptbiblioteket som sköter om det mesta som är generellt.
Kod:

// Först lite defineringar av variabler.
    Asset      mTextureAsset;                                          // Textutgruppens asset
    string[]    mTextureList                = new string[0];            // Systemgränstavlans texturval hämtade från configen
    int        mTextureIndex              = 0;                        // Vald tavla
    string[]    mChoices                    = new string[0];            // Systemtavlans val hämtade från configen

Kod:

// Detta är en del av den kod som hämtar textur-gruppen och skapar dess listor
           
            Soup kuidSoup = ass.GetConfigSoup().GetNamedSoup("kuid-table");
            string[] kuidString = new string[0];
            for (i = 0; i < kuidSoup.CountTags(); i++)
            {
                kuidString[kuidString.size()] = kuidSoup.GetIndexedTagName(i);
            }
           
            // Hämtar systemtavlans texturer
            if (kuidString and TrainUtil.AlreadyThereStr(kuidString, "infotavla645syst"))
                mTextureAsset = ass.FindAsset("infotavla645syst");
            else
                mTextureAsset = null;
           
            if (mTextureAsset )
            {
                Soup speedSoup = mTextureAsset.GetConfigSoup().GetNamedSoup("textures");
               
                for (i = 0; i < speedSoup.CountTags(); i++)
                {
                    mTextureList[mTextureList.size()] = Str.Tokens(speedSoup.GetNamedTag(i),".")[0];
                }
               
                for (i = 0; i < mTextureList.size(); i++)
                {
                    fattarnoll = mStrings.GetString("infotavla645syst_" + i);
                   
                    if (fattarnoll != "")
                        mTextureList[i] = fattarnoll;
                }
            }

Kod:

// För att byta texturen används denna kod som är en del i en egen funktion
som används till att uppdatera tavlans utseende, tilläggstavlor, fästen osv.
           
  if (mTextureAsset)
  {
      SetFXTextureReplacement("texture_645r", mTextureAsset, mTextureIndex);
  }

För att ge användaren möjlighet att byta mellan texturerna krävs ytterligare kod, som i allmänhet ligger i GetDescriptionHTML(void) och som returnerar en text-sträng som genererar data till Propertyrutan. En väldigt liten del av den koden visas nedan:
Kod:

HTMLWindow.MakeLink("live://property/chooseboard", mChoices[mTextureIndex])
HTMLWindow.MakeLink skapar en klickbar länk i propertyrutan, där "chooseboard" är själva länk-definitionen som med hjälp av andra funktioner skapar användarens val.

mChoices[mTextureIndex] talar om vilket val som är gjort, när koden i propertyrutan genereras. mChoices är de facto samma som mTextureList men med tydligare text för användaren.

Hoppas detta kan vara till hjälp, det blir lätt mycket kod när man börjar pilla och ännu mera om man vill "göra det snyggt" också...

mvh
Håkan

Bengan 2018-12-11 07:33

Hade också problem med texturegrupp på X2000 Motorvagn/Manövervagn på Vovvens Start och Stopp. Fungerade på dom föregående.

Fick samma problem, med en utav vagnarna till Y6-familjen. Som Vovven fick titta närmare på. Det hade blivit ett fel i scriptet, som han fixade till.

Misstänker att det är samma problem med X2000 Motorvagn/Manövervagn.

vovven47 2018-12-12 02:22

Jag har missat att inkludera STL:s Texture behandling i mitt script. Gäller både X2000
motor- och manövervagn. Korrigering kommer senare i denna vecka.


Alla tider är GMT +2. Klockan är nu 13:04.

Powered by vBulletin® Version 3.7.5
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson
© Svenska 3D-Tåg 2001-2009