Skip to content

Commit

Permalink
SWM: Ported xrEngine
Browse files Browse the repository at this point in the history
  • Loading branch information
ShokerStlk authored and Xottab-DUTY committed Mar 28, 2018
1 parent be8a221 commit 7124ea7
Show file tree
Hide file tree
Showing 27 changed files with 180 additions and 12 deletions.
16 changes: 6 additions & 10 deletions src/Layers/xrRender/SkeletonRigid.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -171,7 +171,7 @@ void CKinematics::LL_ClearAdditionalTransform(u16 bone_id)
}

void CKinematics::BuildBoneMatrix(
const CBoneData* bd, CBoneInstance& bi, const Fmatrix* parent, u8 /*channel_mask = (1<<0)*/)
const CBoneData* bd, CBoneInstance& bi, const Fmatrix* parent, u8 channel_mask /*= (1<<0)*/)
{
bi.mTransform.mul_43(*parent, bd->bind_transform);
CalculateBonesAdditionalTransforms(bd, bi, parent, channel_mask); //--#SM+#--
Expand All @@ -182,18 +182,14 @@ void CKinematics::CalculateBonesAdditionalTransforms(
const CBoneData* bd, CBoneInstance& bi, const Fmatrix* parent, u8 channel_mask /* = (1<<0)*/)
{
// bi.mTransform.c - содержит смещение относительно первой кости модели\центра сцены (0, 0, 0)
BONE_TRANSFORM_VECTOR_IT it = m_bones_offsets.begin();
while (it != m_bones_offsets.end())
for (auto& it : m_bones_offsets)
{
if (it->m_bone_id == bd->GetSelfID())
if (it.m_bone_id == bd->GetSelfID())
{
Fvector vOldPos = bi.mTransform.c;
bi.mTransform.mulB_43(it->m_transform); // Rotation
bi.mTransform.c.add(vOldPos, it->m_transform.c); // Translation
const Fvector vOldPos = bi.mTransform.c;
bi.mTransform.mulB_43(it.m_transform); // Rotation
bi.mTransform.c.add(vOldPos, it.m_transform.c); // Translation
}

// next
++it;
}
}

Expand Down
2 changes: 1 addition & 1 deletion src/Layers/xrRender/r__dsgraph_render.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -357,7 +357,7 @@ class hud_transform_helper
FTold = Device.mFullTransform;

// XXX: Xottab_DUTY: custom FOV. Implement it someday
// It should something like this:
// It should be something like this:
// float customFOV;
// if (isCustomFOV)
// customFOV = V->getVisData().obj_data->m_hud_custom_fov;
Expand Down
2 changes: 2 additions & 0 deletions src/Layers/xrRenderPC_GL/rgl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -468,6 +468,8 @@ void CRender::OnFrame()
}
}

void CRender::BeforeWorldRender() {}
void CRender::AfterWorldRender() {}

// Implementation
IRender_ObjectSpecific* CRender::ros_create(IRenderable* parent) { return new CROS_impl(); }
Expand Down
3 changes: 3 additions & 0 deletions src/Layers/xrRenderPC_GL/rgl.h
Original file line number Diff line number Diff line change
Expand Up @@ -368,6 +368,9 @@ class CRender : public D3DXRenderBase
void ScreenshotAsyncEnd(CMemoryWriter& memory_writer) override;
void OnFrame() override;

void BeforeWorldRender() override; //--#SM+#-- +SecondVP+ Вызывается перед началом рендера мира и пост-эффектов
void AfterWorldRender() override; //--#SM+#-- +SecondVP+ Вызывается после рендера мира и перед UI

// Render mode
void rmNear() override;
void rmFar() override;
Expand Down
3 changes: 3 additions & 0 deletions src/Layers/xrRenderPC_R1/FStaticRender.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -149,6 +149,9 @@ void CRender::OnFrame()
Models->DeleteQueue();
}

void CRender::BeforeWorldRender() {}
void CRender::AfterWorldRender() {}

// Implementation
IRender_ObjectSpecific* CRender::ros_create(IRenderable* parent) { return new CROS_impl(); }
void CRender::ros_destroy(IRender_ObjectSpecific*& p) { xr_delete(p); }
Expand Down
3 changes: 3 additions & 0 deletions src/Layers/xrRenderPC_R1/FStaticRender.h
Original file line number Diff line number Diff line change
Expand Up @@ -188,6 +188,9 @@ class CRender : public D3DXRenderBase
virtual void ScreenshotAsyncEnd(CMemoryWriter& memory_writer) override;
virtual void OnFrame() override;

void BeforeWorldRender() override; //--#SM+#-- +SecondVP+ Вызывается перед началом рендера мира и пост-эффектов
void AfterWorldRender() override; //--#SM+#-- +SecondVP+ Вызывается после рендера мира и перед UI

// Render mode
virtual void rmNear() override;
virtual void rmFar() override;
Expand Down
3 changes: 3 additions & 0 deletions src/Layers/xrRenderPC_R2/r2.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -421,6 +421,9 @@ void CRender::OnFrame()
}
}

void CRender::BeforeWorldRender() {}
void CRender::AfterWorldRender() {}

// Implementation
IRender_ObjectSpecific* CRender::ros_create(IRenderable* parent) { return new CROS_impl(); }
void CRender::ros_destroy(IRender_ObjectSpecific*& p) { xr_delete(p); }
Expand Down
3 changes: 3 additions & 0 deletions src/Layers/xrRenderPC_R2/r2.h
Original file line number Diff line number Diff line change
Expand Up @@ -313,6 +313,9 @@ class CRender : public D3DXRenderBase
virtual void ScreenshotAsyncEnd(CMemoryWriter& memory_writer);
virtual void OnFrame();

void BeforeWorldRender() override; //--#SM+#-- +SecondVP+ Вызывается перед началом рендера мира и пост-эффектов
void AfterWorldRender() override; //--#SM+#-- +SecondVP+ Вызывается после рендера мира и перед UI

// Render mode
virtual void rmNear();
virtual void rmFar();
Expand Down
3 changes: 3 additions & 0 deletions src/Layers/xrRenderPC_R3/r3.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -545,6 +545,9 @@ void CRender::OnFrame()
}
}

void CRender::BeforeWorldRender() {}
void CRender::AfterWorldRender() {}

// Implementation
IRender_ObjectSpecific* CRender::ros_create(IRenderable* parent) { return new CROS_impl(); }
void CRender::ros_destroy(IRender_ObjectSpecific*& p) { xr_delete(p); }
Expand Down
3 changes: 3 additions & 0 deletions src/Layers/xrRenderPC_R3/r3.h
Original file line number Diff line number Diff line change
Expand Up @@ -351,6 +351,9 @@ class CRender : public D3DXRenderBase
virtual void ScreenshotAsyncEnd(CMemoryWriter& memory_writer);
virtual void OnFrame();

void BeforeWorldRender() override; //--#SM+#-- +SecondVP+ Вызывается перед началом рендера мира и пост-эффектов
void AfterWorldRender() override; //--#SM+#-- +SecondVP+ Вызывается после рендера мира и перед UI

// Render mode
virtual void rmNear();
virtual void rmFar();
Expand Down
3 changes: 3 additions & 0 deletions src/Layers/xrRenderPC_R4/r4.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -557,6 +557,9 @@ void CRender::OnFrame()
}
}

void CRender::BeforeWorldRender() {}
void CRender::AfterWorldRender() {}

// Implementation
IRender_ObjectSpecific* CRender::ros_create(IRenderable* parent) { return new CROS_impl(); }
void CRender::ros_destroy(IRender_ObjectSpecific*& p) { xr_delete(p); }
Expand Down
3 changes: 3 additions & 0 deletions src/Layers/xrRenderPC_R4/r4.h
Original file line number Diff line number Diff line change
Expand Up @@ -357,6 +357,9 @@ class CRender : public D3DXRenderBase
virtual void ScreenshotAsyncEnd(CMemoryWriter& memory_writer);
virtual void OnFrame();

void BeforeWorldRender() override; //--#SM+#-- +SecondVP+ Вызывается перед началом рендера мира и пост-эффектов
void AfterWorldRender() override; //--#SM+#-- +SecondVP+ Вызывается после рендера мира и перед UI

// Render mode
virtual void rmNear();
virtual void rmFar();
Expand Down
1 change: 1 addition & 0 deletions src/xrEngine/CameraBase.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ CCameraBase::CCameraBase(IGameObject* p, u32 flags)
f_fov = 90;
f_aspect = 1.f;
tag = 0;
m_bInputDisabled = false; //--#SM+#--
}

CCameraBase::~CCameraBase() {}
Expand Down
29 changes: 29 additions & 0 deletions src/xrEngine/CameraBase.h
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,8 @@ class ENGINE_API CCameraBase
float f_fov;
float f_aspect;

bool m_bInputDisabled; //--#SM+#-- Флаг, запрещающий любые повороты камеры игроком [flag for disable all user input]

IC Fvector Position() const { return vPosition; }
IC Fvector Direction() const { return vDirection; }
IC Fvector Up() const { return vNormal; }
Expand Down Expand Up @@ -83,6 +85,33 @@ class ENGINE_API CCameraBase
virtual float CheckLimYaw();
virtual float CheckLimPitch();
virtual float CheckLimRoll();

private: //--#SM+#--
float saved_yaw, saved_pitch, saved_roll;
Fvector vSavedPosition;
Fvector vSavedDirection;
Fvector vSavedNormal;

public: //--#SM+#--
virtual void SaveCamVec()
{
saved_yaw = yaw;
saved_pitch = pitch;
saved_roll = roll;
vSavedPosition = vPosition;
vSavedDirection = vDirection;
vSavedNormal = vNormal;
}
virtual void RestoreCamVec()
{
yaw = saved_yaw;
pitch = saved_pitch;
roll = saved_roll;
vPosition = vSavedPosition;
vDirection = vSavedDirection;
vNormal = vSavedNormal;
}
virtual IGameObject* GetOwner() { return parent; }
};

template <typename T>
Expand Down
1 change: 1 addition & 0 deletions src/xrEngine/IGame_ObjectPool.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ IGameObject* IGame_ObjectPool::create(LPCSTR name)
IGameObject* O = smart_cast<IGameObject*>(NEW_INSTANCE(CLS));
O->cNameSect_set(name);
O->Load(name);
O->PostLoad(name); //--#SM+#--
return O;
}

Expand Down
4 changes: 4 additions & 0 deletions src/xrEngine/IGame_Persistent.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,8 @@ IGame_Persistent::IGame_Persistent()
pEnvironment = new editor::environment::manager();
else
pEnvironment = new CEnvironment();

m_pGShaderConstants = new ShadersExternalData(); //--#SM+#--
}

IGame_Persistent::~IGame_Persistent()
Expand All @@ -51,6 +53,8 @@ IGame_Persistent::~IGame_Persistent()
#ifndef _EDITOR
xr_delete(pEnvironment);
#endif

xr_delete(m_pGShaderConstants); //--#SM+#--
}

void IGame_Persistent::OnAppActivate() {}
Expand Down
3 changes: 3 additions & 0 deletions src/xrEngine/IGame_Persistent.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
#include "EngineAPI.h"
#include "IGame_ObjectPool.h"
#endif
#include "ShadersExternalData.h" //--#SM+#--

class IRenderVisual;
class IMainMenu;
Expand Down Expand Up @@ -97,6 +98,8 @@ class ENGINE_API IGame_Persistent :

ParticleStatistics stats;

ShadersExternalData* m_pGShaderConstants; //--#SM+#--

const ParticleStatistics& GetStats() { return stats; }
virtual bool OnRenderPPUI_query() { return FALSE; }; // should return true if we want to have second function called
virtual void OnRenderPPUI_main(){};
Expand Down
4 changes: 4 additions & 0 deletions src/xrEngine/Render.h
Original file line number Diff line number Diff line change
Expand Up @@ -364,6 +364,9 @@ class ENGINE_API IRender
virtual void Calculate() = 0;
virtual void Render() = 0;

virtual void BeforeWorldRender() = 0; //--#SM+#-- Перед рендерингом мира
virtual void AfterWorldRender() = 0; //--#SM+#-- После рендеринга мира (до UI)

virtual void Screenshot(ScreenshotMode mode = SM_NORMAL, LPCSTR name = 0) = 0;
virtual void Screenshot(ScreenshotMode mode, CMemoryWriter& memory_writer) = 0;
virtual void ScreenshotAsyncBegin() = 0;
Expand All @@ -377,6 +380,7 @@ class ENGINE_API IRender

// Constructor/destructor
virtual ~IRender() {}

protected:
virtual void ScreenshotImpl(ScreenshotMode mode, LPCSTR name, CMemoryWriter* memory_writer) = 0;

Expand Down
18 changes: 18 additions & 0 deletions src/xrEngine/ShadersExternalData.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
#pragma once

// Хранилище внешних шейдерных параметров, которые читаются в Blender_Recorder_StandartBinding.cpp
class ShadersExternalData //--#SM+#--
{
public:
Fmatrix m_script_params; // Матрица, значения которой доступны из Lua
Fvector4 hud_params; // [zoom_rotate_factor, secondVP_zoom_factor, NULL, NULL] - Параметры худа оружия
Fvector4 m_blender_mode; // x\y = [0 - default, 1 - night vision, 2 - thermo vision, ... см. common.h] - Режимы рендеринга
// x - основной вьюпорт, y - второй вьюпорт, z = ?, w = [0 - идёт рендер обычного объекта, 1 - идёт рендер детальных объектов (трава, мусор)]

ShadersExternalData()
{
m_script_params = Fmatrix();
hud_params.set(0.f, 0.f, 0.f, 0.f);
m_blender_mode.set(0.f, 0.f, 0.f, 0.f);
}
};
14 changes: 14 additions & 0 deletions src/xrEngine/vis_common.h
Original file line number Diff line number Diff line change
Expand Up @@ -4,16 +4,30 @@
#include "xrCore/_sphere.h"
#include "xrCore/_fbox.h"

#include "vis_object_data.h" //--#SM+#--

#pragma pack(push, 4)
struct vis_data
{
private:
vis_object_data obj_data_self; //--#SM+#-- Свои собственные объектные данные [personal shaders data of this model]

public:
Fsphere sphere; //
Fbox box; //
u32 marker; // for different sub-renders
u32 accept_frame; // when it was requisted accepted for main render
u32 hom_frame; // when to perform test - shedule
u32 hom_tested; // when it was last time tested

vis_object_data* obj_data; //--#SM+#-- Объектные данные, используемые при рендере этой модели [shaders data which
//will be used at render for this model]

vis_data::vis_data() //--#SM+#--
{
obj_data = &obj_data_self;
}

IC void clear()
{
sphere.P.set(0, 0, 0);
Expand Down
34 changes: 34 additions & 0 deletions src/xrEngine/vis_object_data.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
#pragma once

// Структура, хранящие уникальные данные для конкретного визуала --#SM+#--
// PS: Не оптимально хранить эти данные для каждой модели (и её составных), но ради удобства приходится жертвовать немного ОЗУ
struct vis_object_data
{
// == Weapons == //
int m_max_bullet_bones; // Максимальное число костей в модели с привязкой к числу патронов (0 по дефолту)

// == HUD == //
float m_hud_custom_fov; // Кастомный FOV для рендера этой модели в режиме худа (-1.f по дефолту)

// == Generic == //
Fmatrix sh_camo_data; // Данные для камуфляжа (передаются в шейдеры)
Fvector4 sh_custom_data; // Кастомные данные, содержимое которых зависит от использующих их шейдеров и кода (передаются в шейдеры)
Fvector4 sh_entity_data; // Параметры "живых" объектов (передаются в шейдеры)
/*
1) health - здоровье объекта (-2 если такого параметра нет у объекта)
2) radiation - радиация объекта (-2 если такого параметра нет у объекта)
3) condition - кондишион объекта (-2 если такого параметра нет у объекта)
4) irnv value - коэффициент "теплового излучения" модели (0.0 - 1.0)
*/

// Инициализируем начальные данные
vis_object_data()
{
m_max_bullet_bones = 0;
m_hud_custom_fov = -1.f;

sh_camo_data = Fmatrix();
sh_custom_data.set(0.f, 0.f, 0.f, 0.f);
sh_entity_data.set(-2.f, -2.f, -2.f, 0.f);
}
};
2 changes: 2 additions & 0 deletions src/xrEngine/xrEngine.vcxproj
Original file line number Diff line number Diff line change
Expand Up @@ -251,6 +251,7 @@
<ClInclude Include="Rain.h" />
<ClInclude Include="Render.h" />
<ClInclude Include="splash.h" />
<ClInclude Include="ShadersExternalData.h" />
<ClInclude Include="StatGraph.h" />
<ClInclude Include="Stats.h" />
<ClInclude Include="stdafx.h" />
Expand All @@ -259,6 +260,7 @@
<ClInclude Include="thunderbolt.h" />
<ClInclude Include="tntQAVI.h" />
<ClInclude Include="vis_common.h" />
<ClInclude Include="vis_object_data.h" />
<ClInclude Include="WaveForm.h" />
<ClInclude Include="xrHemisphere.h" />
<ClInclude Include="xrImage_Resampler.h" />
Expand Down
6 changes: 6 additions & 0 deletions src/xrEngine/xrEngine.vcxproj.filters
Original file line number Diff line number Diff line change
Expand Up @@ -559,6 +559,12 @@
<ClInclude Include="splash.h">
<Filter>General</Filter>
</ClInclude>
<ClInclude Include="vis_object_data.h">
<Filter>Render\Visibility</Filter>
</ClInclude>
<ClInclude Include="ShadersExternalData.h">
<Filter>Render\Visibility</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<ClCompile Include="defines.cpp">
Expand Down
Loading

0 comments on commit 7124ea7

Please sign in to comment.