// G2a
// 0x006013E0 public: void __thiscall zCVob::CalcRenderAlpha(float dist, zCVisual*& pVisual, float& alpha)
void __fastcall CalcRenderAlpha(zCVob* _this, void* vt, float dist, zCVisual*& pVisual, float& alpha);
CInvoke <void(__thiscall*) (zCVob* _this, float dist, zCVisual*& pVisual, float& alpha)> pCalcRenderAlpha(0x006013E0, CalcRenderAlpha, IVK_AUTO);
void __fastcall CalcRenderAlpha(zCVob* _this, void* vt, float dist, zCVisual*& pVisual, float& alpha)
{
// вызываем настоящую функцию
// (на всякий случай, вдруг к ней привязаны другие перехватчики)
pCalcRenderAlpha(_this, dist, pVisual, alpha);
// если объект не имеет визуала ИЛИ не находится на локации ИЛИ находится в воде(? странно)
if (!_this->GetVisual() || !_this->homeWorld || _this->bIsInWater)
// выходим, т.к. прозрачность воба в этих ситуациях уже посчитана: 0.0f, 0.0f, 1.0f
return;
// для НПС
if (dynamic_cast<oCNpc*>(_this))
// если вкл. полупрозрачность тела, то используем спец. значение альфы (alpha = _this->visualAlpha),
// иначе, сообщаем рендеру, что это обычный непрозрачный объект (alpha = 1.0f)
alpha = _this->visualAlphaEnabled ? _this->visualAlpha : 1.0f;
// Примечание: (alpha = 0.0f) - запрещает рендерить воб
}
void Game_Loop()
{
// получение некоторых величин
float ins_range = oCSpawnManager::GetInsertRange(); // дист. вставки НПС
float rem_range = oCSpawnManager::GetRemoveRange(); // дист. удаления НПС
float mesh_lod = zCProgMeshProto::GetLODParamStrengthModifier(); // коф. упрощения мешей (0 - лоу поли, 1.0 - детальнее)
float vob_scab = ogame->world->vobFarClipZScalability;
// вывод на экран
screen->Print(100, 1300, string::Combine("vob_scabty = %f", vob_scab));
screen->Print(100, 1600, string::Combine("range = %i-%i", (int)ins_range, (int)rem_range));
screen->Print(100, 1900, string::Combine("mesh_lod = %f", mesh_lod));
// величины изменения параметров:
float lod_offset = 0.05f; // для LOD
float scab_offset = 0.1f; // для ZScalability
float spawn_offset = 100.0f; // для Range
/********************************************/
// Настройка тумана и дальности прорисовки
/********************************************/
if (zKeyPressed(KEY_NUMPAD1))
{
// убавление
vob_scab -= scab_offset;
ogame->world->vobFarClipZScalability = vob_scab;
ogame->world->GetActiveSkyControler()->SetFarZScalability(vob_scab);
}
if (zKeyPressed(KEY_NUMPAD2))
{
// прибавление
vob_scab += scab_offset;
ogame->world->vobFarClipZScalability = vob_scab;
ogame->world->GetActiveSkyControler()->SetFarZScalability(vob_scab);
}
/**************************************************/
// Настройка дальности появления и исчезания НПС
/**************************************************/
if (zKeyPressed(KEY_NUMPAD4))
{
// убавление
oCSpawnManager::SetInsertRange(ins_range - spawn_offset);
oCSpawnManager::SetRemoveRange(rem_range - spawn_offset);
}
if (zKeyPressed(KEY_NUMPAD5))
{
// прибавление
oCSpawnManager::SetInsertRange(ins_range + spawn_offset);
oCSpawnManager::SetRemoveRange(rem_range + spawn_offset);
// после изменения настроек,
// вызываем мгновенное появление НПС
ogame->spawnman->SpawnImmediately(TRUE);
}
/******************/
// LOD для мешей
/******************/
if (zKeyPressed(KEY_NUMPAD7))
{
// упрощение модели
mesh_lod -= lod_offset;
zClamp(mesh_lod, 0.0f, 1.0f);
zCProgMeshProto::SetLODParamStrengthModifier(mesh_lod);
}
if (zKeyPressed(KEY_NUMPAD8))
{
// усложнение модели
mesh_lod += lod_offset;
zClamp(mesh_lod, 0.0f, 1.0f);
zCProgMeshProto::SetLODParamStrengthModifier(mesh_lod);
}
}