Energy Reload
-
Автор темы
- #1
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
У новых пользователей, которые начинают изучать данный движок имеются вопросы как нарисовать тот или иной объект.
Сама функция рисовки не отличает от рисовки в в любом другом CryEngine
Структура AABB
В зависимости от версии движка, данная функция может отличаться.
Структура VecToScreen
if (!IRenderer::Singleton()->ProjectToScreen(&pVecToScreen))return result;
Как инициализировать класс IRenderer у каждого свой метод.
ProjectToScreen
GetWidth, GetHeight - получение разрешения экрана.
Сама функция рисовки не отличает от рисовки в в любом другом CryEngine
C++:
void Box3D(IEntity*pEnt, DWORD Color)
{
AABB bBox;
pEnt->GetWorldBoundsCenter(bBox);
Vec3 Min, Max, vVec1, vVec2, vVec3, vVec4, vVec5, vVec6, vVec7, vVec8;
Max = bBox.max;
Min = bBox.min;
vVec3 = Min;
vVec3.x = Max.x;
vVec4 = Min;
vVec4.y = Max.y;
vVec5 = Min;
vVec5.z = Max.z;
vVec6 = Max;
vVec6.x = Min.x;
vVec7 = Max;
vVec7.y = Min.y;
vVec8 = Max;
vVec8.z = Min.z;
if (!WorldToScreen(Min, vVec1))
return;
if (!WorldToScreen(Max, vVec2))
return;
if (!WorldToScreen(vVec3, vVec3))
return;
if (!WorldToScreen(vVec4, vVec4))
return;
if (!WorldToScreen(vVec5, vVec5))
return;
if (!WorldToScreen(vVec6, vVec6))
return;
if (!WorldToScreen(vVec7, vVec7))
return;
if (!WorldToScreen(vVec8, vVec8))
return;
DrawLine(vVec1, vVec5, Color);
DrawLine(vVec2, vVec8, Color);
DrawLine(vVec3, vVec7, Color);
DrawLine(vVec4, vVec6, Color);
DrawLine(vVec1, vVec3, Color);
DrawLine(vVec1, vVec4, Color);
DrawLine(vVec8, vVec3, Color);
DrawLine(vVec8, vVec4, Color);
DrawLine(vVec2, vVec6, Color);
DrawLine(vVec2, vVec7, Color);
DrawLine(vVec5, vVec6, Color);
DrawLine(vVec5, vVec7, Color);
}
C++:
struct AABB
{
Vec3 min;
Vec3 max;
enum type_reset { RESET };
inline Vec3 GetCenter() const
{
return (min + max)*0.5f;
}
inline bool IsEmpty() const
{
return min == max;
}
};
C++:
class IEntity
{
public:
__int64 GetWorldBoundsCenter(AABB &bbox)
{
typedef __int64(__thiscall* pFunc)(PVOID, AABB&);
return vFun_Call<pFunc>(this, virtual_index)(this, bbox);
}
C++:
bool WorldToScreen(Vec3 vEntPos, Vec3& vOut)
{
bool result =0;
VecToScreen pVecToScreen;
pVecToScreen.toX = vEntPos.x;
pVecToScreen.toY = vEntPos.y;
pVecToScreen.toZ = vEntPos.z;
pVecToScreen.outX = &vOut.x;
pVecToScreen.outY = &vOut.y;
pVecToScreen.outZ = &vOut.z;
if (!IRenderer::Singleton()->ProjectToScreen(&pVecToScreen))return result;
vOut.x *= (IRenderer::Singleton()->GetWidth() * 0.01f);
vOut.y *= (IRenderer::Singleton()->GetHeight() * 0.01f);
vOut.z *= 1.0f;
result=((vOut.z < 1.0f) && (vOut.x > 0) && (vOut.x < (float)IRenderer::Singleton()->GetWidth()) && (vOut.y > 0) && (vOut.y < (float)IRenderer::Singleton()->GetHeight()));
return result;
}
C++:
struct VecToScreen
{
public:
float toX;
float toY;
float toZ;
float* outX;
float* outY;
float* outZ;
};
Как инициализировать класс IRenderer у каждого свой метод.
ProjectToScreen
C++:
class IRenderer
{
public:
bool ProjectToScreen(VecToScreen* pVecToScreen)
{
typedef bool(__thiscall* oProjectToScreen)(PVOID, VecToScreen*);
return vFun_Call<oProjectToScreen>(this, virtyual_func)(this, pVecToScreen);
}
Последнее редактирование: