Browse Source

MeshViewer : Fov compensation now works correctly (all is bound on Page{Up|Down}) First commit in a while.

legacy
Benjamin ‘Touky’ Huet touky 11 years ago
parent
commit
665bd7d6e7
3 changed files with 95 additions and 31 deletions
  1. +22
    -1
      build/vs2010/Lol.sln
  2. +19
    -3
      test/data/mesh-buffer.txt
  3. +54
    -27
      test/meshviewer.cpp

+ 22
- 1
build/vs2010/Lol.sln View File

@@ -106,7 +106,7 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "neercs", "..\..\tools\neerc
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Touky", "Touky", "{9EA99B18-D352-47F6-BC04-A0B49CAA2772}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Touky_Demo", "..\..\people\touky\private\touky_demo\touky_demo.vcxproj", "{EE203B88-44CF-4859-9D42-7A5F43FECB52}"
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "touky_demo", "..\..\people\touky\private\touky_demo\touky_demo.vcxproj", "{EE203B88-44CF-4859-9D42-7A5F43FECB52}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "btphystest", "..\..\test\btphystest.vcxproj", "{EE203B88-44CF-4859-9D42-7A1F43FECB52}"
EndProject
@@ -146,6 +146,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "12_Voronoi", "..\..\tutoria
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "the_unfortunate_voronoid", "..\..\people\touky\private\the_unfortunate_voronoid\the_unfortunate_voronoid.vcxproj", "{6BF81B39-EDC2-4127-9982-C2D8ABEA95AF}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "labyrinth", "..\..\people\touky\private\labyrinth\labyrinth.vcxproj", "{EE203B88-44CF-4859-9D42-7A5F45FEDB52}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -805,6 +807,24 @@ Global
{6BF81B39-EDC2-4127-9982-C2D8ABEA95AF}.Release|x64.ActiveCfg = Release|x64
{6BF81B39-EDC2-4127-9982-C2D8ABEA95AF}.Release|x64.Build.0 = Release|x64
{6BF81B39-EDC2-4127-9982-C2D8ABEA95AF}.Release|Xbox 360.ActiveCfg = Release|x64
{EE203B88-44CF-4859-9D42-7A5F45FEDB52}.Debug|Any CPU.ActiveCfg = Debug|x64
{EE203B88-44CF-4859-9D42-7A5F45FEDB52}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
{EE203B88-44CF-4859-9D42-7A5F45FEDB52}.Debug|Mixed Platforms.Build.0 = Debug|Win32
{EE203B88-44CF-4859-9D42-7A5F45FEDB52}.Debug|PS3.ActiveCfg = Debug|x64
{EE203B88-44CF-4859-9D42-7A5F45FEDB52}.Debug|Win32.ActiveCfg = Debug|Win32
{EE203B88-44CF-4859-9D42-7A5F45FEDB52}.Debug|Win32.Build.0 = Debug|Win32
{EE203B88-44CF-4859-9D42-7A5F45FEDB52}.Debug|x64.ActiveCfg = Debug|x64
{EE203B88-44CF-4859-9D42-7A5F45FEDB52}.Debug|x64.Build.0 = Debug|x64
{EE203B88-44CF-4859-9D42-7A5F45FEDB52}.Debug|Xbox 360.ActiveCfg = Debug|x64
{EE203B88-44CF-4859-9D42-7A5F45FEDB52}.Release|Any CPU.ActiveCfg = Release|x64
{EE203B88-44CF-4859-9D42-7A5F45FEDB52}.Release|Mixed Platforms.ActiveCfg = Release|Win32
{EE203B88-44CF-4859-9D42-7A5F45FEDB52}.Release|Mixed Platforms.Build.0 = Release|Win32
{EE203B88-44CF-4859-9D42-7A5F45FEDB52}.Release|PS3.ActiveCfg = Release|x64
{EE203B88-44CF-4859-9D42-7A5F45FEDB52}.Release|Win32.ActiveCfg = Release|Win32
{EE203B88-44CF-4859-9D42-7A5F45FEDB52}.Release|Win32.Build.0 = Release|Win32
{EE203B88-44CF-4859-9D42-7A5F45FEDB52}.Release|x64.ActiveCfg = Release|x64
{EE203B88-44CF-4859-9D42-7A5F45FEDB52}.Release|x64.Build.0 = Release|x64
{EE203B88-44CF-4859-9D42-7A5F45FEDB52}.Release|Xbox 360.ActiveCfg = Release|x64
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -845,6 +865,7 @@ Global
{EE203B88-44CF-4859-9D42-7A5F43FECB52} = {9EA99B18-D352-47F6-BC04-A0B49CAA2772}
{25493FC8-75AC-4703-AD58-AB0C4A0FB79C} = {9EA99B18-D352-47F6-BC04-A0B49CAA2772}
{6BF81B39-EDC2-4127-9982-C2D8ABEA95AF} = {9EA99B18-D352-47F6-BC04-A0B49CAA2772}
{EE203B88-44CF-4859-9D42-7A5F45FEDB52} = {9EA99B18-D352-47F6-BC04-A0B49CAA2772}
{A69411B3-6DE8-404E-8E70-0D3375A7492A} = {0A1651FC-322B-4B04-82CB-28E9046D9383}
{5A77DCDD-2CBA-43E9-8B45-00C281443F77} = {0A1651FC-322B-4B04-82CB-28E9046D9383}
{C2E01551-B636-4324-8461-71811DF6FBB5} = {E27FDF36-50C4-4ED2-8CF5-A20FED016910}


+ 19
- 3
test/data/mesh-buffer.txt View File

@@ -1,7 +1,22 @@
[sc#f8f afcb 10 10 10 .25 tx 0]
//sc#fff
//[afcb 1 1 1 -.1 tx 1]
//[afcb 1 1 1 -.1 tx 0]
//[afcb 1 1 1 -.1 tx -1]
//[[afcb 1 1 1 -.1 tx 1]
//[afcb 1 1 1 -.1 tx 0]
//[afcb 1 1 1 -.1 tx -1]tz 1]
//[[afcb 1 1 1 -.1 tx 1]
//[afcb 1 1 1 -.1 tx 0]
//[afcb 1 1 1 -.1 tx -1]tz -1]
//[afcb 3 .2 3 -.05 ty -.6]
//[sc#fff scb#fff ato 20 8 12 rx0]
//[sc#fff scb#fff acg 8 2 5 1 6 8 4 2 .1 1]
[sc#fff ab 4 4 4 smth 0 1 1 ]//twy 45 0 bdxy 90 0 splt 5 tz 2
//[sc#fff ab 4 4 4 ]//twy 45 0 bdxy 90 0 splt 5 tz 2
//[sc#88f ab 4 4 4 tx 4 ab 4 4 4 tx -2 tax .4 .4 0]
//[sc#88f ab .25 1 1 tx .25 ab .25 1 1 tx .25 ab .25 1 1 tx .25 ab .25 1 1 tx .125 stx 10 0 0]
// tax -2 0 0 0
@@ -20,7 +35,8 @@
//[sc#ff2 asph 2 10 10 10]
//[sc#400 asph 2 10 10 10 t 2 2 2 csgs]
//[sc#88f afcb 10 10 10 .25 tx 0]
//[sc#fff afcb 10 10 10 .25 t 2 2 2]
[sc#fff afcb 10 10 10 .25 t 2 2 2 csgs]
//[sc#fff afcb 7 7 7 .25]
//[sc#ff2 afcb 7 7 7 .25 t 1 1 1]
//[sc#ff2 afcb 7 7 7 .25 t 1 1 1 csgs]

+ 54
- 27
test/meshviewer.cpp View File

@@ -48,25 +48,20 @@ LOLFX_RESOURCE_DECLARE(shinymvtexture);
#define IPT_MESH_ROT_UP "Mesh_Rot_Up"
#define IPT_MESH_ROT_DOWN "Mesh_Rot_Down"

#define MIN_FOV 1.f

#define WITH_FUR 0
#define WITH_TEXTURE 0

class MeshViewer : public WorldEntity
{
public:
void SetFov(float new_fov=60.0f)
void SetFov(float new_fov=60.0f, vec2 video_size = vec2(Video::GetSize()))
{
//FOV compensation doesn't work
ivec2 video_size = Video::GetSize();
float near = (float)-video_size.x - video_size.y;
float far = (float)video_size.x + video_size.y;
float t1 = tanf(new_fov / 2);
float dist = (float)video_size.x / (2.0f * t1);
//m_fov_compensation = mat4::translate(-0.5f * video_size.x, -0.5f * video_size.y, -dist);
m_fov_compensation = mat4::translate(vec3(.0f));
if (new_fov > 0.1f)
Scene::GetDefault()->GetCamera()->SetProjection(mat4::perspective(new_fov, (float)video_size.x, (float)video_size.y, .1f, 1000.f));
if (new_fov > MIN_FOV)
Scene::GetDefault()->GetCamera()->SetProjection(mat4::perspective(new_fov, video_size.x, video_size.y, .1f, 1000.f));
else
Scene::GetDefault()->GetCamera()->SetProjection(mat4::ortho((float)video_size.x, (float)video_size.y, .1f, 1000.f));
Scene::GetDefault()->GetCamera()->SetProjection(mat4::ortho(video_size.x, video_size.y, .1f, 1000.f));
}

MeshViewer(char const *file_name = "data/mesh-buffer.txt")
@@ -74,10 +69,8 @@ public:
{
//Input setup
Input::LinkActionToKey(IPT_CAM_RESET, Key::Return);
Input::LinkActionToKey(IPT_CAM_FORWARD, Key::PageUp);
Input::LinkActionToKey(IPT_CAM_BACKWARD, Key::PageDown);
Input::LinkActionToKey(IPT_CAM_ZOOM_IN, Key::Home);
Input::LinkActionToKey(IPT_CAM_ZOOM_OUT, Key::End);
Input::LinkActionToKey(IPT_CAM_ZOOM_IN, Key::PageUp);
Input::LinkActionToKey(IPT_CAM_ZOOM_OUT, Key::PageDown);

Input::LinkActionToKey(IPT_MESH_LEFT, Key::Left);
Input::LinkActionToKey(IPT_MESH_RIGHT, Key::Right);
@@ -169,26 +162,42 @@ public:
Ticker::Shutdown();
}

//--
//Update Mesh BBox - Get the Min/Max needed
//--
vec2 screen_min_max[2] = { vec2(FLT_MAX), vec2(-FLT_MAX) };
vec3 min_max[2] = { vec3(FLT_MAX), vec3(-FLT_MAX) };
int mesh_id = m_meshes.Count() - 1;
for (; mesh_id >= 0; mesh_id--)
if (m_meshes[mesh_id].m2)
break;

mat4 world_screen = Scene::GetDefault()->GetCamera()->GetProjection() * Scene::GetDefault()->GetCamera()->GetView();

if (m_meshes.Count() && mesh_id >= 0)
{
for (int i = 0; i < m_meshes[mesh_id].m1.GetVertexCount(); i++)
{
vec3 vpos = m_meshes[mesh_id].m1.GetVertexLocation(i);
mat4 LocalPos = m_mat * mat4::translate(m_meshes[mesh_id].m1.GetVertexLocation(i));
vec3 vpos = LocalPos.v3.xyz;
//vec3 vpos = m_meshes[mesh_id].m1.GetVertexLocation(i);

min_max[0] = min(vpos.xyz, min_max[0]);
min_max[1] = max(vpos.xyz, min_max[1]);

LocalPos = world_screen * LocalPos;
vpos = (LocalPos.v3 / LocalPos.v3.w).xyz;

screen_min_max[0] = min(vpos.xy, screen_min_max[0]);
screen_min_max[1] = max(vpos.xy, screen_min_max[1]);
}
}
else
{
min_max[0] = vec3(.0f);
min_max[1] = vec3(.0f);
min_max[0] = vec3(.0f);
screen_min_max[0] = vec2(.0f);
screen_min_max[1] = vec2(.0f);
}
//[0] : center, [1] : size.
vec3 BBox[2] = { vec3(.0f), vec3(.0f) };
@@ -199,20 +208,35 @@ public:
//--
//Camera movement handling
//--
vec3 cam_move = BBox_mod * seconds *
vec3(.0f, .0f, (float)(Input::GetStatus(IPT_CAM_BACKWARD) - Input::GetStatus(IPT_CAM_FORWARD)));

if (Input::WasReleased(IPT_CAM_RESET))
SetFov();

//Auto Fov
float local_max = max(max(lol::abs(min_max[0].x), lol::abs(min_max[0].y)),
max(lol::abs(min_max[1].x), lol::abs(min_max[1].y)));
float fov_ratio = max(max(lol::abs(screen_min_max[0].x), lol::abs(screen_min_max[0].y)),
max(lol::abs(screen_min_max[1].x), lol::abs(screen_min_max[1].y)));

//Fov modification
float fov_zoom = (float)(Input::GetStatus(IPT_CAM_ZOOM_OUT) - Input::GetStatus(IPT_CAM_ZOOM_IN));
m_fov_zoom_damp = damp(m_fov_zoom_damp, fov_zoom, (fov_zoom == .0f)?(.15f):(0.5f), seconds);
m_fov = max(.0f, m_fov + seconds * 10.0f * m_fov_zoom_damp);
m_fov_damp = damp(m_fov_damp, m_fov, .2f, seconds);
SetFov(m_fov_damp);

if (m_fov_damp < MIN_FOV)
{
vec2 tmp = vec2(Video::GetSize());
SetFov(0, vec2(local_max * 2.2f) * (tmp / vec2(tmp.y)));
}
else
SetFov(m_fov_damp);

//Move modification
vec3 campos = Scene::GetDefault()->GetCamera()->GetPosition();
Scene::GetDefault()->GetCamera()->SetView(campos + cam_move, quat(1.f));
if (m_fov_damp < MIN_FOV)
Scene::GetDefault()->GetCamera()->SetView(vec3(campos.xy, 10.f), quat(1.f));
else if (fov_ratio > .0f)
Scene::GetDefault()->GetCamera()->SetView(vec3(campos.xy, campos.z * fov_ratio * 1.1f), quat(1.f));

//--
//Mesh movement handling
@@ -350,12 +374,14 @@ public:
//Fur support
#if WITH_FUR
m_meshes[i].m1.MeshConvert(Shader::Create(LOLFX_RESOURCE_NAME(shinyfur)));
#else
#elif WITH_TEXTURE
//m_meshes[i].m1.MeshConvert(m_texture_shader);
//m_meshes[i].m1.MeshConvert();
m_meshes[i].m1.MeshConvert(new DefaultShaderData(((1 << VertexUsage::Position) | (1 << VertexUsage::Normal) |
(1 << VertexUsage::Color) | (1 << VertexUsage::TexCoord)),
m_texture_shader, true));
#else
m_meshes[i].m1.MeshConvert();
#endif
m_meshes[i].m2 = true;
}
@@ -377,11 +403,12 @@ public:
new_mesh_offset = new_mesh_offset + vec3(m_meshes[j].m3 * ofs_scale * ofs_scale * m_mesh_offset_damp.x, .0f, .0f);
}
m_meshes[i].m4 = damp(m_meshes[i].m4, new_mesh_offset, .35f, seconds);
Scene::GetDefault()->GetCamera()->SetProjection(mat4::translate(m_meshes[i].m4) *

Scene::GetDefault()->GetCamera()->SetProjection(
mat4::translate(m_meshes[i].m4) *
mat4::translate(vec3(m_mesh_screen_offset_damp, .0f)) *
mat4::scale(vec3(vec2(m_meshes[i].m3), 1.0f)) *
default_proj *
m_fov_compensation);
default_proj);
#if WITH_FUR
for (int j=0; j < 40; j++)
m_meshes[i].m1.Render(m_mat, 0.1 * j);


Loading…
Cancel
Save