Hi!
I'm use CS version 0.99 now and modified my program a little. It's load the shading and material information from a file. But the wall and sprite creation remain in the program. I can see the wall and the sprite, but I can't see any shadow:-(. I think I have to turn on something. But what?
Greetings,
Miki
//ez mindig az elso, es mindig a cppben kell lennie #include "VR.h"
CS_IMPLEMENT_APPLICATION
//Globalis mutato az alkalmazasra
VR::VR ()
{
SetApplicationName ("CrystalSpace.VR");
}
VR::~VR ()
{
}
bool VR::OnKeyboard (iEvent &ev)
{
csKeyEventType eventtype = csKeyEventHelper::GetEventType(&ev);
if (eventtype == csKeyEventTypeDown)
{
utf32_char code = csKeyEventHelper::GetCookedCode(&ev);
if (code == CSKEY_ESC)
{
csRef<iEventQueue> q =
CS_QUERY_REGISTRY(GetObjectRegistry(), iEventQueue);
if (q.IsValid())
q->GetEventOutlet()->Broadcast(cscmdQuit);
}
}
return false;
}
bool VR::OnInitialize (int argc, char* argv[])
{
if (!csInitializer::RequestPlugins (GetObjectRegistry (),
CS_REQUEST_VFS,
CS_REQUEST_OPENGL3D,
CS_REQUEST_ENGINE,
CS_REQUEST_FONTSERVER,
CS_REQUEST_IMAGELOADER,
CS_REQUEST_LEVELLOADER,
CS_REQUEST_REPORTER,
CS_REQUEST_REPORTERLISTENER,
CS_REQUEST_END))
return ReportError("Failed to initialize plugins!");
//Esemenykezelo inicializalasa
if (!RegisterQueue(GetObjectRegistry()))
return ReportError("Failed to set up event handler!");
//van-e parancssori help
if (csCommandLineHelper::CheckHelp (object_reg))
{
csCommandLineHelper::Help(object_reg);
return false;
}
return true;
}
bool VR::Application () {
//A fo rendszer betoltese. Megynitja az osszes korabban betoltott
plugint
if (!OpenApplication(GetObjectRegistry()))
return ReportError("Error opening system!");
//Virtualis ora
vc = CS_QUERY_REGISTRY(GetObjectRegistry(), iVirtualClock);
if (!vc) return ReportError("Failed to locate Virtual Clock!");
g3d = CS_QUERY_REGISTRY(GetObjectRegistry(), iGraphics3D);
if (!g3d) return ReportError("Failed to locate 3D renderer!");
//Az Enginere mutato pointer megkeresese
engine = CS_QUERY_REGISTRY(GetObjectRegistry(), iEngine);
if (!engine) return ReportError("Failed to locate 3D engine!");
loader = CS_QUERY_REGISTRY(GetObjectRegistry(), iLoader);
if (!loader) return ReportError("Failed to locate Loader!");
kbd = CS_QUERY_REGISTRY(GetObjectRegistry(), iKeyboardDriver);
if (!kbd) return ReportError("Failed to locate Keyboard Driver!");
csReport (object_reg, CS_REPORTER_SEVERITY_NOTIFY,
"crystalspace.application.VR",
"VR version 0.1");
//Letrehozunk egy nezetet
view.AttachNew (new csView (engine, g3d));
//A nezethez tartozik egy vagasi tartomany, mely az ablak egy
reszterulete
//Tetszoleges konvex polygon lehet
iGraphics2D* g2d = g3d->GetDriver2D ();
//A vagasi tartomany egy ablak meretu teglatest
view->SetRectangle (0, 0, g2d->GetWidth (), g2d->GetHeight ());
//A vialgitas cacheelesenek kikapcsolasa.
//Eleg egyszeru az app ahhoz, hogy ezt megtehessuk
//Ha pl. terkepfjlbol olasnank be, akkor
//elhagynank ezt a sort.
engine->SetLightingCacheMode (0);
LoadMap();
CreateRoom () ;
CreateSprites();
//Felkeszite az engine-t a renderelesre
//Elokesziti a texturakat, es elkesziti a fenyterkepeket
//Ezutan lehet csak renderelni
engine->Prepare ();
rotY = rotX = 0;
//A nezethez tartozik egy sector
view->GetCamera ()->SetSector (room);
//A kameranak van pozicioja
view->GetCamera ()->GetTransform().SetOrigin (csVector3 (0, 5, -3));
//Meghivja a default runloopot, alpabol ez csak
//process eventeket sugaroz
Run ();
return true;
}
void VR::LoadMap () {
csRef<iVFS> vfs (CS_QUERY_REGISTRY (GetObjectRegistry(), iVFS));
// if (!vfs->Mount( "/lev/fs", "fs.zip")) ReportError("Baj van");
// Load the level file which is called 'world'.
// if (!vfs->ChDir( "/lev/fs")) ReportError("Baj van2");
if (!loader->LoadMapFile ("/lev/fs/myworld"))
{
ReportError ("Error loading 'myworld' map!");
}
}
void VR::CreateRoom () {
iMaterialWrapper *tm = engine->GetMaterialList ()->FindByName ("stone");
room = engine->CreateSector ("room");
//Gyakori a fallal korulvett sector, ezert a falak letrehozasahoz van
kulon metodus
//Ezutan meg hozza kell adni a falmesh-hez a falak polygonjait
csRef<iMeshWrapper> walls (
engine->CreateSectorWallsMesh (room, "walls"));
//A thingunk(walls) jellemzoit irja le a thing_state altal mutatott
objektum
csRef<iThingState> thing_state (
SCF_QUERY_INTERFACE (walls->GetMeshObject (), iThingState));
//A ThingState-bol megkapjuk a FactoryState-et
//Amit mar hasznalhatunk a polygonok elkeszitesere
csRef<iThingFactoryState> walls_state = thing_state->GetFactory ();
//Letrehoz egy belulrol lathato teglatestet
//AKKOR LATHATO EGY POLYGON, HA A VERTEXEI ORAIRANYBAN VANNAK
//A megadott koordinatak objektumter beliek
walls_state->AddInsideBox (
csVector3 (-5, 0, -5), csVector3 (5, 20, 5));
//A Polygonok materialjat allitja be
//A CS_POLYRANGE_LAST jelentese: az utoljara keszitett polygonokra
vonatkozik
//Jelen esetben ez az AddInsideBox-al keszitett polygonokra vonatkozik
walls_state->SetPolygonMaterial (CS_POLYRANGE_LAST, tm);
//A texturemapping-nek az egyik legegyszerubb valtozatat hasznaljuk
//Megpedig:
//Minden polygon elso ket vertexe hatarozza meg az u tengelyt
//A v tengely pedig erre meroleges lesz
//A masodik parameter azt jelenti, hogy a texture at lesz meretezve
//Jelen esetben egy texturalap 3*3as lesz a vilag koordinatarendszerben
walls_state->SetPolygonTextureMapping (CS_POLYRANGE_LAST, 3);
//Egy fenyforrast reprezentalo interface
csRef<iLight> light;
//A fenyforrasok listaja
iLightList* ll = room->GetLights ();
//Statikus, mozgasra keptelen, konstans intenzitasu lampakat hozunk
letre
//P 1: a fenyforras neve, altalaban nem hasznaljuk, ezert 0
//P 2: a fenyforras pozicioja
//P 3: a fenyforras hatasanak sugara
//P 4: a fenyforras szine
//P 5: itt nem hasznalt. Azt hatarozza meg, hogy pszeudodinamikus
legyen a fenyforras vagy nem
// alapesetben nem pszeudodinamikus a fenyforras, azaz nem
tud intenzitast valtoztatni
/* light = engine->CreateLight (0, csVector3 (-3, 5, 0), 10,
csColor (1, 0, 0));
ll->Add (light);
light = engine->CreateLight (0, csVector3 (3, 5, 0), 10,
csColor (0, 0, 1));
ll->Add (light);
light = engine->CreateLight (0, csVector3 (0, 5, -3), 10,
csColor (0, 1, 0));
ll->Add (light);
*/
//Hozzaadok meg egy lampat, mert azt akarom, hogy az objektumom
arnyekot vessen
light = engine->CreateLight (0, csVector3 (-3, 10, 0), 20,
csColor (1, 1, 1));
ll->Add (light);
csRef<iLight> statuelight = engine->CreateLight ("statuelight",
csVector3 (-4.7f, 1.0f, 5.5f), 4, csColor(1.2f,0.2f,0.2f));
statuelight->CreateNovaHalo (1278, 15, 0.3f);
ll->Add (statuelight);
}
//2 reszre osztjuk a kirajzolast azert, mert a megjelenites elott
//igy lehetoseg nyilik a renderelt kepre rajzloni ha az szukseges
//Amikor egy framet renderelni kell, a CrystalSpace keretrendszer 4 uzenetet
kuld
//cscmdPreProcess
//cscmdProcess
//cscmdPostProcess
//cscmdFinalProcess
//1. resz: A renderelt kep elkeszitese
void VR::CreateSprites () {
//Betoltjuk a sprite sablont a lemezrol
csRef<iMeshFactoryWrapper> imeshfact (loader->LoadMeshObjectFactory (
"/lib/std/sprite1"));
if (imeshfact == 0)
ReportError ("Error loading 'sprite1' sprite!");
//Hozzaadjuk a spriteot az enginehez
csRef<iMeshWrapper> sprite (engine->CreateMeshWrapper (
imeshfact, "MySprite", room,
csVector3 (-3, 5, 3)));
csMatrix3 m;
m.Identity ();
//5-szorosere noveljuk az objektum meretet, maskor ne igy tegyuk
//mert az utkozesdetektalas es a lathatosagi vagas nem mukodik helyesen
//az atmeretezett objektummal
//Helyette a HardTransform () hasznalata javasolt
m *= .5;
sprite->GetMovable ()->SetTransform (m);
sprite->GetMovable ()->UpdateMove ();
//A mesh vizualis attributumainak beallitasa
//A SetAction fugvennyel az animacios frameket lehetne definialni
//Jelen esetben 1 frame van, ezert a default action-t allitjuk be
csRef<iSprite3DState> spstate (
SCF_QUERY_INTERFACE (sprite->GetMeshObject (), iSprite3DState));
spstate->SetAction ("default");
//A Z-Buffer hasznalati modjanak beallitasa, jelen esetben teljes
hasznalat
//CS_ZBUF_FILL pl. egy sector kulso falaihoz ajanlott
sprite->SetZBufMode ( CS_ZBUF_USE);
//Megmondjuk, hogy mikor renderelodjon az objektum a kepre
//4 alapprioritas van: `sky', `wall', `object', es `alpha'
//Lehet csinalni sajatokat is
//Az object a default
sprite->SetRenderPriority (engine->GetObjectRenderPriority ());
}
void VR::ProcessFrame ()
{
//Csak hogy lassam, itt megszerzem a spriteom adatait
//es bevezetek ra egy mozgatast a WASD billentyukombinaciokkal
csRef<iMeshWrapper> sprite (engine->FindMeshObject ("MySprite"));
//Lekerjuk a virtualis oratol az eltelt idot
csTicks elapsed_time = vc->GetElapsedTicks ();
//Elforgatjuk a kamerat a billentyuzet allapotanak megfeleloen
float speed = (elapsed_time / 1000.0) * (0.06 * 20);
iCamera* c = view->GetCamera();
if (kbd->GetKeyState (CSKEY_SHIFT))
{
// Ha a SHIFT lenyomva akkor Strafe uzemmod
if (kbd->GetKeyState (CSKEY_RIGHT))
c->Move (CS_VEC_RIGHT * 4 * speed);
if (kbd->GetKeyState (CSKEY_LEFT))
c->Move (CS_VEC_LEFT * 4 * speed);
if (kbd->GetKeyState (CSKEY_UP))
c->Move (CS_VEC_UP * 4 * speed);
if (kbd->GetKeyState (CSKEY_DOWN))
c->Move (CS_VEC_DOWN * 4 * speed);
}
else
{
// left and right cause the camera to rotate on the global Y
// axis; page up and page down cause the camera to rotate on the
// _camera's_ X axis (more on this in a second) and up and down
// arrows cause the camera to go forwards and backwards.
if (kbd->GetKeyState (CSKEY_RIGHT))
rotY += speed;
if (kbd->GetKeyState (CSKEY_LEFT))
rotY -= speed;
if (kbd->GetKeyState (CSKEY_PGUP))
rotX += speed;
if (kbd->GetKeyState (CSKEY_PGDN))
rotX -= speed;
if (kbd->GetKeyState (CSKEY_UP))
c->Move (CS_VEC_FORWARD * 4 * speed);
if (kbd->GetKeyState (CSKEY_DOWN))
c->Move (CS_VEC_BACKWARD * 4 * speed);
//Az objektum mozgatasa
if (kbd->GetKeyState (119))
sprite->GetMovable()->MovePosition(CS_VEC_FORWARD * 4 * speed);
sprite->GetMovable()->UpdateMove();
if (kbd->GetKeyState (97))
sprite->GetMovable()->MovePosition(CS_VEC_LEFT * 4 * speed);
//sprite->GetMovable()->UpdateMove();
if (kbd->GetKeyState (115))
sprite->GetMovable()->MovePosition(CS_VEC_BACKWARD * 4 * speed);
sprite->GetMovable()->UpdateMove();
if (kbd->GetKeyState (100))
sprite->GetMovable()->MovePosition(CS_VEC_RIGHT * 4 * speed);
sprite->GetMovable()->UpdateMove();
}
// We now assign a new rotation transformation to the camera. You
// can think of the rotation this way: starting from the zero
// position, you first rotate "rotY" radians on your Y axis to get
// the first rotation. From there you rotate "rotX" radians on the
// your X axis to get the final rotation. We multiply the
// individual rotations on each axis together to get a single
// rotation matrix. The rotations are applied in right to left
// order .
csMatrix3 rot = csXRotMatrix3 (rotX) * csYRotMatrix3 (rotY);
csOrthoTransform ot (rot, c->GetTransform().GetOrigin ());
c->SetTransform (ot);
//Megmondjuk a drivernek, hogy 3Ds dolgokat fogunk megjeleniteni
if (!g3d->BeginDraw(
engine->GetBeginDrawFlags() | CSDRAW_3DGRAPHICS))
return;
//Megmondjuk a kameranak, hogy renderelje a framebufferbe
//Barmi egyeb rajzolast is elvegezetunk itt
view->Draw ();
}
//2. resz: Kirajzolas
void VR::FinishFrame ()
{
g3d->FinishDraw ();
g3d->Print (0);
}
void VR::OnExit()
{
}
//Main metódus
int main (int argc, char* argv[])
{
return csApplicationRunner<VR>::Run (argc, argv);
}
<!-- This file was generated from c:/Transfer/blender/isotest.blend with blend2cs 0.2.4 --> <!-- http://projects.blender.org/projects/blend2cs --> <world> <addon> <plugin>crystalspace.renderloop.loop.loader</plugin> <paramsfile>/shader/std_rloop_shadowed.xml</paramsfile> </addon> <settings> <clearzbuf>yes</clearzbuf> <clearscreen>yes</clearscreen> <lightmapcellsize>16</lightmapcellsize> <renderloop>std_rloop_shadowed</renderloop> </settings> <plugins> <plugin name="thing">crystalspace.mesh.loader.thing</plugin> <plugin name="null">crystalspace.mesh.loader.null</plugin> <plugin name="genmesh">crystalspace.mesh.loader.genmesh</plugin> <plugin name="sprite3d">crystalspace.mesh.loader.sprite.3d</plugin> <plugin name="thingfact">crystalspace.mesh.loader.factory.thing</plugin> <plugin name="genmeshfact">crystalspace.mesh.loader.factory.genmesh</plugin> </plugins> <textures> <texture name="stone"> <file>"/lib/std/stone4.gif"</file> </texture> <texture name="spark"> <file>/lib/stdtex/spark.png</file> </texture> </textures> <shaders> <shader><file>/shader/ambient.xml</file></shader> <shader><file>/shader/light.xml</file></shader> <shader><file>/shader/light_bumpmap.xml</file></shader> <shader><file>/shader/parallax/parallax.xml</file></shader> </shaders> <materials> <material name="stone"> <texture>stone</texture> <shader type="ambient">ambient</shader> <shader type="diffuse">light</shader> </material> <material name="spark"> <texture>spark</texture> <shader type="ambient">ambient</shader> <shader type="diffuse">light</shader> </material> </materials> </world>
