Parcourir la source

Added MeshViewer new project, its goal being to have a program capable of previewing a mesh from an outer source (.txt, js, etc ...) in order to speed up mesh creation.

Added RadialJitter("rj") to EasyMesh parser.
legacy
Benjamin ‘Touky’ Huet touky il y a 12 ans
Parent
révision
7a051f9455
9 fichiers modifiés avec 277 ajouts et 5 suppressions
  1. +21
    -0
      build/vs2010/Lol.sln
  2. +7
    -2
      src/camera.cpp
  3. +1
    -0
      src/camera.h
  4. +2
    -1
      src/easymesh/easymesh-parser.y
  5. +2
    -1
      src/easymesh/easymesh-scanner.l
  6. +5
    -0
      src/easymesh/easymesh.h
  7. +6
    -1
      test/Makefile.am
  8. +168
    -0
      test/MeshViewer.cpp
  9. +65
    -0
      test/MeshViewer.vcxproj

+ 21
- 0
build/vs2010/Lol.sln Voir le fichier

@@ -114,6 +114,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Benlitz", "Benlitz", "{B583
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "benlitzTest1", "..\..\people\benlitz\test1\benlitzTest1.vcxproj", "{FAF82AD2-D9F4-4694-9A01-103BC5B771B4}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "MeshViewer", "..\..\test\MeshViewer.vcxproj", "{7CE9FE12-E4AB-4A22-90D4-2C15F0C30D4E}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -617,6 +619,24 @@ Global
{FAF82AD2-D9F4-4694-9A01-103BC5B771B4}.Release|x64.ActiveCfg = Release|x64
{FAF82AD2-D9F4-4694-9A01-103BC5B771B4}.Release|x64.Build.0 = Release|x64
{FAF82AD2-D9F4-4694-9A01-103BC5B771B4}.Release|Xbox 360.ActiveCfg = Release|x64
{7CE9FE12-E4AB-4A22-90D4-2C15F0C30D4E}.Debug|Any CPU.ActiveCfg = Debug|x64
{7CE9FE12-E4AB-4A22-90D4-2C15F0C30D4E}.Debug|Mixed Platforms.ActiveCfg = Debug|x64
{7CE9FE12-E4AB-4A22-90D4-2C15F0C30D4E}.Debug|Mixed Platforms.Build.0 = Debug|x64
{7CE9FE12-E4AB-4A22-90D4-2C15F0C30D4E}.Debug|PS3.ActiveCfg = Debug|x64
{7CE9FE12-E4AB-4A22-90D4-2C15F0C30D4E}.Debug|Win32.ActiveCfg = Debug|Win32
{7CE9FE12-E4AB-4A22-90D4-2C15F0C30D4E}.Debug|Win32.Build.0 = Debug|Win32
{7CE9FE12-E4AB-4A22-90D4-2C15F0C30D4E}.Debug|x64.ActiveCfg = Debug|x64
{7CE9FE12-E4AB-4A22-90D4-2C15F0C30D4E}.Debug|x64.Build.0 = Debug|x64
{7CE9FE12-E4AB-4A22-90D4-2C15F0C30D4E}.Debug|Xbox 360.ActiveCfg = Debug|x64
{7CE9FE12-E4AB-4A22-90D4-2C15F0C30D4E}.Release|Any CPU.ActiveCfg = Release|x64
{7CE9FE12-E4AB-4A22-90D4-2C15F0C30D4E}.Release|Mixed Platforms.ActiveCfg = Release|x64
{7CE9FE12-E4AB-4A22-90D4-2C15F0C30D4E}.Release|Mixed Platforms.Build.0 = Release|x64
{7CE9FE12-E4AB-4A22-90D4-2C15F0C30D4E}.Release|PS3.ActiveCfg = Release|x64
{7CE9FE12-E4AB-4A22-90D4-2C15F0C30D4E}.Release|Win32.ActiveCfg = Release|Win32
{7CE9FE12-E4AB-4A22-90D4-2C15F0C30D4E}.Release|Win32.Build.0 = Release|Win32
{7CE9FE12-E4AB-4A22-90D4-2C15F0C30D4E}.Release|x64.ActiveCfg = Release|x64
{7CE9FE12-E4AB-4A22-90D4-2C15F0C30D4E}.Release|x64.Build.0 = Release|x64
{7CE9FE12-E4AB-4A22-90D4-2C15F0C30D4E}.Release|Xbox 360.ActiveCfg = Release|x64
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -638,6 +658,7 @@ Global
{B1E10086-A1DA-401A-834D-969C9DBB5CC1} = {E0491194-35E3-4513-9D31-608EA3165ECF}
{80F81C11-8DA2-4990-91CB-9807783BA46E} = {E0491194-35E3-4513-9D31-608EA3165ECF}
{EE203B88-44CF-4859-9D42-7A1F43FECB52} = {E0491194-35E3-4513-9D31-608EA3165ECF}
{7CE9FE12-E4AB-4A22-90D4-2C15F0C30D4E} = {E0491194-35E3-4513-9D31-608EA3165ECF}
{B92ABADC-45BE-4CC5-B724-9426053123A1} = {E74CF679-CA2A-47E9-B1F4-3779D6AC6B04}
{7B083DA2-FE08-4F6D-BFDD-195D5C2783EB} = {E74CF679-CA2A-47E9-B1F4-3779D6AC6B04}
{1C5B8702-290C-42DA-AA9E-671348F5B747} = {E74CF679-CA2A-47E9-B1F4-3779D6AC6B04}


+ 7
- 2
src/camera.cpp Voir le fichier

@@ -87,6 +87,12 @@ mat4 const &Camera::GetProjMatrix()
return m_proj_matrix;
}

void Camera::ForceSceneUpdate()
{
Scene::GetDefault()->SetViewMatrix(m_view_matrix);
Scene::GetDefault()->SetProjMatrix(m_proj_matrix);
}

void Camera::TickGame(float seconds)
{
WorldEntity::TickGame(seconds);
@@ -124,8 +130,7 @@ void Camera::TickDraw(float seconds)
{
WorldEntity::TickDraw(seconds);

Scene::GetDefault()->SetViewMatrix(m_view_matrix);
Scene::GetDefault()->SetProjMatrix(m_proj_matrix);
ForceSceneUpdate();
}

} /* namespace lol */


+ 1
- 0
src/camera.h Voir le fichier

@@ -40,6 +40,7 @@ public:

mat4 const &GetViewMatrix();
mat4 const &GetProjMatrix();
void ForceSceneUpdate();

protected:
virtual void TickGame(float seconds);


+ 2
- 1
src/easymesh/easymesh-parser.y Voir le fichier

@@ -47,7 +47,7 @@
%token T_TRANSLATEX T_ROTATEX T_TAPERX T_SCALEX T_MIRRORX
%token T_TRANSLATEY T_ROTATEY T_TAPERY T_SCALEY T_MIRRORY
%token T_TRANSLATEZ T_ROTATEZ T_TAPERZ T_SCALEZ T_MIRRORZ
%token T_TRANSLATE T_SCALE T_TOGGLESCALEWINDING
%token T_TRANSLATE T_SCALE T_TOGGLESCALEWINDING T_RADIALJITTER
%token T_CSGUNION T_CSGSUBSTRACT T_CSGAND T_CSGXOR
%token T_CHAMFER

@@ -135,6 +135,7 @@ transform_command:
| T_MIRRORX { mc.m_mesh.MirrorX(); }
| T_MIRRORY { mc.m_mesh.MirrorY(); }
| T_MIRRORZ { mc.m_mesh.MirrorZ(); }
| T_RADIALJITTER args1 { mc.m_mesh.RadialJitter($2.f0); }
| T_TOGGLESCALEWINDING { mc.m_mesh.ToggleScaleWinding(); }
| T_CSGUNION { mc.m_mesh.CsgUnion(); }
| T_CSGSUBSTRACT { mc.m_mesh.CsgSubstract(); }


+ 2
- 1
src/easymesh/easymesh-scanner.l Voir le fichier

@@ -66,10 +66,11 @@ sx { return token::T_SCALEX; }
sy { return token::T_SCALEY; }
sz { return token::T_SCALEZ; }
s { return token::T_SCALE; }
tsw { return token::T_TOGGLESCALEWINDING; }
tsw { return token::T_TOGGLESCALEWINDING; }
mx { return token::T_MIRRORX; }
my { return token::T_MIRRORY; }
mz { return token::T_MIRRORZ; }
rj { return token::T_RADIALJITTER; }

csgu { return token::T_CSGUNION; }
csgs { return token::T_CSGSUBSTRACT; }


+ 5
- 0
src/easymesh/easymesh.h Voir le fichier

@@ -105,6 +105,11 @@ public:
void AppendCog(int nbsides, float h, float r10, float r20, float r1,
float r2, float r12, float r22, float sidemul, int offset);

//Convenience functions
public:
int GetVertexCount() { return m_vert.Count(); }
vec3 const &GetVertexLocation(int i) { return m_vert[i].m1; }

private:
vec4 m_color, m_color2;
Array<uint16_t> m_indices;


+ 6
- 1
test/Makefile.am Voir le fichier

@@ -10,7 +10,7 @@ bench: benchsuite$(EXEEXT)

EXTRA_DIST = data/gradient.png

noinst_PROGRAMS = benchsuite $(testsuite) btphystest
noinst_PROGRAMS = benchsuite $(testsuite) btphystest MeshViewer

TESTS = $(testsuite)

@@ -49,3 +49,8 @@ btphystest_CPPFLAGS = @LOL_CFLAGS@ -I$(top_srcdir)/src/bullet \
btphystest_LDFLAGS = $(top_builddir)/src/liblol.a @LOL_LIBS@
btphystest_DEPENDENCIES = $(top_builddir)/src/liblol.a

MeshViewer_SOURCES = MeshViewer.cpp
MeshViewer_CPPFLAGS = @LOL_CFLAGS@
MeshViewer_LDFLAGS = $(top_builddir)/src/liblol.a @LOL_LIBS@
MeshViewer_DEPENDENCIES = $(top_builddir)/src/liblol.a


+ 168
- 0
test/MeshViewer.cpp Voir le fichier

@@ -0,0 +1,168 @@
//
// Lol Engine - EasyMesh tutorial
//
// Copyright: (c) 2011-2013 Sam Hocevar <sam@hocevar.net>
// (c) 2012-2013 Benjamin "Touky" Huet <huet.benjamin@gmail.com>
// 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 "core.h"

using namespace std;
using namespace lol;
#define MESH_DIST 5.0f

class MeshViewer : public WorldEntity
{
public:
MeshViewer()
{
int i=10;
while (i--)
{
m_meshes.Push(EasyMesh());
m_meshes.Last().Compile("[sc#0f0 ab 2 2 2 t .8 .8 .8 rx 20 ry 20 [sc#00f ab 2 2 2 tx 0 csgu]]");
}

m_angle = 0;

m_camera = new Camera(vec3(0.f, 600.f, 0.f),
vec3(0.f, 0.f, 0.f),
vec3(0, 1, 0));
m_camera->SetPerspective(60.f, 16, 9, .1f, 1000.f);
m_camera->SetTarget(vec3(0.f, 0.f, 0.f));
m_camera->SetPosition(vec3(0.f, 0.f, 5.f));
m_camera->ForceSceneUpdate();
Ticker::Ref(m_camera);
min_pos = vec3(FLT_MAX);
max_pos = vec3(-FLT_MAX);

m_ready = false;
}

~MeshViewer()
{
Ticker::Unref(m_camera);
}

virtual void TickGame(float seconds)
{
WorldEntity::TickGame(seconds);
//vec4 vertex = in_ModelView * vec4(in_Vertex, 1.0);
// gl_Position = in_Proj * vertex;


m_angle += seconds * 70.0f;
m_mat = mat4::rotate(m_angle, vec3(0, 1, 0));

//mat4 screen_matrix = Scene::GetDefault()->GetProjMatrix() * Scene::GetDefault()->GetViewMatrix();
mat4 world_view_matrix = m_camera->GetViewMatrix() * m_mat;
mat4 world_screen_matrix = m_camera->GetProjMatrix() * world_view_matrix;
mat4 view_world_matrix = inverse(m_camera->GetViewMatrix());
mat4 screen_view_matrix = inverse(m_camera->GetProjMatrix());
vec4 a(0, 2, 0, 1.0f);
vec4 b(0,-2, 0, 1.0f);
vec4 c(0, 0, -2, 1.0f);
vec4 d(-1, -1, 1, 1.0f);
//vec2 toto;
//near plane : vec4(toto, 1.f, 1.f);
//far plane : vec4(toto, -1.f, 1.f);

a = vec4((world_screen_matrix * a).xyz / a.w, a.w);
b = vec4((world_screen_matrix * b).xyz / b.w, b.w);
c = vec4((inverse(world_screen_matrix) * c).xyz / c.w, c.w);
d = vec4((inverse(world_screen_matrix) * d).xyz / d.w, d.w);
a = b;
c = d;

//this is the algorithm for a camera that must keep n target in the screen
{
//Get the Min/Max needed
vec3 new_min_pos(FLT_MAX);
vec3 new_max_pos(-FLT_MAX);
for (int i = 0; i < m_meshes.Last().GetVertexCount(); i++)
{
vec4 vpos = world_view_matrix * vec4(m_meshes.Last().GetVertexLocation(i), 1.0f);
new_min_pos = min(vpos.xyz, new_min_pos);
new_max_pos = max(vpos.xyz, new_max_pos);
}

//Actual camera algorithm
{
vec4 BottomLeft = m_camera->GetProjMatrix() * vec4(new_min_pos.xy, new_min_pos.z, 1.0f);
vec4 TopRight = m_camera->GetProjMatrix() * vec4(new_max_pos.xy, new_min_pos.z, 1.0f);
BottomLeft = vec4(BottomLeft.xyz / BottomLeft.w, BottomLeft.w);
TopRight = vec4(TopRight.xyz / TopRight.w, TopRight.w);
//vec2 NewSize = TopRight.xy - BottomLeft.xy;
//NewSize.x = max(NewSize.x, NewSize.y) * 1.5f;
vec4 DistantPoint = screen_view_matrix * vec4(vec2(1.0f, 1.0f), TopRight.z * TopRight.w, TopRight.w);

vec3 vcenter = vec3(new_min_pos.xy + new_max_pos.xy, .0f) * .5f;
vec4 new_pos = screen_view_matrix * vec4(.0f, .0f, new_min_pos.z, 1.0f);
//vcenter.z += (new_pos.z - new_pos.z * NewSize.x);
vcenter = (view_world_matrix * vec4(vcenter, 1.0f)).xyz;

m_camera->SetPosition(damp(m_camera->GetPosition(), vcenter, 0.4f, seconds));
//m_camera->SetPosition(vcenter);
m_camera->SetTarget(m_camera->GetPosition() + vec3(0, 0, -5.0f));
}
//
}
}

virtual void TickDraw(float seconds)
{
WorldEntity::TickDraw(seconds);

if (!m_ready)
{
for (int i = 0; i < m_meshes.Count(); i++)
m_meshes[i].MeshConvert();
m_ready = true;
}

Video::SetClearColor(vec4(0.0f, 0.0f, 0.0f, 1.0f));

m_mat = mat4::translate(vec3(m_meshes.Count() * MESH_DIST * 0.5f, 0, m_meshes.Count() * MESH_DIST) * -1.0f) * m_mat;
for (int i = 0; i < m_meshes.Count(); i++)
{
m_mat = mat4::translate(vec3(MESH_DIST * 0.5f, 0, MESH_DIST)) * m_mat;
m_meshes[i].Render(m_mat);
Video::Clear(ClearMask::Depth);
}
//m_mat = mat4::translate(vec3(.0f));
//m_meshes.Last().Render(m_mat);
}

private:
//Array<EasyMesh, mat4, float> m_gears;
float m_angle;
mat4 m_mat;
vec3 min_pos;
vec3 max_pos;

Array<EasyMesh> m_meshes;
Camera *m_camera;

bool m_ready;
};

int main(int argc, char **argv)
{
System::Init(argc, argv);

Application app("MeshViewer", ivec2(960, 600), 60.0f);
new MeshViewer();
app.Run();

return EXIT_SUCCESS;
}


+ 65
- 0
test/MeshViewer.vcxproj Voir le fichier

@@ -0,0 +1,65 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|PS3">
<Configuration>Debug</Configuration>
<Platform>PS3</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|x64">
<Configuration>Debug</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|Xbox 360">
<Configuration>Debug</Configuration>
<Platform>Xbox 360</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|PS3">
<Configuration>Release</Configuration>
<Platform>PS3</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|x64">
<Configuration>Release</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Xbox 360">
<Configuration>Release</Configuration>
<Platform>Xbox 360</Platform>
</ProjectConfiguration>
</ItemGroup>
<ItemGroup>
<ClCompile Include="MeshViewer.cpp" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="$(SolutionDir)\..\..\src\lolcore.vcxproj">
<Project>{9e62f2fe-3408-4eae-8238-fd84238ceeda}</Project>
</ProjectReference>
</ItemGroup>
<PropertyGroup Label="Globals">
<ProjectGuid>{7CE9FE12-E4AB-4A22-90D4-2C15F0C30D4E}</ProjectGuid>
<ConfigurationType>Application</ConfigurationType>
<Keyword>Win32Proj</Keyword>
</PropertyGroup>
<Import Project="$(SolutionDir)\Lol.Core.Config.props" />
<ImportGroup Label="ExtensionSettings">
<Import Project="$(SolutionDir)\Lol.Fx.props" />
</ImportGroup>
<ImportGroup Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
<Import Project="$(SolutionDir)\Lol.Core.Vars.props" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<Import Project="$(SolutionDir)\Lol.Core.Rules.props" />
<ItemDefinitionGroup />
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
<Import Project="$(SolutionDir)\Lol.Fx.targets" />
</ImportGroup>
</Project>

Chargement…
Annuler
Enregistrer