Changed: #860 zviewer already in code/nel/tools/3d

This commit is contained in:
kervala 2010-05-10 23:09:04 +02:00
parent ad487dae19
commit 7c57b18dd0
11 changed files with 0 additions and 2108 deletions

View file

@ -25,11 +25,6 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ren_date", "ren_date\ren_da
EndProject EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ResSwap", "resswap\ResSwap.vcproj", "{45255B61-CD45-484A-89DB-B4D75EF04993}" Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ResSwap", "resswap\ResSwap.vcproj", "{45255B61-CD45-484A-89DB-B4D75EF04993}"
EndProject EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "zviewer", "zviewer\zviewer.vcproj", "{B798D9FF-AA33-4918-8B51-1B4FA9C5160A}"
ProjectSection(ProjectDependencies) = postProject
{2B48BE83-108B-4E8E-8A55-6627CF09AC5A} = {2B48BE83-108B-4E8E-8A55-6627CF09AC5A}
EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "3d", "..\nel\src\3d.vcproj", "{2B48BE83-108B-4E8E-8A55-6627CF09AC5A}" Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "3d", "..\nel\src\3d.vcproj", "{2B48BE83-108B-4E8E-8A55-6627CF09AC5A}"
ProjectSection(ProjectDependencies) = postProject ProjectSection(ProjectDependencies) = postProject
{44B21233-EFCC-4825-B5E5-3A3BD6CC5516} = {44B21233-EFCC-4825-B5E5-3A3BD6CC5516} {44B21233-EFCC-4825-B5E5-3A3BD6CC5516} = {44B21233-EFCC-4825-B5E5-3A3BD6CC5516}
@ -115,14 +110,6 @@ Global
{45255B61-CD45-484A-89DB-B4D75EF04993}.Release|Win32.Build.0 = Release|Win32 {45255B61-CD45-484A-89DB-B4D75EF04993}.Release|Win32.Build.0 = Release|Win32
{45255B61-CD45-484A-89DB-B4D75EF04993}.Release|x64.ActiveCfg = Release|x64 {45255B61-CD45-484A-89DB-B4D75EF04993}.Release|x64.ActiveCfg = Release|x64
{45255B61-CD45-484A-89DB-B4D75EF04993}.Release|x64.Build.0 = Release|x64 {45255B61-CD45-484A-89DB-B4D75EF04993}.Release|x64.Build.0 = Release|x64
{B798D9FF-AA33-4918-8B51-1B4FA9C5160A}.Debug|Win32.ActiveCfg = Debug|Win32
{B798D9FF-AA33-4918-8B51-1B4FA9C5160A}.Debug|Win32.Build.0 = Debug|Win32
{B798D9FF-AA33-4918-8B51-1B4FA9C5160A}.Debug|x64.ActiveCfg = Debug|x64
{B798D9FF-AA33-4918-8B51-1B4FA9C5160A}.Debug|x64.Build.0 = Debug|x64
{B798D9FF-AA33-4918-8B51-1B4FA9C5160A}.Release|Win32.ActiveCfg = Release|Win32
{B798D9FF-AA33-4918-8B51-1B4FA9C5160A}.Release|Win32.Build.0 = Release|Win32
{B798D9FF-AA33-4918-8B51-1B4FA9C5160A}.Release|x64.ActiveCfg = Release|x64
{B798D9FF-AA33-4918-8B51-1B4FA9C5160A}.Release|x64.Build.0 = Release|x64
{2B48BE83-108B-4E8E-8A55-6627CF09AC5A}.Debug|Win32.ActiveCfg = Debug|Win32 {2B48BE83-108B-4E8E-8A55-6627CF09AC5A}.Debug|Win32.ActiveCfg = Debug|Win32
{2B48BE83-108B-4E8E-8A55-6627CF09AC5A}.Debug|Win32.Build.0 = Debug|Win32 {2B48BE83-108B-4E8E-8A55-6627CF09AC5A}.Debug|Win32.Build.0 = Debug|Win32
{2B48BE83-108B-4E8E-8A55-6627CF09AC5A}.Debug|x64.ActiveCfg = Debug|x64 {2B48BE83-108B-4E8E-8A55-6627CF09AC5A}.Debug|x64.ActiveCfg = Debug|x64

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

View file

@ -1,230 +0,0 @@
// NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/>
// Copyright (C) 2010 Winch Gate Property Limited
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as
// published by the Free Software Foundation, either version 3 of the
// License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
#include <nel/misc/event_server.h>
#include <nel/3d/driver.h>
#include <nel/3d/nelu.h>
#include "move_listener.h"
using namespace NLMISC;
namespace NL3D {
/****************************************************************\
CMoveListener()
\****************************************************************/
CMoveListener::CMoveListener()
{
_ViewMatrix.identity();
_Viewport.initFullScreen();
_Mode = WALK;
_MouseFree = false;
_CursorInit = false;
_Width = 0;
_Height = 0;
_Top=1.f;
_Bottom=1.f;
_Left=1.f;
_Right=1.f;
_Depth=1.f;
_RotZ = 0;
_RotX = 0;
_TransSpeed = 1.66f;
_RotSpeed = 1;
_CurrentTime = 0;
_LastTime = 0;
_EyesHeight = 1.80f;
}
/****************************************************************\
changeViewMatrix()
\****************************************************************/
void CMoveListener::changeViewMatrix()
{
float time = (sint64)(_CurrentTime-_LastTime)*0.001f;
// Forward
if(CNELU::AsyncListener.isKeyDown(KeyUP))
{
if(_Mode==WALK)
{
_Pos.x -= time*_TransSpeed * (float)sin(_RotZ);
_Pos.y += time*_TransSpeed * (float)cos(_RotZ);
}
else
{
_Pos.x -= time*_TransSpeed * (float)sin(_RotZ)*(float)cos(_RotX);
_Pos.y += time*_TransSpeed * (float)cos(_RotZ)*(float)cos(_RotX);
_Pos.z += time*_TransSpeed * (float)sin(_RotX);
}
}
// Backward
if(CNELU::AsyncListener.isKeyDown(KeyDOWN))
{
if(_Mode==WALK)
{
_Pos.x += time*_TransSpeed * (float)sin(_RotZ);
_Pos.y -= time*_TransSpeed * (float)cos(_RotZ);
}
else
{
_Pos.x += time*_TransSpeed * (float)sin(_RotZ)*(float)cos(_RotX);
_Pos.y -= time*_TransSpeed * (float)cos(_RotZ)*(float)cos(_RotX);
_Pos.z -= time*_TransSpeed * (float)sin(_RotX);
}
}
// Strafe left
if(CNELU::AsyncListener.isKeyDown(KeyLEFT))
{
_Pos.x = _Pos.x - time*_TransSpeed*(float)cos(_RotZ);
_Pos.y = _Pos.y - time*_TransSpeed*(float)sin(_RotZ);
}
// Strafe right
if(CNELU::AsyncListener.isKeyDown(KeyRIGHT))
{
_Pos.x = _Pos.x + time*_TransSpeed*(float)cos(_RotZ);
_Pos.y = _Pos.y + time*_TransSpeed*(float)sin(_RotZ);
}
// Up
if(CNELU::AsyncListener.isKeyDown(KeySHIFT))
{
_Pos.z += time*_TransSpeed;
}
// Down
if(CNELU::AsyncListener.isKeyDown(KeyCONTROL))
{
_Pos.z -= time*_TransSpeed;
}
if(CNELU::AsyncListener.isKeyPushed(Key1))
{
_TransSpeed = 5/3.6f; // 5km/h
}
if(CNELU::AsyncListener.isKeyPushed(Key2))
{
_TransSpeed = 10/3.6f; // 10km/h
}
if(CNELU::AsyncListener.isKeyPushed(Key3))
{
_TransSpeed = 20/3.6f; // 20km/h
}
if(CNELU::AsyncListener.isKeyPushed(Key4))
{
_TransSpeed = 40/3.6f; //40km/h
}
if(CNELU::AsyncListener.isKeyPushed(Key5))
{
_TransSpeed = 80/3.6f; //80km/h
}
if(CNELU::AsyncListener.isKeyPushed(Key6))
{
_TransSpeed = 160/3.6f; //160km/h
}
if(CNELU::AsyncListener.isKeyPushed(Key7))
{
_TransSpeed = 320/3.6f; //320km/h
}
if(CNELU::AsyncListener.isKeyPushed(Key8))
{
_TransSpeed = 640/3.6f; //640km/h
}
// Transform view matrix
_ViewMatrix.identity();
_ViewMatrix.translate(CVector(0,0,_EyesHeight));
_ViewMatrix.translate(_Pos);
_ViewMatrix.rotateZ(_RotZ);
_ViewMatrix.rotateX(_RotX);
CNELU::Camera->setMatrix(_ViewMatrix);
}
/****************************************************************\
operator()
\****************************************************************/
void CMoveListener::operator()(const CEvent& event)
{
static const float eps = 0.001f;
// Rotation
if (event==EventMouseMoveId)
{
CEventMouse* mouseEvent=(CEventMouse*)&event;
if(!_MouseFree)
{
if(_CursorInit)
{
float difx = 0.5f-mouseEvent->X;
if ( (float)fabs(difx) > eps)
{
_RotZ += _RotSpeed*(difx);
}
float dify = -(0.5f-mouseEvent->Y);
if ( (float)fabs(dify) > eps)
{
_RotX += _RotSpeed*(dify);
}
}
else
{
_CursorInit = true;
}
_Scene->getDriver()->setMousePos(0.5,0.5);
}
}
changeViewMatrix();
}
/****************************************************************\
addToServer()
\****************************************************************/
void CMoveListener::addToServer(CEventServer& server)
{
server.addListener (EventMouseMoveId, this);
}
/****************************************************************\
removeFromServer()
\****************************************************************/
void CMoveListener::removeFromServer (CEventServer& server)
{
server.removeListener (EventMouseMoveId, this);
}
}; // NL3D

View file

@ -1,221 +0,0 @@
// NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/>
// Copyright (C) 2010 Winch Gate Property Limited
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as
// published by the Free Software Foundation, either version 3 of the
// License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
#ifndef NL_MOVE_LISTENER_H
#define NL_MOVE_LISTENER_H
#include <nel/misc/types_nl.h>
#include <nel/misc/time_nl.h>
#include <nel/misc/event_listener.h>
#include <nel/misc/matrix.h>
#include <nel/3d/viewport.h>
#include <nel/3d/scene.h>
#include <nel/3d/camera.h>
#include <nel/3d/driver.h>
namespace NL3D
{
/**
* CMoveListener is a listener that handle a 3d matrix with mouse events.
* \author Stephane Coutelas
* \author Nevrax France
* \date 2000
*/
class CMoveListener : public NLMISC::IEventListener
{
public :
/**
* TMoveMode.
* moving modes
*/
enum TMoveMode
{
WALK,
FREE
};
private:
/// Internal use
virtual void operator()(const NLMISC::CEvent& event);
/// moving mode
TMoveMode _Mode;
/// view matrix
NLMISC::CMatrix _ViewMatrix;
/// viewport
NL3D::CViewport _Viewport;
/// true if first setMousePos done
bool _CursorInit;
CScene * _Scene;
/// screen width
uint _Width;
/// screen height
uint _Height;
///frustum parameters
float _Top;
float _Bottom;
float _Left;
float _Right;
float _Depth;
/// current position
CVector _Pos;
/// eyes height
float _EyesHeight;
///current rotation z angle
float _RotZ;
///current rotation x angle
float _RotX;
/// last local time measured
NLMISC::TTime _LastTime;
/// current local time
NLMISC::TTime _CurrentTime;
/// step for translation
float _TransSpeed;
/// step for rotation
float _RotSpeed;
/// false if mouse is use to move
bool _MouseFree;
public:
/**
* Constructor.
* You should call init then.
*/
CMoveListener();
/**
* Constructor.
* You should call init then.
* \param scene the scene
* \param w screen width in pixels
* \param h screen height in pixels
* \param camera the camera
*/
void init(CScene * scene, uint w, uint h, const class CCamera& camera)
{
_Scene = scene;
_Width = w;
_Height = h;
_Viewport = scene->getViewport();
float dummy;
_ViewMatrix = camera.getMatrix ();
camera.getFrustum (_Left, _Right, _Bottom, _Top, _Depth, dummy);
}
/**
* Set the moving mode
* \param m the moving mode
*/
void setMode(TMoveMode m)
{
_Mode = m;
}
void swapMode()
{
if(_Mode==WALK)
{
_Mode = FREE;
}
else
{
_Mode = WALK;
}
}
TMoveMode getMode() const
{
return _Mode;
}
void changeViewMatrix();
/**
* Register the listener to the server.
*/
void addToServer (NLMISC::CEventServer& server);
/**
* Unregister the listener to the server.
*/
void removeFromServer (NLMISC::CEventServer& server);
void setEyesHeight(float eh) { _EyesHeight = eh; }
float getEyesHeight() const { return _EyesHeight; }
void setPos(CVector pos) { _Pos = pos; }
CVector getPos() const { return _Pos; }
float getRotX() const { return _RotX; }
float getRotZ() const { return _RotZ; }
float getSpeed() const { return _TransSpeed; }
void setLocalTime(NLMISC::TTime time)
{
_LastTime = _CurrentTime;
_CurrentTime = time;
}
void changeControlMode()
{
_MouseFree = ! _MouseFree;
if(_MouseFree)
{
_Scene->getDriver()->showCursor(true);
}
else
{
_Scene->getDriver()->showCursor(false);
}
}
}; // NL3D
}
#endif // NL_MOVE_LISTENER_H
/* End of move_listener.h */

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.6 KiB

View file

@ -1,175 +0,0 @@
====================
ZVIEWER
====================
ZVIEWER permet de visioner une ou plusieurs zones exportées depuis 3DSMax
au format de NeL, en utilisant le moteur.
1. Le fichier zviewer.cfg
-----------------------
Le répertoire d'où est exécuté le programme doit contenir le fichier ZVIEWER.CFG
qui contient les paramètres de configuration. Sans ce fichier aucune zone ne sera
affichée.
Lorsqu'il n'y a pas de fichier de configuration à l'execution un fichier type est
généré.
Exemple de config :
FullScreen = 0;
Width = 800;
Height = 600;
Depth = 32;
Position = { 1088.9, -925.7, -1234.0 };
EyesHeight = 1.80;
Background = { 100, 100, 255 };
ZFar = 1000.0;
LandscapeTileNear = 50.0;
LandscapeThreshold = 0.001;
BanksPath = "C:\WINDOWS\Bureau\zviewer\" ;
Bank = "fyros_landf.bank" ;
TilesPath = "C:\WINDOWS\Bureau\zviewer\tiles" ;
ZonesPath = "C:\WINDOWS\Bureau\zviewer\zones" ;
IgPath = "C:\WINDOWS\Bureau\zviewer\ig" ;
ShapePath = "C:\WINDOWS\Bureau\zviewer\shapes" ;
MapsPath = "C:\WINDOWS\Bureau\zviewer\maps" ;
Zones = { "3_AC.zonel","3_AD.zonel" };
Zonessave = { "3_AC.zonel","3_AD.zonel" };
Zones = { "3_AC.zonel","3_AD.zonel" };
Ig = { "3_AC.ig","3_AD.ig" };
Avec :
Fullscreen :
0 : windowed
1 : fullscreen
Width :
largeur de la fenetre.
Height :
hauteur de la fenetre.
Depth :
nombre de couleurs (32bits,24bits,...).
Position :
position initiale (x,y,z). Correspond aux coordonnées dans Max (Generic Units).
La position est automatiquement snapée au sol quelque soit la coordonnée en z.
EyesHeight :
hauteur des yeux pour le mode Walk.
Background :
couleur rgb du fond.
ZFar :
distance de clipping. Plus la distance est grande, plus on voit loin.
LandscapeTileNear :
valeur du near. Plus cette valeur est grande, plus la zone du near est grande.
LandscapeThreshold :
seuil utilisé pour la subdivision adaptative. Quand la valeur augmente, la qualité
de la subdivision diminue (reduit le temps de calcul). Mis au minimum par defaut (0.001).
BanksPath :
chemin des banks (<bank>.bank et <bank>.farbank).
Bank :
nom de la bank (meme racine que la farbank)
ZonesPath :
chemin des zones.
Zones :
liste des noms des zones
2. Les déplacements
----------------
Les déplacements se font à l'aide de la combinaison clavier/souris.
Il existe 2 modes de déplacement : FreeLook et Walk (defaut).
- Le mode FreeLook permet de se déplacer dans la direction du regard(idem cstrike).
- Dans le mode Walk le déplacement se fait au niveau du sol, à hauteur des yeux.
L'utilisateur reste collé au sol.
La souris permet d'orienter le regard dans toutes les directions
Le clavier permet de se déplacer.
3. Les touches
-----------
ESC : quitter le viewer
F1 : Afficher/Masquer les infos
F3 : basculer entre le mode plein et le mode fil de fer
F12 : faire un screenshot
ESPACE : basculer entre les modes Walk et Free-Look
RETURN : libérer ou capturer la souris
UP : avancer
DOWN : reculer
LEFT : déplacement latéral à gauche
RIGHT : déplacement latéral à droite
SHIFT : augmenter l'altitude
CTRL : baisser d'altitude
1 : 5 km/h
2 : 10 km/h
3 : 20 km/h
4 : 40 km/h
5 : 80 km/h
6 : 160 km/h
7 : 320 km/h
8 : 640 km/h
PAGEUP : augmenter la distance de clipping
PAGEDOWN : diminuer la distance de clipping
HOME : augmenter le near
END : diminuer le near
INSERT : augmenter le threshold
DELETE : diminuer le threshold
ADD : augmenter la hauteur des yeux
SUBTRACT : diminuer la hauteur des yeux
==================== ZVIEWER ENGLISH ====================
ZViewer allows you to view one or more zones exported from 3DSMax inside the NeL Engine
When you run ZViewer for the first time if no configuration file is located one will be created with default values.
The Configuration file defines the zones to load and other vital information and will not work in it's default state
Keys
ESC: exit ZViewer
F1: toggles information
F3: toggles between full and the wire frame mode
F12: screenshot
SPACE: toggles between Walk and Free-Look mode
RETURN: release or capture mouse
UP: move forward
DOWN: move back
LEFT: turn left
RIGHT: turn right
SHIFT: increases altitude
CTRL: decreases altitude
1: 5 km/h
2: 10 km/h
3: 20 km/h
4: 40 km/h
5: 80 km/h
6: 160 km/h
7: 320 km/h
8: 640 km/h
PAGEUP: increases the clipping distance
PAGEDOWN: decreases the clipping distance
HOME: increases tilenear
END: decreases the tilenear
INSERT: increases threshold
DELETE: decreases threshold
ADD: increases the eye height
SUBTRACT: decreases the eye height

View file

@ -1,32 +0,0 @@
// NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/>
// Copyright (C) 2010 Winch Gate Property Limited
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as
// published by the Free Software Foundation, either version 3 of the
// License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
//{{NO_DEPENDENCIES}}
// Microsoft Visual C++ generated include file.
// Used by zviewer.rc
//
#define IDI_ICON1 101
// Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 102
#define _APS_NEXT_COMMAND_VALUE 40001
#define _APS_NEXT_CONTROL_VALUE 1001
#define _APS_NEXT_SYMED_VALUE 101
#endif
#endif

View file

@ -1,37 +0,0 @@
FullScreen = 0;
Width = 800;
Height = 600;
Depth = 32;
Position = { 1676, -7361, 0.000000 };
EyesHeight = 1.800000;
Background = { 100, 100, 255 };
ZFar = 1000.000000;
AutoLight = 0;
LightDir = { 1.000000, 0.000000, 0.000000 };
LandscapeNoise = 0;
LandscapeTileNear = 50.000000;
LandscapeThreshold = 0.001000;
BanksPath = "R:\code\snowballs2\client\data\tiles";
TilesPath = "R:\code\snowballs2\client\data\tiles";
UseDDS = "1";
AllPathRelative = "0";
Bank = "bank.bank";
ZonesPath = "R:\code\snowballs2\client\data\zones";
IgPath = "R:\code\snowballs2\client\data\zones";
ShapePath = "R:\code\snowballs2\client\data\shapes";
MapsPath = "R:\code\snowballs2\client\data\maps";
FontPath = "C:\Windows\fonts\arial.ttf";
HeightFieldName = "";
HeightFieldMaxZ = 100.000000;
HeightFieldOriginX = 16000.000000;
HeightFieldOriginY = -24000.000000;
HeightFieldSizeX = 160.000000;
HeightFieldSizeY = 160.000000;
LandAmbient = { 0, 0, 0};
LandDiffuse = { 255, 255, 255};
Zones = {
"3_AC.zonel",
"3_AD.zonel",
};
Ig = {
};

View file

@ -1,975 +0,0 @@
// NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/>
// Copyright (C) 2010 Winch Gate Property Limited
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as
// published by the Free Software Foundation, either version 3 of the
// License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
#include <nel/misc/types_nl.h>
#include <nel/misc/config_file.h>
#include <nel/misc/debug.h>
#include <nel/misc/path.h>
#include <nel/misc/i18n.h>
#include <nel/3d/driver.h>
#include <nel/3d/camera.h>
#include <nel/3d/landscape_model.h>
#include <nel/3d/landscape.h>
#include <nel/3d/text_context.h>
#include <nel/3d/mini_col.h>
#include <nel/3d/nelu.h>
#include <nel/3d/scene_group.h>
#include <nel/3d/texture_file.h>
//#include "nel/net/local_entity.h"
#include "move_listener.h"
// Tempyoyo.
#include <nel/3d/height_map.h>
#include <string>
#include <deque>
using namespace std;
using namespace NLMISC;
using namespace NL3D;
#define BANK_PAH_RELATIVE
/**
* CViewerConfig
*/
struct CViewerConfig
{
bool Windowed;
uint Width;
uint Height;
uint Depth;
CVector Position;
CVector Heading;
CVector EyesHeight;
CRGBA Background;
// Landscape
bool AutoLight;
CVector LightDir;
string ZonesPath;
string BanksPath;
string TilesPath;
bool UseDDS;
bool AllPathRelative;
string IgPath;
string ShapePath;
string MapsPath;
string Bank;
string FontPath;
CTextContext TextContext;
CFontManager FontManager;
float ZFar;
float LandscapeTileNear;
float LandscapeThreshold;
bool LandscapeNoise;
vector<string> Zones;
vector<string> Igs;
// HeightField.
string HeightFieldName;
float HeightFieldMaxZ;
float HeightFieldOriginX;
float HeightFieldOriginY;
float HeightFieldSizeX;
float HeightFieldSizeY;
// StaticLight
CRGBA LandAmbient;
CRGBA LandDiffuse;
CViewerConfig()
{
Windowed = true;
Width = 800;
Height = 600;
Depth = 32;
Position = CVector( 1088.987793f, -925.732178f, 0.0f );
Heading = CVector(0,1,0);
EyesHeight = CVector(0,0,1.8f);
Background = CRGBA(100,100,255);
AutoLight = false;
LightDir = CVector (1, 0, 0);
ZonesPath = "./";
BanksPath = "./";
TilesPath = "./";
UseDDS = false;
AllPathRelative = false;
IgPath = "./";
ShapePath = "./";
MapsPath = "./";
Bank = "bank.bank";
FontPath = "\\\\server\\code\\fonts\\arialuni.ttf";
ZFar = 1000;
LandscapeTileNear = 50.0f;
LandscapeThreshold = 0.001f;
LandscapeNoise = true;
HeightFieldName= "";
HeightFieldMaxZ= 100;
HeightFieldOriginX= 16000;
HeightFieldOriginY= -24000;
HeightFieldSizeX= 160;
HeightFieldSizeY= 160;
CRGBA diffuse (241, 226, 244);
CRGBA ambiant (17, 54, 100);
LandDiffuse= diffuse;
LandAmbient= ambiant;
}
};
CViewerConfig ViewerCfg;
CLandscapeModel *Landscape = NULL;
CMoveListener MoveListener;
CMiniCol CollisionManager;
/*******************************************************************\
getZoneNameByCoord()
\*******************************************************************/
string getZoneNameByCoord(float x, float y)
{
const float zoneDim = 160.0f;
float xcount = x/zoneDim;
float ycount = -y/zoneDim + 1;
string zoneName;
char ych[32];
sprintf(ych,"%d",(sint)ycount);
sint sz = strlen(ych);
for(sint i = 0; i<sz; i++)
{
zoneName += ych[i];
}
zoneName += '_';
zoneName += 'A' + (sint)xcount/26;
zoneName += 'A' + (sint)xcount%26;
return zoneName;
}
/*********************************************************\
displayOrientation()
\*********************************************************/
void displayOrientation()
{
float x = 0.9f*4.f/3.f;
float y = 0.1f;
float radius = 0.015f;
// Triangle
CMaterial mat;
mat.initUnlit();
mat.setSrcBlend(CMaterial::srcalpha);
mat.setDstBlend(CMaterial::invsrcalpha);
mat.setBlend(true);
CVertexBuffer vb;
vb.setVertexFormat (CVertexBuffer::PositionFlag);
vb.setNumVertices (7);
{
CVertexBufferReadWrite vba;
vb.lock(vba);
// tri
vba.setVertexCoord (0, CVector (-radius, 0, 0));
vba.setVertexCoord (1, CVector (radius, 0, 0));
vba.setVertexCoord (2, CVector (0, 0, 3*radius));
// quad
vba.setVertexCoord (3, CVector (-radius, 0, -radius));
vba.setVertexCoord (4, CVector (radius, 0, -radius));
vba.setVertexCoord (5, CVector (radius, 0, radius));
vba.setVertexCoord (6, CVector (-radius, 0, radius));
}
CNELU::Driver->activeVertexBuffer(vb);
CIndexBuffer pbTri;
pbTri.setNumIndexes (3);
{
CIndexBufferReadWrite iba;
pbTri.lock (iba);
iba.setTri (0, 0, 1, 2);
}
CIndexBuffer pbQuad;
pbQuad.setNumIndexes (6);
{
CIndexBufferReadWrite iba;
pbQuad.lock(iba);
iba.setTri (0, 3, 4, 5);
iba.setTri (3, 5, 6, 3);
}
CNELU::Driver->setFrustum (0.f, 4.f/3.f, 0.f, 1.f, -1.f, 1.f, false);
CMatrix mtx;
mtx.identity();
CNELU::Driver->setupViewMatrix (mtx);
mat.setColor(CRGBA(50,255,255,150));
// up
mtx.identity();
mtx.translate(CVector(x,0,y));
mtx.rotateY(MoveListener.getRotZ() );
mtx.translate(CVector(0,0,radius));
CNELU::Driver->setupModelMatrix (mtx);
CNELU::Driver->activeVertexBuffer(vb);
CNELU::Driver->activeIndexBuffer(pbTri);
CNELU::Driver->renderTriangles(mat, 0, pbTri.getNumIndexes()/3);
mat.setColor(CRGBA(50,50,255,150));
// down
mtx.identity();
mtx.translate(CVector(x,0,y));
mtx.rotateY(MoveListener.getRotZ() + (float)Pi);
mtx.translate(CVector(0,0,radius));
CNELU::Driver->setupModelMatrix (mtx);
CNELU::Driver->renderTriangles(mat, 0, pbTri.getNumIndexes()/3);
// left
mtx.identity();
mtx.translate(CVector(x,0,y));
mtx.rotateY(MoveListener.getRotZ() - (float)Pi/2);
mtx.translate(CVector(0,0,radius));
CNELU::Driver->setupModelMatrix (mtx);
CNELU::Driver->renderTriangles(mat, 0, pbTri.getNumIndexes()/3);
// right
mtx.identity();
mtx.translate(CVector(x,0,y));
mtx.rotateY(MoveListener.getRotZ() + (float)Pi/2);
mtx.translate(CVector(0,0,radius));
CNELU::Driver->setupModelMatrix (mtx);
CNELU::Driver->renderTriangles(mat, 0, pbTri.getNumIndexes()/3);
// center
mtx.identity();
mtx.translate(CVector(x,0,y));
mtx.rotateY(MoveListener.getRotZ());
CNELU::Driver->setupModelMatrix (mtx);
CNELU::Driver->activeIndexBuffer(pbQuad);
CNELU::Driver->renderTriangles(mat, 0, pbQuad.getNumIndexes()/3);
}
/*********************************************************\
displayZone()
\*********************************************************/
void displayZones()
{
const float zFarStep = 5.0f;
const float tileNearStep = 10.0f;
const float thresholdStep = 0.005f;
ViewerCfg.TextContext.setHotSpot(CComputedString::MiddleMiddle);
ViewerCfg.TextContext.setColor(CRGBA(255,255,255));
ViewerCfg.TextContext.setFontSize(20);
CNELU::clearBuffers(CRGBA(0,0,0));
CNELU::swapBuffers();
// Create landscape
CNELU::clearBuffers(CRGBA(0,0,0));
ViewerCfg.TextContext.printfAt(0.5f,0.5f,"Creating landscape...");
CNELU::swapBuffers();
Landscape = (CLandscapeModel*)CNELU::Scene->createModel(LandscapeModelId);
Landscape->Landscape.setNoiseMode (ViewerCfg.LandscapeNoise);
Landscape->Landscape.setTileNear(ViewerCfg.LandscapeTileNear);
Landscape->Landscape.setThreshold(ViewerCfg.LandscapeThreshold);
Landscape->Landscape.enableAutomaticLighting (ViewerCfg.AutoLight);
Landscape->Landscape.setupAutomaticLightDir (ViewerCfg.LightDir);
// Enable Additive Tiles.
Landscape->enableAdditive(true);
// HeightField.
CBitmap heightBitmap;
if( ViewerCfg.HeightFieldName!="" && heightBitmap.load(CIFile(ViewerCfg.HeightFieldName)) )
{
CHeightMap heightMap;
heightMap.buildFromBitmap(heightBitmap);
heightMap.MaxZ= ViewerCfg.HeightFieldMaxZ;
heightMap.OriginX= ViewerCfg.HeightFieldOriginX;
heightMap.OriginY= ViewerCfg.HeightFieldOriginY;
heightMap.SizeX = ViewerCfg.HeightFieldSizeX;
heightMap.SizeY = ViewerCfg.HeightFieldSizeY;
Landscape->Landscape.setHeightField(heightMap);
}
// Init TileBank.
CNELU::clearBuffers(CRGBA(0,0,0));
ViewerCfg.TextContext.printfAt(0.5f,0.5f,"Initializing TileBanks...");
CNELU::swapBuffers();
try
{
CIFile bankFile (ViewerCfg.BanksPath + "/" + ViewerCfg.Bank);
Landscape->Landscape.TileBank.serial(bankFile);
}
catch(Exception)
{
string tmp = string("Cant load bankfile ")+ViewerCfg.BanksPath + "/" + ViewerCfg.Bank;
nlerror (tmp.c_str());
}
if ((Landscape->Landscape.TileBank.getAbsPath ()!="")&&(ViewerCfg.TilesPath!=""))
Landscape->Landscape.TileBank.setAbsPath (ViewerCfg.TilesPath + "/");
if (ViewerCfg.UseDDS)
{
Landscape->Landscape.TileBank.makeAllExtensionDDS();
}
if (ViewerCfg.AllPathRelative)
Landscape->Landscape.TileBank.makeAllPathRelative();
sint idx = ViewerCfg.Bank.find(".");
string farBank = ViewerCfg.Bank.substr(0,idx);
farBank += ".farbank";
try
{
CIFile farbankFile(ViewerCfg.BanksPath + "/" + farBank);
Landscape->Landscape.TileFarBank.serial(farbankFile);
}
catch(Exception)
{
string tmp = string("Cant load bankfile ")+ViewerCfg.BanksPath + "/" + farBank;
nlerror (tmp.c_str());
}
if ( ! Landscape->Landscape.initTileBanks() )
{
nlwarning( "You need to recompute bank.farbank for the far textures" );
}
// Init light color
CNELU::clearBuffers(CRGBA(0,0,0));
ViewerCfg.TextContext.printfAt(0.5f,0.5f,"Initializing Light...");
CNELU::swapBuffers();
Landscape->Landscape.setupStaticLight (ViewerCfg.LandDiffuse, ViewerCfg.LandAmbient, 1.1f);
// Init collision manager
CollisionManager.init( &(Landscape->Landscape), 200);
// Preload of TileBank
CNELU::clearBuffers(CRGBA(0,0,0));
ViewerCfg.TextContext.printfAt(0.5f,0.5f,"Loading TileBank...");
CNELU::swapBuffers();
for (int ts=0; ts<Landscape->Landscape.TileBank.getTileSetCount (); ts++)
{
CTileSet *tileSet=Landscape->Landscape.TileBank.getTileSet (ts);
sint tl;
for (tl=0; tl<tileSet->getNumTile128(); tl++)
Landscape->Landscape.flushTiles (CNELU::Scene->getDriver(), (uint16)tileSet->getTile128(tl), 1);
for (tl=0; tl<tileSet->getNumTile256(); tl++)
Landscape->Landscape.flushTiles (CNELU::Scene->getDriver(), (uint16)tileSet->getTile256(tl), 1);
for (tl=0; tl<CTileSet::count; tl++)
Landscape->Landscape.flushTiles (CNELU::Scene->getDriver(), (uint16)tileSet->getTransition(tl)->getTile (), 1);
}
// Build zones.
CNELU::clearBuffers(CRGBA(0,0,0));
ViewerCfg.TextContext.printfAt(0.5f,0.5f,"Loading zones...");
CNELU::swapBuffers();
uint32 i;
for(i =0; i<ViewerCfg.Zones.size(); i++)
{
CZone zone;
try
{
CIFile file(CPath::lookup(ViewerCfg.Zones[i]));
zone.serial(file);
file.close();
// Add it to landscape.
Landscape->Landscape.addZone(zone);
// Add it to collision manager.
CollisionManager.addZone(zone.getZoneId());
}
catch(Exception &e)
{
printf(e.what ());
}
}
// Load instance group.
CNELU::clearBuffers(CRGBA(0,0,0));
ViewerCfg.TextContext.printfAt(0.5f,0.5f,"Loading objects...");
CNELU::swapBuffers();
for(i =0; i<ViewerCfg.Igs.size(); i++)
{
CInstanceGroup *group = new CInstanceGroup;
try
{
CIFile file(CPath::lookup(ViewerCfg.Igs[i]));
group->serial(file);
file.close();
// Add it to the scene.
group->addToScene (*CNELU::Scene);
}
catch(Exception &e)
{
printf(e.what ());
}
}
// Init collision Manager.
CNELU::clearBuffers(CRGBA(0,0,0));
ViewerCfg.TextContext.printfAt(0.5f,0.5f,"Initializing collision manager...");
CNELU::swapBuffers();
CollisionManager.setCenter(ViewerCfg.Position);
ViewerCfg.Position.z = 0.0f;
CollisionManager.snapToGround( ViewerCfg.Position, 1000.0f );
// hide mouse cursor
CNELU::Driver->showCursor(false);
#ifdef NL_RELEASE
CNELU::Driver->setCapture(true);
#endif
// Events management
CNELU::EventServer.addEmitter(CNELU::Driver->getEventEmitter());
CNELU::AsyncListener.addToServer(CNELU::EventServer);
MoveListener.init(CNELU::Scene, ViewerCfg.Width, ViewerCfg.Height, *CNELU::Camera);
MoveListener.addToServer(CNELU::EventServer);
MoveListener.setPos( ViewerCfg.Position );
CNELU::Camera->setPerspective (float(80.0*Pi/180.0), 1.33f, 0.1f, 1000.0f);
bool showInfos = true;
// initializing Z-Clip Far
float left;
float right;
float bottom;
float top;
float znear;
float zfar;
CNELU::Camera->getFrustum(left, right, bottom, top, znear, zfar);
zfar = ViewerCfg.ZFar;
CNELU::Camera->setFrustum(left, right, bottom, top, znear, zfar);
do
{
// Time mgt.
//==========
static sint64 t0 = (sint64)CTime::getLocalTime();
static sint64 t1 = (sint64)CTime::getLocalTime();
static sint64 ts = 0;
t0 = t1;
t1 = (sint64)CTime::getLocalTime();
sint64 dt64 = t1-t0;
ts += dt64;
float dt= ((float)dt64)*0.001f;
CNELU::EventServer.pump();
// Manage movement and collision
MoveListener.setLocalTime(CTime::getLocalTime());
CVector oldpos = MoveListener.getPos();
MoveListener.changeViewMatrix();
if(MoveListener.getMode()==CMoveListener::WALK)
{
CVector pos = MoveListener.getPos();
CollisionManager.snapToGround( pos , 1000.0f );
MoveListener.setPos( pos );
}
CollisionManager.setCenter(MoveListener.getPos());
// Change move mode
if(CNELU::AsyncListener.isKeyPushed(KeySPACE))
{
MoveListener.swapMode();
}
// Change displaying infos state
if(CNELU::AsyncListener.isKeyPushed(KeyF1))
{
showInfos = !showInfos;
}
// Change eyes height
float eh = MoveListener.getEyesHeight();
if(CNELU::AsyncListener.isKeyPushed(KeyADD))
{
ViewerCfg.EyesHeight.z += 0.1f;
eh += 0.1f;
}
if(CNELU::AsyncListener.isKeyPushed(KeySUBTRACT))
{
ViewerCfg.EyesHeight.z -= 0.1f;
eh -= 0.1f;
}
if(ViewerCfg.EyesHeight.z<0.1f) ViewerCfg.EyesHeight.z = 0.1f;
if(eh<0.1f) eh = 0.1f;
MoveListener.setEyesHeight(eh);
// Change TileNear
float tileNear = Landscape->Landscape.getTileNear();
if(CNELU::AsyncListener.isKeyPushed(KeyHOME))
tileNear += tileNearStep;
if(CNELU::AsyncListener.isKeyPushed(KeyEND))
tileNear -= tileNearStep;
if(tileNear<0) tileNear = 0;
Landscape->Landscape.setTileNear(tileNear);
// Change Z-Far
CNELU::Camera->getFrustum(left, right, bottom, top, znear, zfar);
if(CNELU::AsyncListener.isKeyDown(KeyPRIOR))
zfar += zFarStep;
if(CNELU::AsyncListener.isKeyDown(KeyNEXT))
zfar -= zFarStep;
if(zfar<0) zfar = 0;
CNELU::Camera->setFrustum(left, right, bottom, top, znear, zfar);
// Change Threshold
float threshold = Landscape->Landscape.getThreshold();
if(CNELU::AsyncListener.isKeyPushed(KeyINSERT))
threshold += thresholdStep;
if(CNELU::AsyncListener.isKeyPushed(KeyDELETE))
threshold -= thresholdStep;
if(threshold<0.001f) threshold = 0.001f;
if(threshold>0.1f) threshold = 0.1f;
Landscape->Landscape.setThreshold(threshold);
// Switch between wired and filled scene display
if(CNELU::AsyncListener.isKeyPushed(KeyF3))
{
if (CNELU::Driver->getPolygonMode ()==IDriver::Filled)
CNELU::Driver->setPolygonMode (IDriver::Line);
else
CNELU::Driver->setPolygonMode (IDriver::Filled);
}
// Switch between mouse move and keyboard-only move
if(CNELU::AsyncListener.isKeyPushed(KeyRETURN))
{
MoveListener.changeControlMode();
}
// Render
//=======
CNELU::clearBuffers(ViewerCfg.Background);
CNELU::Driver->clearZBuffer();
CNELU::Scene->render();
if(showInfos)
{
// black top quad
CDRU::drawQuad(0,0.97f,1.0f,1.0f,*CNELU::Driver,CRGBA(0,0,0),CNELU::Scene->getViewport());
// black bottom quad
CDRU::drawQuad(0,0,1.0f,0.03f,*CNELU::Driver,CRGBA(0,0,0),CNELU::Scene->getViewport());
ViewerCfg.TextContext.setFontSize(12);
ViewerCfg.TextContext.setHotSpot(CComputedString::MiddleTop);
ViewerCfg.TextContext.setColor(CRGBA(255,255,255));
// Display fps.
ViewerCfg.TextContext.printfAt(0.05f,0.99f,"%.1f fps",1/dt);
// Display ms
ViewerCfg.TextContext.printfAt(0.12f,0.99f,"%d ms",dt64);
// Display Tile Near
ViewerCfg.TextContext.printfAt(0.75f,0.99f,"Tile Near : %.1f",tileNear);
//Display moving mode
ViewerCfg.TextContext.setColor(CRGBA(255,0,0));
switch(MoveListener.getMode())
{
case CMoveListener::WALK :
ViewerCfg.TextContext.printfAt(0.5f,0.99f,"Walk Mode");
break;
case CMoveListener::FREE :
ViewerCfg.TextContext.printfAt(0.5f,0.99f,"Free-Look Mode");
break;
default:
break;
}
ViewerCfg.TextContext.setColor(CRGBA(255,255,255));
// Display Threshold
ViewerCfg.TextContext.printfAt(0.3f,0.99f,"Threshold : %.3f",threshold);
// Display Clip Far
ViewerCfg.TextContext.printfAt(0.92f,0.99f,"Clip Far : %.1f",zfar);
ViewerCfg.TextContext.setHotSpot(CComputedString::MiddleBottom);
// Display current zone name
CVector pos = MoveListener.getPos();
string zoneName = getZoneNameByCoord(pos.x, pos.y);
ViewerCfg.TextContext.printfAt(0.3f,0.01f,"Zone : %s",zoneName.c_str());
// Position
ViewerCfg.TextContext.printfAt(0.1f,0.01f,"Position : %d %d %d",(sint)pos.x,(sint)pos.y,(sint)pos.z);
// Eyes height
ViewerCfg.TextContext.printfAt(0.7f,0.01f,"Eyes : %.2f m",ViewerCfg.EyesHeight.z);
// Display speed in km/h
ViewerCfg.TextContext.setColor(CRGBA(255,0,0));
ViewerCfg.TextContext.printfAt(0.5f,0.01f,"Speed : %d km/h",(sint)(MoveListener.getSpeed()*3.6f));
ViewerCfg.TextContext.setColor(CRGBA(255,255,255));
// Heading
sint heading = -(sint)(MoveListener.getRotZ()*180/Pi)%360;
if(heading<0) heading += 360;
ViewerCfg.TextContext.printfAt(0.9f,0.01f,"Heading : %d degrees",heading);
// Display the cool compass.
displayOrientation();
}
CNELU::swapBuffers();
CNELU::screenshot();
}
while(!CNELU::AsyncListener.isKeyPushed(KeyESCAPE));
ViewerCfg.Position = MoveListener.getPos();
CNELU::AsyncListener.removeFromServer(CNELU::EventServer);
MoveListener.removeFromServer(CNELU::EventServer);
CNELU::Driver->showCursor(true);
#ifdef NL_RELEASE
CNELU::Driver->setCapture(false);
#endif
}
/****************************************************************\
writeConfigFile
\****************************************************************/
void writeConfigFile(const char * configFileName)
{
FILE * f = fopen(configFileName,"wt");
if(f==NULL)
{
fprintf(stderr,"can't open file '%s'\n",configFileName);
}
fprintf(f,"FullScreen = %d;\n",ViewerCfg.Windowed?0:1);
fprintf(f,"Width = %d;\n",ViewerCfg.Width);
fprintf(f,"Height = %d;\n",ViewerCfg.Height);
fprintf(f,"Depth = %d;\n",ViewerCfg.Depth);
fprintf(f,"Position = { %f, %f, %f };\n", ViewerCfg.Position.x,ViewerCfg.Position.y,ViewerCfg.Position.z);
fprintf(f,"EyesHeight = %f;\n", ViewerCfg.EyesHeight.z);
fprintf(f,"Background = { %d, %d, %d };\n", ViewerCfg.Background.R,ViewerCfg.Background.G,ViewerCfg.Background.B);
fprintf(f,"ZFar = %f;\n", ViewerCfg.ZFar);
fprintf(f,"AutoLight = %d;\n", ViewerCfg.AutoLight?1:0);
fprintf(f,"LightDir = { %f, %f, %f };\n", ViewerCfg.LightDir.x, ViewerCfg.LightDir.y, ViewerCfg.LightDir.z);
fprintf(f,"LandscapeTileNear = %f;\n", ViewerCfg.LandscapeTileNear);
fprintf(f,"LandscapeThreshold = %f;\n", ViewerCfg.LandscapeThreshold);
fprintf(f,"LandscapeNoise = %d;\n", (int)ViewerCfg.LandscapeNoise);
fprintf(f,"BanksPath = \"%s\";\n",ViewerCfg.BanksPath.c_str());
fprintf(f,"TilesPath = \"%s\";\n",ViewerCfg.TilesPath.c_str());
fprintf(f,"UseDDS = \"%d\";\n",ViewerCfg.UseDDS?1:0);
fprintf(f,"AllPathRelative = \"%d\";\n",ViewerCfg.AllPathRelative?1:0);
fprintf(f,"Bank = \"%s\";\n",ViewerCfg.Bank.c_str());
fprintf(f,"ZonesPath = \"%s\";\n",ViewerCfg.ZonesPath.c_str());
fprintf(f,"IgPath = \"%s\";\n",ViewerCfg.IgPath.c_str());
fprintf(f,"ShapePath = \"%s\";\n",ViewerCfg.ShapePath.c_str());
fprintf(f,"MapsPath = \"%s\";\n",ViewerCfg.MapsPath.c_str());
fprintf(f,"FontPath = \"%s\";\n",ViewerCfg.FontPath.c_str());
fprintf(f,"HeightFieldName = \"%s\";\n", ViewerCfg.HeightFieldName.c_str());
fprintf(f,"HeightFieldMaxZ = %f;\n", ViewerCfg.HeightFieldMaxZ);
fprintf(f,"HeightFieldOriginX = %f;\n", ViewerCfg.HeightFieldOriginX);
fprintf(f,"HeightFieldOriginY = %f;\n", ViewerCfg.HeightFieldOriginY);
fprintf(f,"HeightFieldSizeX = %f;\n", ViewerCfg.HeightFieldSizeX);
fprintf(f,"HeightFieldSizeY = %f;\n", ViewerCfg.HeightFieldSizeY);
fprintf(f,"LandAmbient = { %d, %d, %d };\n", ViewerCfg.LandAmbient.R,ViewerCfg.LandAmbient.G,ViewerCfg.LandAmbient.B);
fprintf(f,"LandDiffuse = { %d, %d, %d };\n", ViewerCfg.LandDiffuse.R,ViewerCfg.LandDiffuse.G,ViewerCfg.LandDiffuse.B);
fprintf(f,"Zones = {\n");
fprintf(f,"};\n");
fprintf(f,"Ig = {\n");
fprintf(f,"};\n");
fclose(f);
}
/****************************************************************\
init()
\****************************************************************/
void initViewerConfig(const char * configFileName)
{
FILE * f = fopen(configFileName,"rt");
if(f==NULL)
{
nlwarning("'%s' not found, default values used", configFileName);
writeConfigFile(configFileName);
}
else fclose (f);
try
{
CConfigFile cf;
cf.load(configFileName);
CConfigFile::CVar &cvFullScreen = cf.getVar("FullScreen");
ViewerCfg.Windowed = cvFullScreen.asInt() ? false : true;
CConfigFile::CVar &cvWidth = cf.getVar("Width");
ViewerCfg.Width = cvWidth.asInt();
CConfigFile::CVar &cvHeight = cf.getVar("Height");
ViewerCfg.Height = cvHeight.asInt();
CConfigFile::CVar &cvDepth = cf.getVar("Depth");
ViewerCfg.Depth = cvDepth.asInt();
CConfigFile::CVar &cvPosition = cf.getVar("Position");
nlassert(cvPosition.size()==3);
ViewerCfg.Position.x = cvPosition.asFloat(0);
ViewerCfg.Position.y = cvPosition.asFloat(1);
ViewerCfg.Position.z = cvPosition.asFloat(2);
CConfigFile::CVar &cvEyesHeight = cf.getVar("EyesHeight");
ViewerCfg.EyesHeight = CVector(0,0,cvEyesHeight.asFloat());
CConfigFile::CVar &cvBackColor = cf.getVar("Background");
nlassert(cvBackColor.size()==3);
ViewerCfg.Background.R = cvBackColor.asInt(0);
ViewerCfg.Background.G = cvBackColor.asInt(1);
ViewerCfg.Background.B = cvBackColor.asInt(2);
CConfigFile::CVar &cvZFar = cf.getVar("ZFar");
ViewerCfg.ZFar = cvZFar.asFloat();
CConfigFile::CVar &cvAutoLight = cf.getVar("AutoLight");
ViewerCfg.AutoLight = cvAutoLight.asInt() ? true : false;
CConfigFile::CVar &cvLightDir = cf.getVar("LightDir");
nlassert(cvLightDir.size()==3);
ViewerCfg.LightDir.x = cvLightDir.asFloat(0);
ViewerCfg.LightDir.y = cvLightDir.asFloat(1);
ViewerCfg.LightDir.z = cvLightDir.asFloat(2);
CConfigFile::CVar &cvLandscapeTileNear = cf.getVar("LandscapeTileNear");
ViewerCfg.LandscapeTileNear = cvLandscapeTileNear.asFloat();
CConfigFile::CVar &cvLandscapeThreshold = cf.getVar("LandscapeThreshold");
ViewerCfg.LandscapeThreshold = cvLandscapeThreshold.asFloat();
CConfigFile::CVar &cvLandscapeNoise = cf.getVar("LandscapeNoise");
ViewerCfg.LandscapeNoise = cvLandscapeNoise.asInt() != 0;
CConfigFile::CVar &cvBanksPath = cf.getVar("BanksPath");
ViewerCfg.BanksPath = cvBanksPath.asString();
CConfigFile::CVar &cvTilesPath = cf.getVar("TilesPath");
ViewerCfg.TilesPath = cvTilesPath.asString();
CConfigFile::CVar &cvUseDDS = cf.getVar("UseDDS");
ViewerCfg.UseDDS = cvUseDDS.asInt() ? true : false;
CConfigFile::CVar &cvAllPathRelative = cf.getVar("AllPathRelative");
ViewerCfg.AllPathRelative = cvAllPathRelative.asInt() ? true : false;
CConfigFile::CVar &cvBank = cf.getVar("Bank");
ViewerCfg.Bank = cvBank.asString();
CConfigFile::CVar &cvZonesPath = cf.getVar("ZonesPath");
ViewerCfg.ZonesPath = cvZonesPath.asString();
CPath::addSearchPath(cvZonesPath.asString());
CConfigFile::CVar &cvIgPath = cf.getVar("IgPath");
ViewerCfg.IgPath = cvIgPath.asString();
CPath::addSearchPath(cvIgPath.asString());
CConfigFile::CVar &cvShapePath = cf.getVar("ShapePath");
ViewerCfg.ShapePath = cvShapePath.asString();
CPath::addSearchPath(cvShapePath.asString());
CConfigFile::CVar &cvMapsPath = cf.getVar("MapsPath");
ViewerCfg.MapsPath = cvMapsPath.asString();
CPath::addSearchPath(cvMapsPath.asString());
CConfigFile::CVar &cvFontPath = cf.getVar("FontPath");
ViewerCfg.FontPath = cvFontPath.asString();
CConfigFile::CVar &cvHeightFieldName = cf.getVar("HeightFieldName");
ViewerCfg.HeightFieldName = cvHeightFieldName.asString();
CConfigFile::CVar &cvHeightFieldMaxZ = cf.getVar("HeightFieldMaxZ");
ViewerCfg.HeightFieldMaxZ = cvHeightFieldMaxZ.asFloat();
CConfigFile::CVar &cvHeightFieldOriginX = cf.getVar("HeightFieldOriginX");
ViewerCfg.HeightFieldOriginX = cvHeightFieldOriginX.asFloat();
CConfigFile::CVar &cvHeightFieldOriginY = cf.getVar("HeightFieldOriginY");
ViewerCfg.HeightFieldOriginY = cvHeightFieldOriginY.asFloat();
CConfigFile::CVar &cvHeightFieldSizeX = cf.getVar("HeightFieldSizeX");
ViewerCfg.HeightFieldSizeX = cvHeightFieldSizeX.asFloat();
CConfigFile::CVar &cvHeightFieldSizeY = cf.getVar("HeightFieldSizeY");
ViewerCfg.HeightFieldSizeY = cvHeightFieldSizeY.asFloat();
CConfigFile::CVar &cvLandAmb = cf.getVar("LandAmbient");
nlassert(cvLandAmb.size()==3);
ViewerCfg.LandAmbient.R = cvLandAmb.asInt(0);
ViewerCfg.LandAmbient.G = cvLandAmb.asInt(1);
ViewerCfg.LandAmbient.B = cvLandAmb.asInt(2);
CConfigFile::CVar &cvLandDiff = cf.getVar("LandDiffuse");
nlassert(cvLandDiff.size()==3);
ViewerCfg.LandDiffuse.R = cvLandDiff.asInt(0);
ViewerCfg.LandDiffuse.G = cvLandDiff.asInt(1);
ViewerCfg.LandDiffuse.B = cvLandDiff.asInt(2);
CConfigFile::CVar &cvZones = cf.getVar("Zones");
for(uint i=0; i<cvZones.size(); i++)
{
ViewerCfg.Zones.push_back(cvZones.asString(i));
}
CConfigFile::CVar &cvIgs = cf.getVar("Ig");
for(uint i=0; i<cvIgs.size(); i++)
{
ViewerCfg.Igs.push_back(cvIgs.asString(i));
}
}
catch (EConfigFile &e)
{
printf ("Problem in config file : %s\n", e.what ());
}
}
/****************************************************************\
MAIN
\****************************************************************/
void main()
{
try
{
// Init NELU
NL3D::CNELU::init(ViewerCfg.Width, ViewerCfg.Height, CViewport(), ViewerCfg.Depth, ViewerCfg.Windowed, NULL, false, false);
NL3D::CNELU::Camera->setTransformMode(ITransformable::DirectMatrix);
// Init the font manager
initViewerConfig("zviewer.cfg");
ViewerCfg.TextContext.init (CNELU::Driver, &ViewerCfg.FontManager);
ViewerCfg.TextContext.setFontGenerator(ViewerCfg.FontPath);
ViewerCfg.TextContext.setFontSize(12);
ViewerCfg.FontManager.setMaxMemory(2000000);
displayZones();
// release nelu
NL3D::CNELU::release();
}
catch (Exception &e)
{
fprintf (stderr,"main trapped an exception: '%s'", e.what ());
}
}

View file

@ -1,72 +0,0 @@
// Microsoft Visual C++ generated resource script.
//
#include "resource.h"
#define APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 2 resource.
//
#include <windows.h>
/////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
// English (U.S.) resources
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
#ifdef _WIN32
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
#pragma code_page(1252)
#endif //_WIN32
#ifdef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// TEXTINCLUDE
//
1 TEXTINCLUDE
BEGIN
"resource.h\0"
END
2 TEXTINCLUDE
BEGIN
"#include ""afxres.h""\r\n"
"\0"
END
3 TEXTINCLUDE
BEGIN
"\r\n"
"\0"
END
#endif // APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Icon
//
// Icon with lowest ID value placed first to ensure application icon
// remains consistent on all systems.
IDI_ICON1 ICON "nevraxpill.ico"
#endif // English (U.S.) resources
/////////////////////////////////////////////////////////////////////////////
#ifndef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 3 resource.
//
/////////////////////////////////////////////////////////////////////////////
#endif // not APSTUDIO_INVOKED

View file

@ -1,353 +0,0 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject
ProjectType="Visual C++"
Version="9.00"
Name="zviewer"
ProjectGUID="{B798D9FF-AA33-4918-8B51-1B4FA9C5160A}"
>
<Platforms>
<Platform
Name="Win32"
/>
<Platform
Name="x64"
/>
</Platforms>
<ToolFiles>
</ToolFiles>
<Configurations>
<Configuration
Name="Debug|Win32"
OutputDirectory="..\obj\$(ConfigurationName)\$(ProjectName)"
IntermediateDirectory="..\obj\$(ConfigurationName)\$(ProjectName)"
ConfigurationType="1"
CharacterSet="2"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="0"
PreprocessorDefinitions="_DEBUG;_CONSOLE"
MinimalRebuild="true"
BasicRuntimeChecks="3"
SmallerTypeCheck="true"
RuntimeLibrary="3"
WarningLevel="3"
DebugInformationFormat="3"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
OutputFile="..\bin\$(ProjectName)_d.exe"
LinkIncremental="2"
GenerateDebugInformation="true"
SubSystem="1"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
<Configuration
Name="Debug|x64"
OutputDirectory="..\obj64\$(ConfigurationName)\$(ProjectName)"
IntermediateDirectory="..\obj64\$(ConfigurationName)\$(ProjectName)"
ConfigurationType="1"
UseOfMFC="0"
ATLMinimizesCRunTimeLibraryUsage="false"
CharacterSet="2"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="0"
PreprocessorDefinitions="_DEBUG;_CONSOLE"
MinimalRebuild="true"
BasicRuntimeChecks="3"
SmallerTypeCheck="true"
RuntimeLibrary="3"
WarningLevel="3"
DebugInformationFormat="3"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
OutputFile="..\bin64\$(ProjectName)_d.exe"
LinkIncremental="2"
IgnoreDefaultLibraryNames="msvcrt.lib"
GenerateDebugInformation="true"
SubSystem="1"
TargetMachine="17"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
<Configuration
Name="Release|Win32"
OutputDirectory="..\obj\$(ConfigurationName)\$(ProjectName)"
IntermediateDirectory="..\obj\$(ConfigurationName)\$(ProjectName)"
ConfigurationType="1"
UseOfMFC="0"
ATLMinimizesCRunTimeLibraryUsage="false"
CharacterSet="2"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="3"
InlineFunctionExpansion="2"
EnableIntrinsicFunctions="true"
FavorSizeOrSpeed="1"
OmitFramePointers="true"
EnableFiberSafeOptimizations="true"
PreprocessorDefinitions="NDEBUG;_CONSOLE"
StringPooling="true"
RuntimeLibrary="2"
WarningLevel="3"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
OutputFile="..\bin\$(ProjectName)_r.exe"
LinkIncremental="1"
SubSystem="1"
OptimizeReferences="2"
EnableCOMDATFolding="2"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
<Configuration
Name="Release|x64"
OutputDirectory="..\obj64\$(ConfigurationName)\$(ProjectName)"
IntermediateDirectory="..\obj64\$(ConfigurationName)\$(ProjectName)"
ConfigurationType="1"
CharacterSet="2"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="3"
InlineFunctionExpansion="2"
EnableIntrinsicFunctions="true"
FavorSizeOrSpeed="1"
OmitFramePointers="true"
EnableFiberSafeOptimizations="true"
PreprocessorDefinitions="NDEBUG;_CONSOLE"
StringPooling="true"
RuntimeLibrary="2"
WarningLevel="3"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
OutputFile="..\bin64\$(ProjectName)_r.exe"
LinkIncremental="1"
SubSystem="1"
OptimizeReferences="2"
EnableCOMDATFolding="2"
TargetMachine="17"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
</Configurations>
<References>
</References>
<Files>
<File
RelativePath="move_listener.cpp"
>
</File>
<File
RelativePath="move_listener.h"
>
</File>
<File
RelativePath="nevraxpill.ico"
>
</File>
<File
RelativePath="resource.h"
>
</File>
<File
RelativePath="zviewer.cfg"
>
</File>
<File
RelativePath="zviewer.cpp"
>
</File>
<File
RelativePath=".\zviewer.rc"
>
</File>
</Files>
<Globals>
</Globals>
</VisualStudioProject>