Camera & vector.cpp : Fixed shifted_perspective crash with almost zero FOV.undefined
@@ -12,6 +12,7 @@ liblolcore_a_SOURCES = \ | |||
tileset.cpp tileset.h forge.cpp forge.h video.cpp video.h \ | |||
world.cpp world.h sample.cpp sample.h sampler.cpp sampler.h \ | |||
profiler.cpp profiler.h text.cpp text.h emitter.cpp emitter.h numeric.h utils.h \ | |||
messageservice.cpp messageservice.h \ | |||
worldentity.cpp worldentity.h gradient.cpp gradient.h gradient.lolfx \ | |||
platform.cpp platform.h sprite.cpp sprite.h camera.cpp camera.h \ | |||
light.cpp light.h \ | |||
@@ -107,7 +107,7 @@ void Camera::SetProjection(float fov, float near, float far, float screen_size, | |||
m_screen_size = screen_size; | |||
m_screen_ratio = screen_ratio; | |||
mat4 screen_scale = mat4::scale(vec3(m_screen_scale.xy, 1.f)); | |||
if (m_fov > .0f) | |||
if (m_fov > .001f) | |||
{ | |||
if (m_is_shifted) | |||
SetProjection(screen_scale * mat4::shifted_perspective(m_fov, screen_size, screen_ratio, m_near, m_far)); | |||
@@ -126,6 +126,7 @@ static inline int isnan(float f) | |||
#include "audio.h" | |||
#include "scene.h" | |||
#include "profiler.h" | |||
#include "messageservice.h" | |||
// Input | |||
#include "input/input.h" | |||
@@ -155,6 +155,7 @@ | |||
<ClCompile Include="math\trig.cpp" /> | |||
<ClCompile Include="math\vector.cpp" /> | |||
<ClCompile Include="mesh\mesh.cpp" /> | |||
<ClCompile Include="messageservice.cpp" /> | |||
<ClCompile Include="platform.cpp" /> | |||
<ClCompile Include="platform\d3d9\d3d9input.cpp" /> | |||
<ClCompile Include="platform\ps3\ps3app.cpp" /> | |||
@@ -253,6 +254,7 @@ | |||
<ClInclude Include="lol\unit.h" /> | |||
<ClInclude Include="mesh\mesh.h" /> | |||
<ClInclude Include="map.h" /> | |||
<ClInclude Include="messageservice.h" /> | |||
<ClInclude Include="numeric.h" /> | |||
<ClInclude Include="platform.h" /> | |||
<ClInclude Include="platform\d3d9\d3d9input.h" /> | |||
@@ -298,6 +300,7 @@ | |||
<None Include="easymesh\easymesh-scanner.l" /> | |||
<None Include="gpu\lolfx-parser.y" /> | |||
<None Include="gpu\lolfx-scanner.l" /> | |||
<None Include="Makefile.am" /> | |||
</ItemGroup> | |||
<ItemGroup> | |||
<ProjectReference Include="bullet\lolbullet.vcxproj"> | |||
@@ -309,6 +309,9 @@ | |||
<ClCompile Include="input\controller.cpp"> | |||
<Filter>input</Filter> | |||
</ClCompile> | |||
<ClCompile Include="MessageService.cpp"> | |||
<Filter>...</Filter> | |||
</ClCompile> | |||
</ItemGroup> | |||
<ItemGroup> | |||
<ClInclude Include="debug\fps.h"> | |||
@@ -611,6 +614,9 @@ | |||
<ClInclude Include="utils.h"> | |||
<Filter>...</Filter> | |||
</ClInclude> | |||
<ClInclude Include="messageservice.h"> | |||
<Filter>...</Filter> | |||
</ClInclude> | |||
</ItemGroup> | |||
<ItemGroup> | |||
<LolFxCompile Include="gpu\emptymaterial.lolfx"> | |||
@@ -663,5 +669,6 @@ | |||
<None Include="gpu\lolfx-parser.y"> | |||
<Filter>gpu</Filter> | |||
</None> | |||
<None Include="Makefile.am" /> | |||
</ItemGroup> | |||
</Project> |
@@ -785,7 +785,9 @@ template<> mat4 mat4::shifted_perspective(float fov_y, float screen_size, | |||
float screen_ratio_yx, float near, float far) | |||
{ | |||
float new_fov_y = fov_y * (F_PI / 180.0f); | |||
float dist_scr = (screen_size * screen_ratio_yx * .5f) / tanf(new_fov_y * .5f); | |||
float tan_y = tanf(new_fov_y * .5f); | |||
ASSERT(tan_y > 0.000001f); | |||
float dist_scr = (screen_size * screen_ratio_yx * .5f) / tan_y; | |||
return mat4::perspective(fov_y, screen_size, screen_size * screen_ratio_yx, | |||
max(.001f, dist_scr + near), | |||
@@ -0,0 +1,143 @@ | |||
// | |||
// Lol Engine | |||
// | |||
// Copyright: (c) 2013 Benjamin "Touky" Huet <huet.benjamin@gmail.com> | |||
// 2013 Sam Hocevar <sam@hocevar.net> | |||
// This program is free software; you can redistribute it and/or | |||
// modify it under the terms of the Do What The Fuck You Want To | |||
// Public License, Version 2, as published by Sam Hocevar. See | |||
// http://www.wtfpl.net/ for more details. | |||
// | |||
#if defined HAVE_CONFIG_H | |||
# include "config.h" | |||
#endif | |||
#include <cstring> | |||
#include <cstdlib> | |||
#include <time.h> | |||
#include "core.h" | |||
namespace lol | |||
{ | |||
/* | |||
* The global g_renderer object, initialised by Video::Init | |||
*/ | |||
MessageService *g_messageservice = nullptr; | |||
//----------------------------------------------------------------------------- | |||
// Ctor/Dtor | |||
//---- | |||
MessageService::MessageService() | |||
{ | |||
} | |||
MessageService::~MessageService() | |||
{ | |||
m_bucket.Empty(); | |||
} | |||
//Setup/Destroy | |||
void MessageService::Setup(int bucket_size) | |||
{ | |||
g_messageservice = new MessageService(); | |||
g_messageservice->m_bucket.Resize(bucket_size); | |||
} | |||
void MessageService::Destroy() | |||
{ | |||
delete g_messageservice; | |||
g_messageservice = nullptr; | |||
} | |||
//----------------------------------------------------------------------------- | |||
bool MessageService::Send(int id, const String& message) | |||
{ | |||
if (g_messageservice) | |||
{ | |||
ASSERT(0 <= id && id < g_messageservice->m_bucket.Count()); | |||
return g_messageservice->Send(id, message.C()); | |||
} | |||
return false; | |||
} | |||
bool MessageService::Send(int id, const char* message) | |||
{ | |||
if (g_messageservice) | |||
{ | |||
ASSERT(0 <= id && id < g_messageservice->m_bucket.Count()); | |||
MessageService& g = *g_messageservice; | |||
Array<MessageList>& bucket = g.m_bucket[id]; | |||
bucket << MessageList(time(nullptr), String(message)); | |||
return true; | |||
} | |||
return false; | |||
} | |||
//---- | |||
bool MessageService::FetchFirst(int id, String& message) | |||
{ | |||
if (g_messageservice) | |||
{ | |||
ASSERT(0 <= id && id < g_messageservice->m_bucket.Count()); | |||
time_t timestamp; | |||
return g_messageservice->FetchFirst(id, message, timestamp); | |||
} | |||
return false; | |||
} | |||
bool MessageService::FetchFirst(int id, String& message, time_t& timestamp) | |||
{ | |||
if (g_messageservice) | |||
{ | |||
ASSERT(0 <= id && id < g_messageservice->m_bucket.Count()); | |||
MessageService& g = *g_messageservice; | |||
Array<MessageList>& bucket = g.m_bucket[id]; | |||
if (bucket.Count()) | |||
{ | |||
message = bucket[0].m_message; | |||
timestamp = bucket[0].m_timestamp; | |||
bucket.Remove(0); | |||
return true; | |||
} | |||
} | |||
return false; | |||
} | |||
//---- | |||
bool MessageService::FetchAll(int id, String& message) | |||
{ | |||
if (g_messageservice) | |||
{ | |||
ASSERT(0 <= id && id < g_messageservice->m_bucket.Count()); | |||
time_t timestamp; | |||
return g_messageservice->FetchAll(id, message, timestamp); | |||
} | |||
return false; | |||
} | |||
bool MessageService::FetchAll(int id, String& message, time_t& first_timestamp) | |||
{ | |||
if (g_messageservice) | |||
{ | |||
ASSERT(0 <= id && id < g_messageservice->m_bucket.Count()); | |||
MessageService& g = *g_messageservice; | |||
Array<MessageList>& bucket = g.m_bucket[id]; | |||
message = String(""); | |||
if (bucket.Count()) | |||
{ | |||
first_timestamp = bucket[0].m_timestamp; | |||
for (int i = 0; i < bucket.Count(); ++i) | |||
message += bucket[i].m_message; | |||
bucket.Empty(); | |||
return true; | |||
} | |||
} | |||
return false; | |||
} | |||
} /* namespace lol */ |
@@ -0,0 +1,67 @@ | |||
// | |||
// Lol Engine | |||
// | |||
// Copyright: (c) 2013 Benjamin "Touky" Huet <huet.benjamin@gmail.com> | |||
// (c) 2013 Sam Hocevar <sam@hocevar.net> | |||
// This program is free software; you can redistribute it and/or | |||
// modify it under the terms of the Do What The Fuck You Want To | |||
// Public License, Version 2, as published by Sam Hocevar. See | |||
// http://www.wtfpl.net/ for more details. | |||
// | |||
// | |||
// The Message Service class | |||
// ---------------- | |||
// | |||
#if !defined __MESSAGESERVICE_H__ | |||
#define __MESSAGESERVICE_H__ | |||
namespace lol | |||
{ | |||
struct MessageList | |||
{ | |||
MessageList(time_t timestamp, String& message) | |||
{ | |||
m_timestamp = timestamp; | |||
m_message = message; | |||
} | |||
time_t m_timestamp; | |||
String m_message; | |||
}; | |||
/* | |||
A template class perhaps ? | |||
*/ | |||
class MessageService | |||
{ | |||
public: | |||
//CTor/DTor | |||
MessageService(); | |||
~MessageService(); | |||
static char const *GetName() { return "<messageservice>"; } | |||
//Setup/Destroy | |||
static void Setup(int bucket_size); | |||
static void Destroy(); | |||
//Common interactions | |||
static bool Send(int id, const String& message); | |||
static bool Send(int id, const char* message); | |||
static bool FetchFirst(int id, String& message); | |||
static bool FetchFirst(int id, String& message, time_t ×tamp); | |||
static bool FetchAll(int id, String& message); | |||
static bool FetchAll(int id, String& message, time_t &first_timestamp); | |||
private: | |||
Array<Array<MessageList> > m_bucket; | |||
}; | |||
extern MessageService *g_messageservice; | |||
} /* namespace lol */ | |||
#endif /* __MESSAGESERVICE_H__ */ |