• Уважаемые гости и новички, приветствуем Вас на нашем форуме
    Здесь вы можете найти ответы практически на все свои вопросы о серии игр «Готика» (в том числе различных модах на нее), «Ведьмак», «Ризен», «Древние свитки», «Эра дракона» и о многих других играх. Можете также узнать свежие новости о разработке новых проектов, восхититься творчеством наших форумчан, либо самим показать, что вы умеете. Ну и наконец, можете обсудить общие увлечения или просто весело пообщаться с посетителями «Таверны».

    Чтобы получить возможность писать на форуме, оставьте сообщение в этой теме.
    Удачи!
  • Друзья, спешите принять участие в поэтическом конкурсе "Весенние поэты 2024"!
    Ждем именно вас!

    Ссылка на конкурсную тему - тык

Помощь по спейсеру

Kirey

Участник форума
Регистрация
28 Май 2007
Сообщения
106
Благодарности
4
Баллы
165
  • Первое сообщение
  • #1
У меня вопрос ко второй части с аддоном. Там для неёё есть такая прога - спейсер2. Как я понял. это чё то типа моо маппера для ГТА Вайс Сити. Пробую загрузить зен-файлы, там локации. Обещали что можно бужет просмотреть, музыку послушать. А у мя только чёрный экран и 100 ФПС показывает и грузится мгновенно. Что делать, умные, помогите!

Unsubdued

Здравствуйте, когда-то у меня глючил Spacer2. Тогда я воспользовался советом из этой темы и создал батник с содержимым:
Код:
@echo off
start / Spacer2.exe -zMaxFramerate:60
вроде как-то так.

Вчера опять начались зависания при текстурировании. В том месте, где конец локации. Вспомнив, что при перечитывании форума, натыкался на сообщение, что Spacer может глючить из-за многоядерности процессора, посадил его, через диспетчер задач, на одно ядро. Зависания прекратились. Но не лазить же каждый раз в диспетчер. Поэтому немного изменил батник. Теперь он выглядит так:

Код:
@echo off
start /affinity 1 Spacer2.exe -zMaxFramerate:60

Spacer запускается через него на одном ядре.

Может кому-нибудь поможет)))))

Дополнено:
У многих возникает проблема с НЕ падение FPS, а с его ростом, в результате чего возникают жуткие тормоза в программе.
Вот мой код для запуска Спейсера(проверено, протестено, работает):
Код:
PsExec -a 0 "F:\games\Gothic II\System\Spacer2.exe"
весь архив распаковал в папку C:\Windows\System32\
Мах FPS поднимается до 500, тормоза, где даже с -zmaxframerate 50 были... они пропали...
Если кому интересно, вот небольшая статейка по использованию PsExec
Сама программа в комплекте PsTools
Теперь описание и прога здесь.
Такой своевременный вопросец *nice meeting*
В Spacer можно изменить дальность прорисовки?
Ctrl + F1 -> ZSET LEVELFARCLIPZSCALER <number> (1 as default)
 
Последнее редактирование модератором:

Lev-Lion


Модостроитель
Регистрация
25 Апр 2006
Сообщения
181
Благодарности
273
Баллы
230
Трудно сказать, я не моделлер, вроде все в формате 3дс.

Теперь у меня возникла необходимость создать новые фильтры для деревянных, каменных и земляных текстур. За каждый пункт я так понимаю отвечают группы материалов WOOD, STONE, и EARTH. На что еще кроме звуков ходьбы и эффекта удара по материалу влияют эти группы? Для воды это также возможность плавать.
 
Последнее редактирование:

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.339
Благодарности
3.183
Баллы
525
вроде все в формате 3дс
Тогда открывай проблемные модели в Спейсере и смотри, какое название там имеют материалы. Возможно, названия материалов в этих моделях отличается от тех, которые имеются в библиотеке, и настроены на отключение коллизий. На всякий случай: название материала и название текстуры - это не одно и то же. Одну текстуру могут использовать материалы с разными названиями.

создать новые фильтры для деревянных, каменных и земляных текстур
Это не обязательно. Главное, чтобы в свойствах материалов был прописан соответствующий параметр. Но для удобства можно создать и разные фильтры.

На что еще кроме звуков ходьбы и эффекта удара по материалу влияют эти группы?
При ударе, кроме звука, генерируется ещё и соответствующий эффект частиц. Материал поверхности учитывается при выборе звука от падения предмета на эту поверхность. Вроде бы, отскакивание стрел при попадании в поверхность тоже зависит от её материала. Ну, это для Г2 актуально. В Г1 такой хрени нет.
 

Lev-Lion


Модостроитель
Регистрация
25 Апр 2006
Сообщения
181
Благодарности
273
Баллы
230
В общем я попытался скомпилить деревянный воб в новом фильтре, который назначает свойство материала дерево. Танцы с бубном результатов не принесли. Перекомпилил сам зен с новым фильтром, затем текстуры фильтра и разумеется меши самих вобов.
Дело в том, что я хочу добиться эффекта звука ходьбы по дереву а не стандартный (undef) звук камня. В нашей локации шахты будет тьма всяких вобов подпорок и деревянных платформ и озвучка ходьбы по ним, как по камню звучит несколько странно. Хотя это не критично и впечатление о шахте не испортит. Тем не менее есть досада. Я вообще начинаю сомневаться в том, что эта фишка для вобов вообще работает в игре. Другое дело, когда деревянный фильтр обрабатывает материалы меша самого зена, тут все как по маслу.
Безымянный.jpg
 

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.339
Благодарности
3.183
Баллы
525
Я вообще начинаю сомневаться в том, что эта фишка для вобов вообще работает в игре. Другое дело, когда деревянный фильтр обрабатывает материалы меша самого зена, тут все как по маслу.
Правильно сомневаешься. Для объектов это не работает. Автоматический выбор звука шагов работает только для материалов меша. Намекни разработчикам Юньки. Может быть, они смогут исправить ситуацию.

У себя в проекте даже подкладывал под деревянные мостики прозрачные полигоны в меше, у которых назначен материал со свойствами дерева. Подсмотрел в Г2. Но это геморр, если честно. Для массового использования способ непригоден.
 

alexeich2019

Участник форума
Регистрация
28 Июн 2019
Сообщения
191
Благодарности
73
Баллы
125
ElderGamer, Lev-Lion, как вариант, вместо подкладывания в меш прозрачных полигонов, можно вставить туда тот самый воб. И настраивать ничего не надо - текстуры-то будут сразу с нужным фильтром.
 

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.339
Благодарности
3.183
Баллы
525
У данного подхода, помимо очевидных и не очевидных достоинств, к сожалению, есть и некоторые недостатки. Не всегда очевидные. :)
 

Myxomop

Почетный форумчанин
Регистрация
28 Май 2005
Сообщения
3.238
Благодарности
2.579
Баллы
455
Lev-Lion,
Пробовал через Spacer открывать исходник модели воба в 3ds (с подготовленными материалами естественно), компилировать в режиме Editor Mode чтобы модель отобразилась в окне Spacer, затем пересохранить 3ds средствами Spacer "Save Mesh", после чего компилировать меш воба уже игрой?
Перекомпиляция текстур tga - в -C.TEX ничем не поможет, т.к. компилированные текстуры не несут никаких свойств материала.
 

Lev-Lion


Модостроитель
Регистрация
25 Апр 2006
Сообщения
181
Благодарности
273
Баллы
230
Нет я так еще не пробовал. Что то подсказывает мне, что связываться с эдит модом Спайсера, дело крайне рисковое. По опыту знаю, что если в нем редактировать меш, то материалы порталов летят ко всем чертям, что наводит на всякие мысли... Но в качестве эксперимента попробовать всеже стоит. :)
Подставлять в меш зэна прозрачные материалы на мой взгляд это не только гемор, но еще и готовые проблемы с производительностью.
 
Последнее редактирование:

Myxomop

Почетный форумчанин
Регистрация
28 Май 2005
Сообщения
3.238
Благодарности
2.579
Баллы
455
Lev-Lion,
Ну мне такой способ пересохранения .3ds через Spacer точно помогал в решении каких-то нюансов после сохранения через 3d Max, но что конкретно уже не помню :D
Да и меш отдельного 3ds объекта воба существенно проще меша локации и не содержит никаких порталов. О результатах отпиши пожалуйста.
 

Lev-Lion


Модостроитель
Регистрация
25 Апр 2006
Сообщения
181
Благодарности
273
Баллы
230
Проверил. Не работает. Звуки по прежнему каменные. В общем Иннос с ним... Нет так нет.
 

Slavemaster


Модостроитель
Регистрация
10 Июн 2019
Сообщения
1.044
Благодарности
1.827
Баллы
240
Ну, костылём не сложно поправить...

Можно также добавить функцию в GOTHIC.DAT:
C++:
func string Union_GroundSoundFix_GetLandPfxName(var int matGroup)
{
    const int MAT_GROUP_UNDEF = 0;
    const int MAT_GROUP_METAL = 1;
    const int MAT_GROUP_STONE = 2;
    const int MAT_GROUP_WOOD = 3;
    const int MAT_GROUP_EARTH = 4;
    const int MAT_GROUP_WATER = 5;
    const int MAT_GROUP_SNOW = 6;
    
    if (matGroup == MAT_GROUP_WATER)
    {
        return "PFX_WATERSPLASH";
    };
    
    return "PFX_DUST";
};
C++:
namespace NAMESPACE
{
    std::unordered_map<zCVob*, zTMat_Group> groundMatGroups;

    CSubscription clearGroundMatGroups(ZSUB(PreLoop), []()
        {
            groundMatGroups.clear();
        });

    zTMat_Group CalcGroundMatGroup(zCVob* vob)
    {
        zTMat_Group groundMat = COA4(vob, groundPoly, material, matGroup);
        zCWorld* world = COA2(vob, homeWorld);

        if (!world)
            return groundMat;

        int rayFlags = zTRACERAY_STAT_POLY | zTRACERAY_POLY_IGNORE_TRANSP | zTRACERAY_POLY_TEST_WATER | zTRACERAY_VOB_IGNORE_CHARACTER;
        rayFlags |= ZENDEF(0, 0, 0, zTRACERAY_VOB_IGNORE_PROJECTILES);

        if (!world->TraceRayNearestHit(vob->GetPositionWorld(), zVEC3(0, -20000, 0), vob, rayFlags))
            return groundMat;

        const zTTraceRayReport& report = world->traceRayReport;
        zCMaterial* foundPolyMat = nullptr;

        if (report.foundPoly)
            foundPolyMat = report.foundPoly->material;
        else
            if (report.foundVob)
            {
                zCProgMeshProto* mesh = dynamic_cast<zCProgMeshProto*>(report.foundVob->GetVisual());

                if (mesh && mesh->numSubMeshes > 0)
                    foundPolyMat = mesh->subMeshList[0].material;
            }

        return foundPolyMat ? foundPolyMat->matGroup : groundMat;
    }

    zTMat_Group CalcGroundMatGroup_Cached(zCVob* vob)
    {
        auto it = groundMatGroups.find(vob);

        if (groundMatGroups.find(vob) != groundMatGroups.end())
            return it->second;

        return groundMatGroups[vob] = CalcGroundMatGroup(vob);
    }

    void __fastcall Hook_zCModel_DoAniEvents(zCModel*, void*, zCModelAniActive*);
    CInvoke<void(__thiscall*)(zCModel*, zCModelAniActive*)> Ivk_zCModel_DoAniEvents(ZenDef<TInstance>(0x00561AF0, 0x0057A1F0, 0x00576370, 0x0057B890), &Hook_zCModel_DoAniEvents, IvkEnabled(ENGINE));
    void __fastcall Hook_zCModel_DoAniEvents(zCModel* _this, void* vtable, zCModelAniActive* a0)
    {
        TScope<zTMat_Group> scope;

        zCMaterial* groundPolyMat = COA4(_this, homeVob, groundPoly, material);

        if (groundPolyMat)
        {
            zTMat_Group newMatGroup = CalcGroundMatGroup_Cached(_this->homeVob);
          
            if (newMatGroup != zMAT_GROUP_UNDEF && newMatGroup != groundPolyMat->matGroup)
                scope = std::move(AssignTemp(groundPolyMat->matGroup, newMatGroup));
        }

        Ivk_zCModel_DoAniEvents(_this, a0);
    }

    zSTRING GetLandPfxName(zTMat_Group matGroup)
    {
        static CSymbol func(parser, (A"Union_GroundSoundFix_GetLandPfxName").Upper());
        static bool initialized = false;

        if (!initialized)
        {
            if (func.GetType() != CSymbol::Type::Func || func.GetSymbol()->offset != zPAR_TYPE_STRING || func.GetSymbol()->ele != 1 ||
                CSymbol(func.GetParser(), func.GetIndex() + 1).GetSymbol()->type != zPAR_TYPE_INT)
            {
                func = { };
            }

            initialized = true;
        }

        if (func.GetType() != CSymbol::Type::Unknown)
        {
            PushArguments(func.GetParser(), (int)matGroup);
            func.GetParser()->DoStack(func.GetValue<int>(0));
            zSTRING pfxName;
            PopArguments(func.GetParser(), pfxName);
            return pfxName;
        }

        static zCPar_Symbol* watersplash = parserParticleFX->GetSymbol("PFX_WATERSPLASH");

        if (watersplash && matGroup == zMAT_GROUP_WATER)
            return watersplash->name;

        return "PFX_DUST";
    }

    void __fastcall Hook_zCAIPlayer_UpdateEffects(zCAIPlayer*, void*);
    CInvoke<void(__thiscall*)(zCAIPlayer*)> Ivk_zCAIPlayer_UpdateEffects(ZenDef<TInstance>(0x004FEE20, 0x005122B0, 0x0050BBE0, 0x0050E990), &Hook_zCAIPlayer_UpdateEffects, IvkEnabled(ENGINE));
    void __fastcall Hook_zCAIPlayer_UpdateEffects(zCAIPlayer* _this, void* vtable)
    {
        TScope<void*> scope;
        zSTRING pfxName;

        if (_this->vob && _this->startFXModelLandDust)
        {
            void** address = (void**)ZENDEF(0x004FF1B1, 0x00512677, 0x0050BF0D, 0x0050ECBF);
            static TMemUnlocker unlocker(address, 4, true);
            zTMat_Group matGroup = CalcGroundMatGroup_Cached(_this->vob);
            pfxName = GetLandPfxName(matGroup);
            scope = std::move(AssignTemp(*address, (void*)pfxName.ToChar()));
        }

        Ivk_zCAIPlayer_UpdateEffects(_this);
    }
}
 

Вложения

  • Union_GroundSoundFix.vdf
    79,5 KB · Просмотры: 5
Последнее редактирование:

Lev-Lion


Модостроитель
Регистрация
25 Апр 2006
Сообщения
181
Благодарности
273
Баллы
230
Этот плагин позволяет фильтру материалов проигрывать звук материала для вобов?
 
Последнее редактирование:

Slavemaster


Модостроитель
Регистрация
10 Июн 2019
Сообщения
1.044
Благодарности
1.827
Баллы
240
Этот плагин позволяет фильтру материалов проигрывать звук материала для вобов?
Да. Путём временной замены свойста материала полигона, на свойство матерала первого субмеша воба.
 

Lev-Lion


Модостроитель
Регистрация
25 Апр 2006
Сообщения
181
Благодарности
273
Баллы
230
Тоесть после установки юниона и плагина, нужно перекомпилить текстуры или вобы?
 

Slavemaster


Модостроитель
Регистрация
10 Июн 2019
Сообщения
1.044
Благодарности
1.827
Баллы
240
Тоесть после установки юниона и плагина, нужно перекомпилить текстуры или вобы?
Нет. Просто при ходьбе звук материала нижележащего воба будет проигрываться (если таковой имеется), а не материала полигона зена, который под этим вобом.
Просто ставишь Юнион и этот плагин и смотришь в игре - правильный ли звук проигрывается при ходьбе.
 

Lev-Lion


Модостроитель
Регистрация
25 Апр 2006
Сообщения
181
Благодарности
273
Баллы
230
Надо будет проверить. :)
 

Lev-Lion


Модостроитель
Регистрация
25 Апр 2006
Сообщения
181
Благодарности
273
Баллы
230
Slavemaster
Все сделал по инструкции. Все вроде отлично работает. Я поверить не могу своему счастью. Хожу по всем вобам шахты, и деревянный звук подпорок и платформ ласкает ухо! Осталось теперь насовать в свои фильтры большую часть текстур дерева, камня и металла чтобы получить как можно большее разнообразие звуков ходьбы в игре. И самое главное, что ненужно никакой долбежки с перекомпиляцией текстур и мешей самих вобов, что отняло бы у меня пол года на все это... Просто круто!

В идеале, чтобы кто-нибудь еще проверил бы работоспособность плагина. Желательно без всяких перекомпилов. У меня уже в голове каша от перебора огромного кол-ва вобов порядка 3000 штук!!

Спасибо тебе камрад за такое дело!

В честь такого обязательно вскоре сделаю видос покатушек на вагонетке в шахте. :)
 
Последнее редактирование:

ElderGamer


Модостроитель
Регистрация
16 Апр 2008
Сообщения
4.339
Благодарности
3.183
Баллы
525
Ну, костылём не сложно подпереть...
А как насчёт правильного определения материала воды, если глубина не доходит "до колена"? Сейчас при этом не используется звук передвижения по воде, не цепляются соответствующие эффекты частиц. Мало того, можно увидеть эффект пыли при прыжках в воде. :D
 
Сверху Снизу