| @@ -173,7 +173,7 @@ void Camera::SetPosition(vec3 pos, bool keep_target) | |||
| if (keep_target) | |||
| SetView(pos, GetTarget(), GetUp()); | |||
| else | |||
| SetView(GetView() * mat4::translate(pos - m_position)); | |||
| SetView(GetView() * mat4::translate(m_position - pos)); | |||
| m_position = pos; | |||
| } | |||
| @@ -98,7 +98,8 @@ vec3 Debug::ScreenToWorld(vec3 pos, mat4 view, mat4 proj) | |||
| } | |||
| //Draw stuff in World | |||
| //-- LINE: 3D -2D - 3D_to_2D | |||
| //-- LINE: 3D -2D - 3D_to_2D -------------------------------------------------- | |||
| void Debug::DrawLine(vec3 a, vec3 b) { Debug::DrawLine(a, b, g_scene->GetLineColor()); } | |||
| void Debug::DrawLine(vec2 a, vec3 b, float az) { Debug::DrawLine(a, b, g_scene->GetLineColor(), az); } | |||
| void Debug::DrawLine(vec2 a, vec2 b, float az, float bz) { Debug::DrawLine(a, b, g_scene->GetLineColor(), az, bz); } | |||
| @@ -106,7 +107,56 @@ void Debug::DrawLine(vec3 a, vec3 b, vec4 color) { g_scene->A | |||
| void Debug::DrawLine(vec2 a, vec3 b, vec4 color, float az) { g_scene->AddLine(a, b, color, az); } | |||
| void Debug::DrawLine(vec2 a, vec2 b, vec4 color, float az, float bz){ g_scene->AddLine(a, b, color, az, bz); } | |||
| //-- ARROW: 3D -2D - 3D_to_2D | |||
| //-- GIZMO -------------------------------------------------------------------- | |||
| void Debug::DrawGizmo(vec3 pos, vec3 x, vec3 y, vec3 z, float size) | |||
| { | |||
| Debug::DrawLine(pos, pos + x * size, Color::red); | |||
| Debug::DrawLine(pos, pos + y * size, Color::green); | |||
| Debug::DrawLine(pos, pos + z * size, Color::blue); | |||
| } | |||
| void Debug::DrawGizmo(vec2 pos, vec3 x, vec3 y, vec3 z, float size, float posz) | |||
| { | |||
| Debug::DrawLine(pos, pos + x.xy * size, Color::red, posz, posz + x.z * size); | |||
| Debug::DrawLine(pos, pos + y.xy * size, Color::green, posz, posz + y.z * size); | |||
| Debug::DrawLine(pos, pos + z.xy * size, Color::blue, posz, posz + z.z * size); | |||
| } | |||
| //-- GRID --------------------------------------------------------------------- | |||
| void Debug::DrawGrid(vec3 pos, vec3 x, vec3 y, vec3 z, float size, bool draw_3d) | |||
| { | |||
| float seg_sz = g_scene->GetLineSegmentSize(); | |||
| int seg_nb = lol::max((int)(size / seg_sz), 1); | |||
| seg_sz = size / (float)seg_nb; | |||
| //Draw Gizmo | |||
| Debug::DrawGizmo(pos, x, y, z, size); | |||
| Debug::DrawLine(pos, pos - x * size, Color::gray); | |||
| Debug::DrawLine(pos, pos - y * size, Color::gray); | |||
| Debug::DrawLine(pos, pos - z * size, Color::gray); | |||
| //grid | |||
| for (float i = -seg_nb; i <= seg_nb; i++) | |||
| { | |||
| if (i != 0) | |||
| { | |||
| float iter = seg_sz * ((float)i); | |||
| Debug::DrawLine(vec3(-size, 0, iter), vec3(size, 0, iter), Color::gray_dark); | |||
| Debug::DrawLine(vec3(iter, 0, -size), vec3(iter, 0, size), Color::gray_dark); | |||
| if (draw_3d) | |||
| { | |||
| Debug::DrawLine(vec3(0, -size, iter), vec3(0, size, iter), Color::gray_dark); | |||
| Debug::DrawLine(vec3(0, iter, -size), vec3(0, iter, size), Color::gray_dark); | |||
| Debug::DrawLine(vec3(-size, iter, 0), vec3(size, iter, 0), Color::gray_dark); | |||
| Debug::DrawLine(vec3(iter, -size, 0), vec3(iter, size, 0), Color::gray_dark); | |||
| } | |||
| } | |||
| } | |||
| } | |||
| //-- ARROW: 3D -2D - 3D_to_2D ------------------------------------------------- | |||
| void Debug::DrawArrow(vec3 a, vec3 b, vec2 s) { Debug::DrawArrow(a, b, vec3(s.x, s.y, s.y)); } | |||
| void Debug::DrawArrow(vec2 a, vec3 b, vec2 s, float az) { Debug::DrawArrow(a, b.xy, vec3(s.x, s.y, s.y), az, b.z); } | |||
| void Debug::DrawArrow(vec2 a, vec2 b, vec2 s, float az, float bz) { Debug::DrawArrow(a, b, vec3(s.x, s.y, s.y), az, bz); } | |||
| @@ -161,7 +211,7 @@ void Debug::DrawArrow(vec2 a, vec2 b, vec3 s, vec4 color, float az, float bz) | |||
| Debug::DrawLine(b - (z + y).xy, b - (z - y).xy, color, bz - (z + y).z, bz - (z - y).z); | |||
| } | |||
| //-- BOX: 3D -2D - 3D_to_2D | |||
| //-- BOX: 3D -2D - 3D_to_2D --------------------------------------------------- | |||
| void Debug::DrawBox(box3 a) { Debug::DrawBox(a.A, a.B, g_scene->GetLineColor()); } | |||
| void Debug::DrawBox(box2 a) { Debug::DrawBox(a.A, a.B, g_scene->GetLineColor()); } | |||
| void Debug::DrawBox(box3 a, vec4 color) { Debug::DrawBox(a.A, a.B, color); } | |||
| @@ -219,7 +269,7 @@ void Debug::DrawBox(vec2 a, float s, mat2 transform, vec4 color) | |||
| Debug::DrawBox(a - b, a + b, transform, color); | |||
| } | |||
| //-- CIRCLE | |||
| //-- CIRCLE ------------------------------------------------------------------- | |||
| void Debug::DrawCircle(vec2 a, float s) { Debug::DrawCircle(a, s * vec2(1.f, g_renderer->GetXYRatio()), g_scene->GetLineColor()); } | |||
| void Debug::DrawCircle(vec3 a, vec3 n) { Debug::DrawCircle(a, n, g_scene->GetLineColor()); } | |||
| void Debug::DrawCircle(vec2 a, vec2 s) { Debug::DrawCircle(a, s * vec2(1.f, g_renderer->GetXYRatio()), g_scene->GetLineColor()); } | |||
| @@ -274,7 +324,7 @@ void Debug::DrawCircle(vec2 a, vec2 x, vec2 y, vec4 color) | |||
| } | |||
| } | |||
| //-- SPHERE | |||
| //-- SPHERE ------------------------------------------------------------------- | |||
| void Debug::DrawSphere(vec3 a, float s) { Debug::DrawSphere(a, s, g_scene->GetLineColor()); } | |||
| void Debug::DrawSphere(vec3 a, float s, vec4 color) { Debug::DrawSphere(a, vec3::axis_x * s, vec3::axis_y * s, vec3::axis_z * s, color); } | |||
| void Debug::DrawSphere(vec3 a, vec3 x, vec3 y, vec3 z) { Debug::DrawSphere(a, x, y, z, g_scene->GetLineColor()); } | |||
| @@ -291,7 +341,7 @@ void Debug::DrawSphere(vec3 a, vec3 x, vec3 y, vec3 z, vec4 color) | |||
| Debug::DrawCircle(a, y, (z - x) * .707f, color); | |||
| } | |||
| //-- CAPSULE | |||
| //-- CAPSULE ------------------------------------------------------------------ | |||
| void Debug::DrawCapsule(vec3 a, float s, vec3 h) { Debug::DrawCapsule(a, s, h, g_scene->GetLineColor()); } | |||
| void Debug::DrawCapsule(vec3 a, vec3 x, vec3 y, vec3 z, vec3 h) { Debug::DrawCapsule(a, x, y, z, h, g_scene->GetLineColor()); } | |||
| void Debug::DrawCapsule(vec3 a, float s, vec3 h, vec4 color) | |||
| @@ -327,7 +377,7 @@ void Debug::DrawCapsule(vec3 a, vec3 x, vec3 y, vec3 z, vec3 h, vec4 color) | |||
| } | |||
| } | |||
| //-- VIEW PROJ | |||
| //-- VIEW PROJ ---------------------------------------------------------------- | |||
| void Debug::DrawViewProj(mat4 view, mat4 proj) { Debug::DrawViewProj(view, proj, g_scene->GetLineColor()); } | |||
| void Debug::DrawViewProj(mat4 view_proj) { Debug::DrawViewProj(view_proj, g_scene->GetLineColor()); } | |||
| void Debug::DrawViewProj(mat4 view, mat4 proj, vec4 color) | |||
| @@ -103,6 +103,8 @@ void EasyMesh::MeshConvert() | |||
| m_submeshes.Push(new SubMesh(shader, vdecl)); | |||
| m_submeshes.Last()->SetIndexBuffer(ibo); | |||
| m_submeshes.Last()->SetVertexBuffer(0, vbo); | |||
| m_state = MeshRender::CanRender; | |||
| } | |||
| //----------------------------------------------------------------------------- | |||
| @@ -33,12 +33,6 @@ LOL_SAFE_ENUM(CSGUsage, | |||
| Xor | |||
| ); | |||
| LOL_SAFE_ENUM(Axis, | |||
| X, | |||
| Y, | |||
| Z | |||
| ); | |||
| LOL_SAFE_ENUM(MeshTransform, | |||
| Taper, | |||
| Twist, | |||
| @@ -207,11 +207,12 @@ bool GdiPlusImageCodec::Save(Image *image, char const *path) | |||
| } | |||
| u8vec4 *psrc = image->Lock<PixelFormat::RGBA_8>(); | |||
| u8vec4 *psrc0 = psrc; | |||
| u8vec4 *pdst = static_cast<u8vec4 *>(bdata.Scan0); | |||
| for (int y = 0; y < size.y; y++) | |||
| for (int x = 0; x < size.x; x++) | |||
| *pdst++ = (*psrc++).bgra; | |||
| image->Unlock(pdst); | |||
| image->Unlock(psrc0); | |||
| b->UnlockBits(&bdata); | |||
| if (b->Save(wpath, &clsid, nullptr) != Gdiplus::Ok) | |||
| @@ -16,14 +16,17 @@ namespace lol | |||
| /* | |||
| * Hardcoded constants for colours | |||
| */ | |||
| vec4 const Color::black = vec4(0, 0, 0, 1); | |||
| vec4 const Color::red = vec4(1, 0, 0, 1); | |||
| vec4 const Color::green = vec4(0, 1, 0, 1); | |||
| vec4 const Color::yellow = vec4(1, 1, 0, 1); | |||
| vec4 const Color::blue = vec4(0, 0, 1, 1); | |||
| vec4 const Color::magenta = vec4(1, 0, 1, 1); | |||
| vec4 const Color::cyan = vec4(0, 1, 1, 1); | |||
| vec4 const Color::white = vec4(1, 1, 1, 1); | |||
| vec4 const Color::black = vec4(0, 0, 0, 1); | |||
| vec4 const Color::red = vec4(1, 0, 0, 1); | |||
| vec4 const Color::green = vec4(0, 1, 0, 1); | |||
| vec4 const Color::yellow = vec4(1, 1, 0, 1); | |||
| vec4 const Color::blue = vec4(0, 0, 1, 1); | |||
| vec4 const Color::magenta = vec4(1, 0, 1, 1); | |||
| vec4 const Color::cyan = vec4(0, 1, 1, 1); | |||
| vec4 const Color::white = vec4(1, 1, 1, 1); | |||
| vec4 const Color::gray_dark = vec4(.25f, .25f, .25f, 1); | |||
| vec4 const Color::gray = vec4(.5f, .5f, .5f, 1); | |||
| vec4 const Color::gray_light= vec4(.75f, .75f, .75f, 1); | |||
| /* | |||
| * Conversion from colours to hexadecimal | |||
| @@ -114,7 +114,11 @@ public: | |||
| protected: | |||
| void Update() { m_previous = m_current; m_current = IsBound() ? RetrieveCurrentValue() : 0.0f; } | |||
| void Update() | |||
| { | |||
| m_previous = m_current; | |||
| m_current = IsBound() ? RetrieveCurrentValue() : 0.0f; | |||
| } | |||
| float RetrieveCurrentValue(); | |||
| /** m1 is the InputDevice, m2 is the axis index on the InputDevice, m3 and m4 are an optional key indices to bind one or two keys over the axis */ | |||
| @@ -16,6 +16,18 @@ | |||
| namespace lol | |||
| { | |||
| template<typename T, typename ARRAY> | |||
| void array_base<T, ARRAY>::Shuffle() | |||
| { | |||
| auto n = Count(); | |||
| auto ni = n; | |||
| while (n > 0) | |||
| { | |||
| ni = lol::rand(n--) | 0; | |||
| Swap(ni, n); | |||
| } | |||
| } | |||
| template<typename T, typename ARRAY> | |||
| void array_base<T, ARRAY>::Sort(int sort) | |||
| { | |||
| @@ -368,6 +368,7 @@ public: | |||
| m_reserved = toreserve; | |||
| } | |||
| void Shuffle(); | |||
| void Sort(int sort); | |||
| void SortQuickSwap(ptrdiff_t start, ptrdiff_t stop); | |||
| @@ -51,6 +51,11 @@ void DrawLine(vec2 a, vec2 b, float az=-1.f, float bz=-1.f); | |||
| void DrawLine(vec3 a, vec3 b, vec4 color); | |||
| void DrawLine(vec2 a, vec3 b, vec4 color, float az=-1.f); | |||
| void DrawLine(vec2 a, vec2 b, vec4 color, float az=-1.f, float bz=-1.f); | |||
| //-- GIZMO | |||
| void DrawGizmo(vec3 pos, vec3 x, vec3 y, vec3 z, float size); | |||
| void DrawGizmo(vec2 pos, vec3 x, vec3 y, vec3 z, float size, float posz = -1.f); | |||
| //-- GRID | |||
| void DrawGrid(vec3 pos, vec3 x, vec3 y, vec3 z, float size, bool draw_3d=false); | |||
| //-- ARROW | |||
| void DrawArrow(vec3 a, vec3 b, vec2 s); | |||
| void DrawArrow(vec2 a, vec3 b, vec2 s, float az=-1.f); | |||
| @@ -327,7 +327,7 @@ public: | |||
| /* | |||
| * Some predefined colours | |||
| */ | |||
| static const vec4 black, red, green, yellow, blue, magenta, cyan, white; | |||
| static const vec4 black, red, green, yellow, blue, magenta, cyan, white, gray_dark, gray, gray_light; | |||
| }; | |||
| } /* namespace lol */ | |||
| @@ -26,6 +26,18 @@ | |||
| namespace lol | |||
| { | |||
| struct AxisBase | |||
| { | |||
| enum Type | |||
| { | |||
| X = 0, Y, Z, MAX, XY = 2, XYZ = 3, | |||
| }; | |||
| protected: | |||
| static inline char const *GetDescription() { return "X,Y,Z,MAX,XY,XYZ"; } | |||
| static inline char const **GetCustomString() { return nullptr; } | |||
| }; | |||
| typedef SafeEnum<AxisBase> Axis; | |||
| #define LOL_BOX_TYPEDEFS(tname, suffix) \ | |||
| template <typename T> struct tname; \ | |||
| typedef tname<float> suffix; \ | |||
| @@ -339,8 +339,9 @@ void TickerData::GameThreadTick() | |||
| } | |||
| /* Tick objects for the game loop */ | |||
| for (int g = Entity::GAMEGROUP_BEGIN; g < Entity::GAMEGROUP_END; ++g) | |||
| for (int i = 0; i < data->m_list[g].Count(); ++i) | |||
| for (int g = Entity::GAMEGROUP_BEGIN; g < Entity::GAMEGROUP_END && !data->quit /* Stop as soon as required */; ++g) | |||
| { | |||
| for (int i = 0; i < data->m_list[g].Count() && !data->quit /* Stop as soon as required */; ++i) | |||
| { | |||
| Entity *e = data->m_list[g][i]; | |||
| @@ -361,6 +362,7 @@ void TickerData::GameThreadTick() | |||
| #endif | |||
| } | |||
| } | |||
| } | |||
| Profiler::Stop(Profiler::STAT_TICK_GAME); | |||
| } | |||
| @@ -370,7 +372,7 @@ void TickerData::DrawThreadTick() | |||
| Profiler::Start(Profiler::STAT_TICK_DRAW); | |||
| /* Tick objects for the draw loop */ | |||
| for (int g = Entity::DRAWGROUP_BEGIN; g < Entity::DRAWGROUP_END; ++g) | |||
| for (int g = Entity::DRAWGROUP_BEGIN; g < Entity::DRAWGROUP_END && !data->quit /* Stop as soon as required */; ++g) | |||
| { | |||
| switch (g) | |||
| { | |||
| @@ -382,7 +384,8 @@ void TickerData::DrawThreadTick() | |||
| break; | |||
| } | |||
| for (int i = 0; i < data->m_list[g].Count(); ++i) | |||
| //Stop as soon as required | |||
| for (int i = 0; i < data->m_list[g].Count() && !data->quit /* Stop as soon as required */; ++i) | |||
| { | |||
| Entity *e = data->m_list[g][i]; | |||
| @@ -21,10 +21,6 @@ namespace lol | |||
| WorldEntity::WorldEntity() | |||
| { | |||
| m_position = vec3::zero; | |||
| m_rotation = quat(1); | |||
| m_velocity = vec3::zero; | |||
| m_rotation_velocity = vec3::zero; | |||
| m_bbox[0] = m_bbox[1] = vec3::zero; | |||
| } | |||
| @@ -28,10 +28,10 @@ public: | |||
| virtual char const *GetName(); | |||
| public: | |||
| vec3 m_position; | |||
| vec3 m_velocity; | |||
| quat m_rotation; | |||
| vec3 m_rotation_velocity; | |||
| vec3 m_position = vec3::zero; | |||
| vec3 m_velocity = vec3::zero; | |||
| quat m_rotation = quat(1); | |||
| vec3 m_rotation_velocity = vec3::zero; | |||
| vec3 m_bbox[2]; | |||
| protected: | |||