diff --git a/test/meshviewer.cpp b/test/meshviewer.cpp index 346877e9..602a0314 100644 --- a/test/meshviewer.cpp +++ b/test/meshviewer.cpp @@ -209,7 +209,7 @@ public: m_zoom = 0.f; m_zoom_mesh = 0.f; m_zoom_speed = 0.f; - m_rot = vec2(45.f, -45.f); + m_rot = vec2(/*45.f*/0.f, -45.f); m_rot_mesh = vec2::zero; m_rot_speed = vec2::zero; m_pos = vec2::zero; @@ -501,7 +501,7 @@ public: vec3 light_pos = m_ssetup->m_lights[k]->GetPosition(); mat4 world_cam = m_camera->GetView(); light_pos = (inverse(world_cam) * vec4((world_cam * vec4(light_pos, 1.0f)).xyz * vec3::axis_z, 1.0f)).xyz; - tc.AddTarget(box3(vec3::mone, vec3::one) + light_pos * + tc.AddTarget(box3(vec3::onen, vec3::one) + light_pos * ((m_ssetup->m_lights[k]->GetType() == LightType::Directional)?(-1.f):(1.f))); } @@ -543,19 +543,22 @@ public: } float screen_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))); - float z_dist = length(m_camera->m_position) + max(local_min_max[0].z, local_min_max[1].z); + float z_dist = m_camera->m_target_distance /*length(m_camera->m_position)*/ + max(local_min_max[0].z, local_min_max[1].z); vec2 screen_offset = vec2(0.f, -(screen_min_max[1].y + screen_min_max[0].y) * .5f); m_screen_offset = damp(m_screen_offset, screen_offset, .9f, seconds); + float forced_zoom = m_zoom_mesh; + if (cam_factor > 0.f) { - vec2 new_screen_scale = m_camera->GetScreenScale(); - float zoom_in = 1.f + lol::max(0.f, m_zoom_mesh); - float zoom_out = 1.f + lol::max(0.f, -m_zoom_mesh); - m_camera->SetScreenScale(max(vec2(0.001f), ((new_screen_scale * zoom_in) / (screen_ratio * zoom_out * SCREEN_LIMIT)))); + vec2 old_sscale = m_camera->GetScreenScale(); + float old_ssize = m_camera->GetScreenSize(); + float zoom_in = 1.f + lol::max(0.f, forced_zoom); + float zoom_out = 1.f + lol::max(0.f, -forced_zoom); + m_camera->SetScreenScale(max(vec2(0.001f), ((old_sscale * zoom_in) / (screen_ratio * zoom_out * SCREEN_LIMIT)))); m_camera->SetFov(m_fov_mesh); - m_camera->SetScreenInfos(damp(m_camera->GetScreenSize(), max(1.f, screen_ratio * zoom_out), 1.2f, seconds)); + m_camera->SetScreenInfos(damp(old_ssize, max(1.f, screen_ratio * zoom_out), 1.2f, seconds)); vec3 posz = ((mat4::rotate(m_rot_mesh.y, vec3::axis_y) * mat4::rotate(-m_rot_mesh.x, vec3::axis_x) * vec4::axis_z)).xyz; vec3 newpos = posz * damp(length(m_camera->m_position), z_dist * 1.2f, .1f, seconds); @@ -776,6 +779,67 @@ public: m_build_time -= seconds; } +#define NORMAL_USAGE 1 +#if 0 + PrimitiveFace NewFace; + NewFace.SetNormal(vec3::axis_z); + NewFace.SetCenter(vec3::zero); + int imax = 4, jmax = 4; + int sz = 2; + for (int i = 0; i < imax; ++i) + { + for (int j = 0; j < jmax; ++j) + { + NewFace.AddPolygon(vec3(ivec3(i, j, 0) * sz), + vec3(ivec3(i, j, 0) * sz + ivec3(sz, 0, 0)), + vec3(ivec3(i, j, 0) * sz + ivec3(sz, sz, 0))); + NewFace.AddPolygon(vec3(ivec3(i, j, 0) * sz), + vec3(ivec3(i, j, 0) * sz + ivec3(sz, sz, 0)), + vec3(ivec3(i, j, 0) * sz + ivec3( 0, sz, 0))); + } + } + for (int i = 0; i < NewFace.m_edges.Count(); ++i) + { + Debug::DrawLine(NewFace.EV0(i) + vec3(.0f, .0f, 2.f), NewFace.EV1(i) + vec3(.0f, .0f, 2.f), + NewFace.m_edges[i].m3 ? vec4(.0f, .7f, .0f, 1.f) : vec4(.7f, .0f, .0f, 1.f)); + Debug::DrawBox(NewFace.EV0(i) + vec3(.0f, .0f, 2.f) + vec3(-.1f), + NewFace.EV0(i) + vec3(.0f, .0f, 2.f) + vec3(+.1f), + NewFace.m_edges[i].m3 ? vec4(.0f, .7f, .0f, 1.f) : vec4(.7f, .0f, .0f, 1.f)); + } + NewFace.CleanEdges(); + for (int i = 0; i < NewFace.m_edges.Count(); ++i) + { + Debug::DrawLine(NewFace.EV0(i), NewFace.EV1(i), vec4(vec3::zero, 1.f)); + Debug::DrawBox(NewFace.EV0(i) + vec3(-.1f), + NewFace.EV0(i) + vec3(+.1f), + vec4(vec3::zero, 1.f)); + } + //Try with mesh + PrimitiveMesh NewMesh; + for (int i = m_meshes.Count() - 1; 0 <= i && i < m_meshes.Count(); i++) + { + for (int j = 0; j < m_meshes[i].m1->m_indices.Count(); j += 3) + { + VertexData v[3] = { m_meshes[i].m1->m_vert[m_meshes[i].m1->m_indices[j ]], + m_meshes[i].m1->m_vert[m_meshes[i].m1->m_indices[j+1]], + m_meshes[i].m1->m_vert[m_meshes[i].m1->m_indices[j+2]] }; + NewMesh.AddPolygon(v[0].m_coord, v[1].m_coord, v[2].m_coord, v[0].m_normal); + } + NewMesh.CleanFaces(); + break; + } + for (int j = 0; j < NewMesh.m_faces.Count(); ++j) + { + for (int i = 0; i < NewMesh.m_faces[j].m_edges.Count(); ++i) + { + vec3 v0 = NewMesh.m_faces[j].EV0(i) + NewMesh.m_faces[j].GetNormal() * .4f; + vec3 v1 = NewMesh.m_faces[j].EV1(i) + NewMesh.m_faces[j].GetNormal() * .4f; + Debug::DrawLine(v0, v1, vec4(vec3::zero, 1.f)); + Debug::DrawBox(v0 + vec3(-.1f), v0 + vec3(+.1f), vec4(vec3::zero, 1.f)); + } + } + +#elif NORMAL_USAGE vec3 x = vec3(1.f,0.f,0.f); vec3 y = vec3(0.f,1.f,0.f); mat4 save_proj = m_camera->GetProjection(); @@ -855,6 +919,7 @@ public: } m_camera->SetProjection(save_proj); } +#endif //NORMAL_USAGE #if 0 //Debug normal draw for (int i = m_meshes.Count() - 1; 0 <= i && i < m_meshes.Count(); i++)