CryEngine 2 Modifikation Precache eines Custom Material in c++



  • Also wenn ich das richtig verstehe willst du ein 3. Material zur Auswahl geben.
    Wenn das so ist,müsstest du es nur wie bei den anderen zwei Materialien,in der PrecacheMaterials-Funktion laden,falls es zur Auswahl wird.
    Also:

    if (NeuesMaterial)
    {
        LadeMaterial();
    }
    

    Falls du nicht weißt,was ich mein oder du was anderes meinst,dann schreib es.



  • Ja, das meine ich 🙂 . Ich denke schon das es das ist.
    Aber zu meiner Schande habe ich keine Ahnung wie ich das einbetten muss... 😞
    Ich zeige hier mal was ich bis jetzt gemacht habe, aber leider nicht funktioniert hat:

    /*************************************************************************
    Crytek Source File.
    Copyright (C), Crytek Studios, 2001-2004.
    -------------------------------------------------------------------------
    IdId
    DateTimeDateTime

    -------------------------------------------------------------------------
    History:
    - 22:11:2005: Created by Filippo De Luca
    - 31:01:2006: taken over by Jan Müller

    *************************************************************************/
    #include "StdAfx.h"
    #include "Game.h"
    #include "GameCVars.h"
    #include "Player.h"
    #include "GameUtils.h"
    #include "HUD/HUD.h"
    #include "GameRules.h"
    #include "NetInputChainDebug.h"
    #include "BulletTime.h"
    #include "SoundMoods.h"
    #include "WeaponSystem.h"
    #include "OffHand.h"

    #include <ISound.h>
    #include <ISerialize.h>
    #include <IGameTokens.h>
    #include <IMaterialEffects.h>

    CNanoSuit::SNanoMaterial g_USNanoMats[NANOMODE_LAST];
    CNanoSuit::SNanoMaterial g_V2NanoMats[NANOMODE_LAST];
    CNanoSuit::SNanoMaterial g_AsianNanoMats[NANOMODE_LAST];
    static const float HIT_EFFECT_TIME = 0.5f;

    static void PrecacheMaterials(bool bCacheAsian)
    {
    // preload materials
    IMaterialManager* matMan = gEnv->p3DEngine->GetMaterialManager();
    if (!g_USNanoMats[NANOMODE_SPEED].body)
    {
    g_USNanoMats[NANOMODE_SPEED].body = matMan->LoadMaterial("objects/characters/human/us/nanosuit/nanosuit_us_speed.mtl");
    g_USNanoMats[NANOMODE_SPEED].helmet = matMan->LoadMaterial("objects/characters/human/us/nanosuit/nanosuit_us_helmet_speed.mtl");
    g_USNanoMats[NANOMODE_SPEED].arms = matMan->LoadMaterial( "objects/weapons/arms_global/arms_nanosuit_us_speed.mtl");
    g_USNanoMats[NANOMODE_STRENGTH].body = matMan->LoadMaterial("objects/characters/human/us/nanosuit/nanosuit_us_strength.mtl");
    g_USNanoMats[NANOMODE_STRENGTH].helmet = matMan->LoadMaterial("objects/characters/human/us/nanosuit/nanosuit_us_helmet_strength.mtl");
    g_USNanoMats[NANOMODE_STRENGTH].arms = matMan->LoadMaterial( "objects/weapons/arms_global/arms_nanosuit_us_strength.mtl");
    g_USNanoMats[NANOMODE_CLOAK].body = matMan->LoadMaterial("objects/characters/human/us/nanosuit/nanosuit_us_cloak.mtl");
    g_USNanoMats[NANOMODE_CLOAK].helmet = matMan->LoadMaterial("objects/characters/human/us/nanosuit/nanosuit_us_helmet_cloak.mtl");
    g_USNanoMats[NANOMODE_CLOAK].arms = matMan->LoadMaterial( "objects/weapons/arms_global/arms_nanosuit_us_cloak.mtl");
    g_USNanoMats[NANOMODE_DEFENSE].body = matMan->LoadMaterial("objects/characters/human/us/nanosuit/nanosuit_us.mtl");
    g_USNanoMats[NANOMODE_DEFENSE].helmet = matMan->LoadMaterial("objects/characters/human/us/nanosuit/nanosuit_us_helmet.mtl");
    g_USNanoMats[NANOMODE_DEFENSE].arms = matMan->LoadMaterial( "objects/weapons/arms_global/arms_nanosuit_us.mtl");
    g_USNanoMats[NANOMODE_INVULNERABILITY].body = matMan->LoadMaterial("objects/characters/human/us/nanosuit/nanosuit_us_invulnerability.mtl");
    g_USNanoMats[NANOMODE_INVULNERABILITY].helmet = matMan->LoadMaterial("objects/characters/human/us/nanosuit/nanosuit_us_helmet_invulnerability.mtl");
    g_USNanoMats[NANOMODE_INVULNERABILITY].arms = matMan->LoadMaterial( "objects/weapons/arms_global/arms_nanosuit_us_invulnerability.mtl");
    g_USNanoMats[NANOMODE_DEFENSE_HIT_REACTION].body = matMan->LoadMaterial("objects/characters/human/us/nanosuit/nanosuit_us_invulnerability.mtl");
    g_USNanoMats[NANOMODE_DEFENSE_HIT_REACTION].helmet = matMan->LoadMaterial("objects/characters/human/us/nanosuit/nanosuit_us_helmet_invulnerability.mtl");
    g_USNanoMats[NANOMODE_DEFENSE_HIT_REACTION].arms = matMan->LoadMaterial( "objects/weapons/arms_global/arms_nanosuit_us_invulnerability.mtl");
    // strategically leak it
    for (int i=0; i<NANOMODE_LAST; ++i)
    {
    g_USNanoMats[i].body->AddRef();
    g_USNanoMats[i].helmet->AddRef();
    g_USNanoMats[i].arms->AddRef();
    }
    }

    if (!g_V2NanoMats[NANOMODE_SPEED].body)
    {
    g_V2NanoMats[NANOMODE_SPEED].body = matMan->LoadMaterial("");
    g_V2NanoMats[NANOMODE_SPEED].helmet = matMan->LoadMaterial("");
    g_V2NanoMats[NANOMODE_SPEED].arms = matMan->LoadMaterial( "");
    g_V2NanoMats[NANOMODE_STRENGTH].body = matMan->LoadMaterial("");
    g_V2NanoMats[NANOMODE_STRENGTH].helmet = matMan->LoadMaterial("");
    g_V2NanoMats[NANOMODE_STRENGTH].arms = matMan->LoadMaterial( "");
    g_V2NanoMats[NANOMODE_CLOAK].body = matMan->LoadMaterial("");
    g_V2NanoMats[NANOMODE_CLOAK].helmet = matMan->LoadMaterial("");
    g_V2NanoMats[NANOMODE_CLOAK].arms = matMan->LoadMaterial( "");
    g_V2NanoMats[NANOMODE_DEFENSE].body = matMan->LoadMaterial("");
    g_V2NanoMats[NANOMODE_DEFENSE].helmet = matMan->LoadMaterial("");
    g_V2NanoMats[NANOMODE_DEFENSE].arms = matMan->LoadMaterial( "");
    g_V2NanoMats[NANOMODE_INVULNERABILITY].body = matMan->LoadMaterial("");
    g_V2NanoMats[NANOMODE_INVULNERABILITY].helmet = matMan->LoadMaterial("");
    g_V2NanoMats[NANOMODE_INVULNERABILITY].arms = matMan->LoadMaterial( "");
    g_V2NanoMats[NANOMODE_DEFENSE_HIT_REACTION].body = matMan->LoadMaterial("");
    g_V2NanoMats[NANOMODE_DEFENSE_HIT_REACTION].helmet = matMan->LoadMaterial("");
    g_V2NanoMats[NANOMODE_DEFENSE_HIT_REACTION].arms = matMan->LoadMaterial( "");
    for (int i=0; i<NANOMODE_LAST; ++i)
    {
    g_V2NanoMats[i].body->AddRef();
    g_V2NanoMats[i].helmet->AddRef();
    g_v2NanoMats[i].arms->AddRef();
    }
    }

    if (bCacheAsian && !g_AsianNanoMats[NANOMODE_SPEED].body)
    {
    g_AsianNanoMats[NANOMODE_SPEED].body = matMan->LoadMaterial("objects/characters/human/asian/nanosuit/nanosuit_asian_speed.mtl");
    g_AsianNanoMats[NANOMODE_SPEED].helmet = matMan->LoadMaterial("objects/characters/human/asian/nanosuit/nanosuit_asian_helmet_speed.mtl");
    g_AsianNanoMats[NANOMODE_SPEED].arms = matMan->LoadMaterial("objects/weapons/arms_global/arms_nanosuit_asian_speed.mtl");
    g_AsianNanoMats[NANOMODE_STRENGTH].body = matMan->LoadMaterial("objects/characters/human/asian/nanosuit/nanosuit_asian_strength.mtl");
    g_AsianNanoMats[NANOMODE_STRENGTH].helmet = matMan->LoadMaterial("objects/characters/human/asian/nanosuit/nanosuit_asian_helmet_strength.mtl");
    g_AsianNanoMats[NANOMODE_STRENGTH].arms = matMan->LoadMaterial("objects/weapons/arms_global/arms_nanosuit_asian_strength.mtl");
    g_AsianNanoMats[NANOMODE_CLOAK].body = matMan->LoadMaterial("objects/characters/human/asian/nanosuit/nanosuit_asian_cloak.mtl");
    g_AsianNanoMats[NANOMODE_CLOAK].helmet = matMan->LoadMaterial("objects/characters/human/asian/nanosuit/nanosuit_asian_helmet_cloak.mtl");
    g_AsianNanoMats[NANOMODE_CLOAK].arms = matMan->LoadMaterial("objects/weapons/arms_global/arms_nanosuit_asian_cloak.mtl");
    g_AsianNanoMats[NANOMODE_DEFENSE].body = matMan->LoadMaterial("objects/characters/human/asian/nanosuit/nanosuit_asian.mtl");
    g_AsianNanoMats[NANOMODE_DEFENSE].helmet = matMan->LoadMaterial("objects/characters/human/asian/nanosuit/nanosuit_asian_helmet.mtl");
    g_AsianNanoMats[NANOMODE_DEFENSE].arms = matMan->LoadMaterial("objects/weapons/arms_global/arms_nanosuit_asian.mtl");
    g_AsianNanoMats[NANOMODE_INVULNERABILITY].body = matMan->LoadMaterial("objects/characters/human/asian/nanosuit/nanosuit_asian_invulnerability.mtl");
    g_AsianNanoMats[NANOMODE_INVULNERABILITY].helmet = matMan->LoadMaterial("objects/characters/human/asian/nanosuit/nanosuit_asian_helmet_invulnerability.mtl");
    g_AsianNanoMats[NANOMODE_INVULNERABILITY].arms = matMan->LoadMaterial("objects/weapons/arms_global/arms_nanosuit_asian_invulnerability.mtl");
    g_AsianNanoMats[NANOMODE_DEFENSE_HIT_REACTION].body = matMan->LoadMaterial("objects/characters/human/asian/nanosuit/nanosuit_asian_invulnerability.mtl");
    g_AsianNanoMats[NANOMODE_DEFENSE_HIT_REACTION].helmet = matMan->LoadMaterial("objects/characters/human/asian/nanosuit/nanosuit_asian_helmet_invulnerability.mtl");
    g_AsianNanoMats[NANOMODE_DEFENSE_HIT_REACTION].arms = matMan->LoadMaterial("objects/weapons/arms_global/arms_nanosuit_asian_invulnerability.mtl");
    // strategically leak it
    for (int i=0; i<NANOMODE_LAST; ++i)
    {
    g_AsianNanoMats[i].body->AddRef();
    g_AsianNanoMats[i].helmet->AddRef();
    g_AsianNanoMats[i].arms->AddRef();
    }
    }
    }

    CNanoSuit::SNanoMaterial* CNanoSuit::GetNanoMaterial(ENanoMode mode, bool bAsian)
    {
    const int nIndex = mode;
    if (nIndex < 0 || nIndex >= NANOMODE_LAST)
    return 0;

    PrecacheMaterials(bAsian);
    if (bAsian == false)
    return &g_USNanoMats[nIndex];
    else
    return &g_V2NanoMats[nIndex];
    else
    return &g_AsianNanoMats[nIndex];
    }

    bool CNanoSuit::AssignNanoMaterialToEntity(IEntity* pEntity, CNanoSuit::SNanoMaterial* pNanoMat)
    {
    bool bSuccess = false;
    SEntitySlotInfo slotInfo;
    bool isClient = false;

    CActor* pActor = static_cast<CActor*> (g_pGame->GetIGameFramework()->GetIActorSystem()->GetActor(pEntity->GetId()));
    if (pActor != 0 && pActor->IsClient())
    {
    isClient = true;
    }

    if(pNanoMat && pEntity->GetSlotInfo(0, slotInfo) && slotInfo.pCharacter!=0)
    {
    usw.

    Wie gesagt, ich beschäftige mich erst set kurzem mit dem Thema. Alles noch etwas kryptisch für mich.

    Grüsse



  • Storch1983 schrieb:

    Ich bin absoluter Anfänger auf dem Gebiet c++.

    Da haben wir schon das Problem.
    An Crysis rumzubasteln ist einfach noch zu schwierig für dich.



  • Ich versuche es lieber und lerne dabei etwas, anstatt zu sagen "ist mir zu schwer" und es liegen zu lassen. Ausserdem sind Foren doch dazu da dass man sein Wissen mit anderen teilt!?



  • @ Storch1983

    Lern erst mal die C++ Grundlagen bevor du an irgendwelchen Spielen rumwerkelst sonst ist das alles nur Zeitverschwendung.
    Ich vermute mal du versteh nicht einmal die hälfte von dem Code. Von daher lass die Finger davon.

    Ein Surf Anfänger fängt auch nicht sofort mit 15m Wellen an er probiert sich auch erst an kleinen Wellen.



  • wie Du sehen kannst habe ich den Tipp von Coder++

    if (NeuesMaterial)
    {
    LadeMaterial();
    }

    umgesetzt. Ich verstehe nicht was dererlei Kommentare sollen. Wenn jemand nicht willens ist zu helfen, warum auch immer, dann muss er das ja auch nicht.

    In einem anderen Forum hat jemand vergessen ein ; zu setzen ( also command end )
    und gefragt warum er ne Fehlermeldung bekommt. Und was war? Man hat ihm mitgeteilt dass das fehlt, und nicht "lerne erstmal die Grundlagen". Also bitte ich darum mir wie coder++ tipps zu geben oder es zu lassen, aber dererlei Kommentare helfen weder Euch noch mir.



  • Ja man, du bist halt ober kuhl und andere sind es nicht. Darum wäre es auch nett wenn du den einfacheren Leuten dein Problem mit mit einer schönen Formatierung durch Code-Tags beibringst ... einfache Gehirne haben sonst Probleme und geben zu früh auf!



  • Storch1983 schrieb:

    wie Du sehen kannst habe ich den Tipp von Coder++

    if (NeuesMaterial)
    {
    LadeMaterial();
    }

    umgesetzt. Ich verstehe nicht was dererlei Kommentare sollen. Wenn jemand nicht willens ist zu helfen, warum auch immer, dann muss er das ja auch nicht.

    Der Code von Coder++ war Pseudocode und wird garantiert NICHT funktionieren.

    In einem anderen Forum hat jemand vergessen ein ; zu setzen ( also command end )
    und gefragt warum er ne Fehlermeldung bekommt. Und was war? Man hat ihm mitgeteilt dass das fehlt, und nicht "lerne erstmal die Grundlagen". Also bitte ich darum mir wie coder++ tipps zu geben oder es zu lassen, aber dererlei Kommentare helfen weder Euch noch mir.

    Semikolon vergessen ist etwas ganz anderes als das, was du machst.
    Ich verweise dich gerne auf die einzige Art Hilfestelle, die es dafür gibt - die Doku: http://doc.crydev.net/AssetCreation/



  • Darin geht es um das arbeiten mit der Grafik- Engine und nicht um das editieren des Codes. Das Modell habe ich bereits für die Engine konvertiert, das war das kleinere Problem. Es geht für mich darum ob ich mit meiner Annahme richtig liege dass es durch editieren dieses Codes möglich ist, der Engine das Laden eines weiteren Material Layers, zu ermöglichen. Dieser ist nur für die Textur verantwortlich, nicht für das Objekt. Wenn jemand sagt dass das nicht durch das editieren einiger wenige Zeilen getan ist, dann hilft mir das schon weiter. Aber keine blöden Sprüche. Und kuhl, schreibt man cool! Jemand der "angeblich" programmieren kann sollte das eigentlich wissen...



  • ScottZhang schrieb:

    Ja man, du bist halt ober kuhl und andere sind es nicht. Darum wäre es auch nett wenn du den einfacheren Leuten dein Problem mit mit einer schönen Formatierung durch Code-Tags beibringst ... einfache Gehirne haben sonst Probleme und geben zu früh auf!

    Storch1983 schrieb:

    Und kuhl, schreibt man cool! Jemand der "angeblich" programmieren kann sollte das eigentlich wissen...

    👍 😃 👍 Storch1983 kannst du mir bitte ein Autogramm zu senden?

    Ok genug getrollt.^^

    Das Problem ist halt das du nur mit Tipps wohl nicht zum Ziel kommen wirst ... Tipps sind für Leute die schon eine gewisse Erfahrung haben und ohne Erfahrung kann man die Tipps leider nicht umsetzen.

    Es wird dir hier warscheinlich auch niemand eine komplett Lösung für dein Problem liefern. Für komplett Lösungen gibt es das Projekt Forum hier. Aber kostenlos wird das auch wiederrum wohl keiner machen.

    Und benutz mal die Code Tags.

    if ( Storch1983 == "MORE SKILL")
    {
       LoadModel();
    }
    

    Unter dem 😞 smiley steht C++ damit kannst du den Tag setzen.

    Wenn dein Code nicht in Tags ist hat keiner lust ihn zu lesen.^^



  • Storch1983 schrieb:

    Und kuhl, schreibt man cool! ...

    Hab ich doch ... 😉



  • Das ist die eigentliche Zeile, worum es mir geht:

    {
    	const int nIndex = mode;
    	if (nIndex < 0 || nIndex >= NANOMODE_LAST)
    		return 0;
    
    	PrecacheMaterials(bAsian);
    	if (bAsian == false)
    		return &g_USNanoMats[nIndex];
    	else
    		return &g_AsianNanoMats[nIndex];
    }
    

    versucht habe ich es so:

    {
    	const int nIndex = mode;
    	if (nIndex < 0 || nIndex >= NANOMODE_LAST)
    		return 0;
    
    	PrecacheMaterials(bAsian);
    	if (bAsian == false)
    		return &g_USNanoMats[nIndex];
    	else
    		return &g_V2NanoMats[nIndex]
    	else
    		return &g_AsianNanoMats[nIndex];
    }
    

    Wenn mir hier einer den kleinen Hinweis gibt wie die dritte Variable eingefügt werden könnte, bzw. wo der Fehler liegt, wäre ich schon dankbar. Dass ich das nicht in 4 Wochen hin kriege ist mir auch bewusst. Also lassen wir das gegenseitige Beleidigen.

    Sorry @ ScottZhang.


  • Mod

    ich glaube Storch1983 hat klargemacht, dass er euren tipp wahrgenommen hat dass er c++ lernen sollte, bevor er es verwendet. es zu wiederholen bumpt nur den thread unnoetigerweise.
    wenn ihm jemand helfen will, so bitte zum thema, rest wird entfernt.



  • Über all wo "bAsian" zu finden ist, müsstest du den Typ von "bool" zu z.B. "int" ändern, und idealerweise den Namen zu "nNanoMatsVersion" oder so.

    Überall wo auf "bAsian" (bzw. dann "nNanoMatsVersion") geprüft wird müsstest du aus den einfachen "ifs" dann etwas in der Art machen:

    {
        const int nIndex = mode;
        if (nIndex < 0 || nIndex >= NANOMODE_LAST)
            return 0;
    
        PrecacheMaterials(bAsian);
        if (nNanoMatsVersion == 0)
            return &g_USNanoMats[nIndex];
        else if (nNanoMatsVersion == 1)
            return &g_AsianNanoMats[nIndex];
        else
            return &g_V2NanoMats[nIndex];
    }
    

    Und natürlich müsstest du überall wo es g_USNanoMats und g_AsianNanoMats gibt nochmal eine Kopie von mit g_V2NanoMats anlegen.
    Also dort wo die Variable deklariert wird, und natürlich überall wo darauf zugegriffen wird. Also z.B. in der PrecacheMaterials Funktion.

    Und irgendwo muss irgendwie noch dafür gesorgt werden, dass man die dritte Option auch in die nNanoMatsVersion Variablen reinbekommt. Wozu vermutlich weitere Änderungen nötig sein werden.



  • Damit kann ich jetzt erstmal was anfangen. Es sind nur 3 weitere Dateien in denen auf bAsian verwiesen wird. Alles andere spielt sich nur in der "nanosuit.cpp" ab aus der ich den Auszug genommen habe. 🙂


Anmelden zum Antworten