Исходник Рисуем 3D Box

Energy Reload
Забаненный
Статус
Оффлайн
Регистрация
20 Авг 2017
Сообщения
1,206
Реакции[?]
330
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
У новых пользователей, которые начинают изучать данный движок имеются вопросы как нарисовать тот или иной объект.

Сама функция рисовки не отличает от рисовки в в любом другом 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);
}
Структура AABB
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;
}
Структура VecToScreen
C++:
struct VecToScreen
{
public:
    float toX;
    float toY;
    float toZ;
    float* outX;
    float* outY;
    float* outZ;
};
if (!IRenderer::Singleton()->ProjectToScreen(&pVecToScreen))return result;

Как инициализировать класс 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);
    }
GetWidth, GetHeight - получение разрешения экрана.
 
Последнее редактирование:
Energy Reload
Забаненный
Статус
Оффлайн
Регистрация
20 Авг 2017
Сообщения
1,206
Реакции[?]
330
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Сверху Снизу