Thread: [cgkit-commits] cgkit2/wrappers/ogre MyListener.h,1.2,1.3 OgreCore.cpp,1.2,1.3 OgreCore.h,1.2,1.3 Og
Brought to you by:
mbaas
From: ocil <oc...@us...> - 2004-12-17 12:05:58
|
Update of /cvsroot/cgkit/cgkit2/wrappers/ogre In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv19143/wrappers/ogre Modified Files: MyListener.h OgreCore.cpp OgreCore.h OgreWrap.cpp Log Message: imporved linux compile - define needed makros in your config.cfg *** improved 3ds file rendering. still some crashes uner linux / openGL *** shadow technique now "additive" - more passes needed (cpu overhead!), better with mutliple light sources *** calculated normals now smoothed - bad with boxes, good with round shapes. best is to assign normals manually per-vertex! Index: OgreWrap.cpp =================================================================== RCS file: /cvsroot/cgkit/cgkit2/wrappers/ogre/OgreWrap.cpp,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** OgreWrap.cpp 13 Dec 2004 10:51:22 -0000 1.2 --- OgreWrap.cpp 17 Dec 2004 12:05:48 -0000 1.3 *************** *** 1,3 **** ! /*====================================================================== Fast Ogre Rendering For CGKIT (FORC) Copyright (C) 2004 Ole Ciliox (ol...@ir...) --- 1,3 ---- ! /*====================================================================== Fast Ogre Rendering For CGKIT (FORC) Copyright (C) 2004 Ole Ciliox (ol...@ir...) *************** *** 20,24 **** ======================================================================*/ ! #include <boost/python.hpp> #include "worldobject.h" #include "OgreCore.h" --- 20,24 ---- ======================================================================*/ ! #include <boost/python.hpp> #include "worldobject.h" #include "OgreCore.h" Index: OgreCore.h =================================================================== RCS file: /cvsroot/cgkit/cgkit2/wrappers/ogre/OgreCore.h,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** OgreCore.h 13 Dec 2004 10:51:22 -0000 1.2 --- OgreCore.h 17 Dec 2004 12:05:48 -0000 1.3 *************** *** 53,56 **** --- 53,58 ---- using namespace Ogre; + using namespace std; + // using namespace support3d; // tststststs! *************** *** 103,107 **** boost::python::list pumpKeyUps(); boost::python::list pumpMouseButtons(); ! std::vector<OgreDependent*> dependents; private: MyMouseListener* moti; --- 105,109 ---- boost::python::list pumpKeyUps(); boost::python::list pumpMouseButtons(); ! vector<OgreDependent*> dependents; private: MyMouseListener* moti; *************** *** 111,117 **** int k; char* buffer; ! std::string myString; ! std::string myStringLight; ! std::string myMaterialName; Mesh *myMesh; Viewport* vp; --- 113,119 ---- int k; char* buffer; ! string myString; ! string myStringLight; ! string myMaterialName; Mesh *myMesh; Viewport* vp; *************** *** 119,122 **** --- 121,125 ---- Resource * myMaterial; //Entity * ent; + bool shadowsEnabled; Light* myLight; Root *root; Index: MyListener.h =================================================================== RCS file: /cvsroot/cgkit/cgkit2/wrappers/ogre/MyListener.h,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** MyListener.h 13 Dec 2004 10:51:21 -0000 1.2 --- MyListener.h 17 Dec 2004 12:05:48 -0000 1.3 *************** *** 92,97 **** void keyPressed(KeyEvent* e) { - //cout << "Key pressed!" << endl; - pressedCount++; --- 92,95 ---- *************** *** 100,104 **** if( pressedCount > MAX_KEYDOWNS ) { ! cout << "temporary queue full" << endl; return; } --- 98,102 ---- if( pressedCount > MAX_KEYDOWNS ) { ! //cout << "temporary queue full" << endl; return; } *************** *** 145,149 **** if( releasedCount > MAX_KEYUPS ) { ! cout << "temporary queue full" << endl; return; } --- 143,147 ---- if( releasedCount > MAX_KEYUPS ) { ! //cout << "temporary queue full" << endl; return; } Index: OgreCore.cpp =================================================================== RCS file: /cvsroot/cgkit/cgkit2/wrappers/ogre/OgreCore.cpp,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** OgreCore.cpp 13 Dec 2004 10:51:21 -0000 1.2 --- OgreCore.cpp 17 Dec 2004 12:05:48 -0000 1.3 *************** *** 1,5 **** /*====================================================================== ! Fast Ogre Rendering For CGKIT (FORC) ! Copyright (C) 2004 Ole Ciliox (ol...@ir...) This library is free software; you can redistribute it and/or --- 1,5 ---- /*====================================================================== ! Fast Ogre Rendering For CGKIT (FORC) ! Copyright (C) 2004 Ole Ciliox (ol...@ir...) This library is free software; you can redistribute it and/or *************** *** 206,215 **** // TODO (DEZ 2004): DER VISIBLE FLAG WIRD NICHT ALS DEPENDENT BEHANDELT, ÜBERALL ANPASSEN! ! for ( unsigned int h=0; h < dependents.size(); h++) { // / / / / / / / D E R K A M E R A F A L L / / / / / / // if (dependents[h]->isCamera == true) { ! (dependents[h]->transi->transform).removeDependent(dependents[h]); } --- 206,217 ---- // TODO (DEZ 2004): DER VISIBLE FLAG WIRD NICHT ALS DEPENDENT BEHANDELT, ÜBERALL ANPASSEN! ! unsigned int h=0; ! for ( h=0; h < dependents.size(); h++) { // / / / / / / / D E R K A M E R A F A L L / / / / / / // if (dependents[h]->isCamera == true) { ! cout << "FORC: Removing Camera" << endl; ! (dependents[h]->transi->transform).removeDependent(dependents[h]); } *************** *** 217,223 **** else if (dependents[h]->isDistantLight == true) { ! (dependents[h]->transi->transform).removeDependent(dependents[h]); ( static_cast<support3d::GLDistantLight*>(dependents[h]->transi) )->enabled.removeDependent(dependents[h]); ! ( static_cast<support3d::GLDistantLight*>(dependents[h]->transi) )->intensity.removeDependent(dependents[h]); ( static_cast<support3d::GLDistantLight*>(dependents[h]->transi) )->diffuse.removeDependent(dependents[h]); ( static_cast<support3d::GLDistantLight*>(dependents[h]->transi) )->specular.removeDependent(dependents[h]); --- 219,226 ---- else if (dependents[h]->isDistantLight == true) { ! cout << "FORC: Removing DistantLight" << endl; ! (dependents[h]->transi->transform).removeDependent(dependents[h]); ( static_cast<support3d::GLDistantLight*>(dependents[h]->transi) )->enabled.removeDependent(dependents[h]); ! ( static_cast<support3d::LightSource*>( dependents[h]->transi) )->intensity.removeDependent(dependents[h]); ( static_cast<support3d::GLDistantLight*>(dependents[h]->transi) )->diffuse.removeDependent(dependents[h]); ( static_cast<support3d::GLDistantLight*>(dependents[h]->transi) )->specular.removeDependent(dependents[h]); *************** *** 226,232 **** else if (dependents[h]->isSpotLight == true) { ! (dependents[h]->transi->transform).removeDependent(dependents[h]); ( static_cast<support3d::GLSpotLight*>(dependents[h]->transi) )->enabled.removeDependent(dependents[h]); ! ( static_cast<support3d::GLSpotLight*>(dependents[h]->transi) )->intensity.removeDependent(dependents[h]); ( static_cast<support3d::GLSpotLight*>(dependents[h]->transi) )->diffuse.removeDependent(dependents[h]); ( static_cast<support3d::GLSpotLight*>(dependents[h]->transi) )->specular.removeDependent(dependents[h]); --- 229,236 ---- else if (dependents[h]->isSpotLight == true) { ! cout << "FORC: Removing SpotLight" << endl; ! (dependents[h]->transi->transform).removeDependent(dependents[h]); ( static_cast<support3d::GLSpotLight*>(dependents[h]->transi) )->enabled.removeDependent(dependents[h]); ! ( static_cast<support3d::LightSource*>( dependents[h]->transi) )->intensity.removeDependent(dependents[h]); ( static_cast<support3d::GLSpotLight*>(dependents[h]->transi) )->diffuse.removeDependent(dependents[h]); ( static_cast<support3d::GLSpotLight*>(dependents[h]->transi) )->specular.removeDependent(dependents[h]); *************** *** 242,248 **** else if (dependents[h]->isPointLight == true) { ! (dependents[h]->transi->transform).removeDependent(dependents[h]); ( static_cast<support3d::GLPointLight*>(dependents[h]->transi) )->enabled.removeDependent(dependents[h]); ! ( static_cast<support3d::GLPointLight*>(dependents[h]->transi) )->intensity.removeDependent(dependents[h]); ( static_cast<support3d::GLPointLight*>(dependents[h]->transi) )->diffuse.removeDependent(dependents[h]); ( static_cast<support3d::GLPointLight*>(dependents[h]->transi) )->specular.removeDependent(dependents[h]); --- 246,253 ---- else if (dependents[h]->isPointLight == true) { ! cout << "FORC: Removing PointLight" << endl; ! (dependents[h]->transi->transform).removeDependent(dependents[h]); ( static_cast<support3d::GLPointLight*>(dependents[h]->transi) )->enabled.removeDependent(dependents[h]); ! ( static_cast<support3d::LightSource*>( dependents[h]->transi) )->intensity.removeDependent(dependents[h]); ( static_cast<support3d::GLPointLight*>(dependents[h]->transi) )->diffuse.removeDependent(dependents[h]); ( static_cast<support3d::GLPointLight*>(dependents[h]->transi) )->specular.removeDependent(dependents[h]); *************** *** 256,271 **** else { ! (dependents[h]->transi->transform).removeDependent(dependents[h]); } //dependents[h]->removeDependent(); delete dependents[h]; } delete moti; delete listi; delete buti; ! cout << "*** Starting OGE Shutdown" << endl; if (root != 0) { --- 261,280 ---- else { ! cout << "FORC: Removing misc. dependent" << endl; ! (dependents[h]->transi->transform).removeDependent(dependents[h]); } //dependents[h]->removeDependent(); + delete dependents[h]; + cout << "FORC: ...deleted" << endl; } + cout << "FORC: Removing event handler" << endl; delete moti; delete listi; delete buti; ! //cout << "*** Starting OGE Shutdown" << endl; if (root != 0) { *************** *** 274,278 **** delete root; } ! cout << "*** SHUTDOWN COMPLETE" << endl; } --- 283,287 ---- delete root; } ! cout << "FORC: Finished" << endl; } *************** *** 543,547 **** { // TODO: implement efficient search ! for ( unsigned int i=0; i < dependents.size(); i++) { if ( dependents[i]->transi == &fatherObject ) // TODO: CHECK THE "&" --- 552,557 ---- { // TODO: implement efficient search ! unsigned int i=0; ! for ( i=0; i < dependents.size(); i++) { if ( dependents[i]->transi == &fatherObject ) // TODO: CHECK THE "&" *************** *** 871,876 **** // ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ! // FALL < 2 > es ist eine Lichtquelle ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; // ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; else if (dynamic_cast<support3d::LightSource*>( childit->second.get()) != 0) { --- 881,887 ---- // ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ! // FALL < 2 > Es ist eine Lichtquelle ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; // ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + else if (dynamic_cast<support3d::LightSource*>( childit->second.get()) != 0) { *************** *** 879,882 **** --- 890,901 ---- support3d::GLPointLight* tmpPoint; support3d::GLSpotLight* tmpSpot; + + tmpDist = dynamic_cast<support3d::GLDistantLight*>( childit->second.get()); + tmpPoint = dynamic_cast<support3d::GLPointLight*>( childit->second.get()); + tmpSpot = dynamic_cast<support3d::GLSpotLight*>( childit->second.get()); + + if (!tmpDist && !tmpPoint && !tmpSpot) + break; // aus diesem if-fall rausgehen, denn kein unterstütztes Licht + tmpSource = static_cast<support3d::LightSource*>( childit->second.get()); bool isDistantLight = false; *************** *** 889,893 **** OgreDependent* testdependent = new OgreDependent( tmpSource, msnode ); ! tmpDist = dynamic_cast<support3d::GLDistantLight*>( childit->second.get()); if (tmpDist != 0) // es ist ein DISTANTLIGHT (also nur direction) { --- 908,913 ---- OgreDependent* testdependent = new OgreDependent( tmpSource, msnode ); ! // 13.DEZ.2004.***TODO***: DOPPELTE ABFRAGEN INEFFIZIENT! ! if (tmpDist != 0) // es ist ein DISTANTLIGHT (also nur direction) { *************** *** 895,908 **** //testdependent->isDistantLight = true; } ! tmpPoint = dynamic_cast<support3d::GLPointLight*>( childit->second.get()); ! if (tmpPoint != 0) // es ist ein POINTLIGHT (also nur position) { isPointLight = true; //testdependent->isPointLight = true; } ! tmpSpot = dynamic_cast<support3d::GLSpotLight*>( childit->second.get()); ! if (tmpSpot != 0) // es ist ein SPOTLIGHT (also jede menge Schnickschnack) { - // es ist ein SpotLight -> also else-Fall isSpotLight = true; //testdependent->isSpotLight = true; --- 915,926 ---- //testdependent->isDistantLight = true; } ! else if (tmpPoint != 0) // es ist ein POINTLIGHT (also nur position) { isPointLight = true; //testdependent->isPointLight = true; } ! ! else if (tmpSpot != 0) // es ist ein SPOTLIGHT (also jede menge Schnickschnack) { isSpotLight = true; //testdependent->isSpotLight = true; *************** *** 914,924 **** msnode->attachObject(myLight); ! // DAS HERZ dieses if-Teils: um den hier gehts überhaupt ! cout << "light detected" << endl; ! testdependent->nodi = msnode; // wichtig - pointer updaten ! // ganz wichtig: ! ((*childit).second->transform).addDependent(testdependent); // der erste slot! transform ! tmpSource->enabled.addDependent(testdependent); // bool-slot enabled ! tmpSource->intensity.addDependent(testdependent); // double-slot intensity if (isPointLight) --- 932,941 ---- msnode->attachObject(myLight); ! cout << "FORC: Light Detected: " << tmpSource << endl; ! testdependent->nodi = msnode; // wichtig - pointer update ! ! ((*childit).second->transform).addDependent(testdependent); ! tmpSource->enabled.addDependent(testdependent); ! tmpSource->intensity.addDependent(testdependent); if (isPointLight) *************** *** 939,945 **** testdependent->theLight->setDiffuseColour(diff.x, diff.y, diff.z); testdependent->theLight->setSpecularColour(spec.x, spec.y, spec.z); - - // the rest - } else if (isDistantLight) --- 956,959 ---- *************** *** 958,962 **** testdependent->theLight->setSpecularColour(spec.x, spec.y, spec.z); } ! else // isSpotLight { myLight->setType( Ogre::Light::LT_SPOTLIGHT ); --- 972,976 ---- testdependent->theLight->setSpecularColour(spec.x, spec.y, spec.z); } ! else if (isSpotLight) { myLight->setType( Ogre::Light::LT_SPOTLIGHT ); *************** *** 987,990 **** --- 1001,1005 ---- // FALL < 3 > z.B. ein leeres vaterobjekt ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; // ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + else { *************** *** 1019,1024 **** if (msnode != 0) { ! //if ( (childit->second).get() != 0) ! buildTree( *(childit->second), msnode); } --- 1034,1039 ---- if (msnode != 0) { ! //if ( (childit->second).get() != 0) ! buildTree( *(childit->second), msnode); } *************** *** 1034,1038 **** boost::python::list li; // for KEY PRESSES ! for (int i=0; i < listi->pressedCount; i++) { li.append( listi->keyCharList[i] ); --- 1049,1054 ---- boost::python::list li; // for KEY PRESSES ! int i=0; ! for (i=0; i < listi->pressedCount; i++) { li.append( listi->keyCharList[i] ); *************** *** 1070,1074 **** boost::python::list li; // for MOUSE PRESSES/RELEASES ! for (int i=0; i < buti->mouseCount; i++) { li.append( buti->mouseButtonList[i] ); --- 1086,1091 ---- boost::python::list li; // for MOUSE PRESSES/RELEASES ! int i=0; ! for (i=0; i < buti->mouseCount; i++) { li.append( buti->mouseButtonList[i] ); *************** *** 1166,1192 **** // Schatten ermöglichen und selbständig für volumes vorbereiten //sceneMgr->setShadowTechnique(SHADOWTYPE_TEXTURE_MODULATIVE); if (shadows) { ! sceneMgr->setShadowTechnique(SHADOWTYPE_STENCIL_MODULATIVE); MeshManager::getSingleton().setPrepareAllMeshesForShadowVolumes(true); } // kamera einstellen ! camera = sceneMgr->createCamera("PlayerCam"); ! //camera->setPosition(Vector3(4,3,3)); // default ?? ! //camera->lookAt(Vector3(0,0,0)); // default ?? ! //camera->setNearClipDistance(0.1); ! //camera->setFarClipDistance(1000.0); ! //camera->setFOVy( Degree( 40.0 ) ); // viewport setzen vp = window->addViewport(camera); ! //vp->setBackgroundColour(ColourValue(0.1,0.1,0.1)); ! vp->setOverlaysEnabled(false); - //window->setDebugText("test version"); // alle vorhanden skripte (und meshes) analysieren (im aktuellen verzeichnis) - //ResourceManager::.addCommonSearchPath(materialpath); try { --- 1183,1203 ---- // Schatten ermöglichen und selbständig für volumes vorbereiten //sceneMgr->setShadowTechnique(SHADOWTYPE_TEXTURE_MODULATIVE); + shadowsEnabled = false; if (shadows) { ! shadowsEnabled = true; ! sceneMgr->setShadowTechnique(SHADOWTYPE_STENCIL_ADDITIVE); MeshManager::getSingleton().setPrepareAllMeshesForShadowVolumes(true); } // kamera einstellen ! camera = sceneMgr->createCamera("PlayerCam"); // viewport setzen vp = window->addViewport(camera); ! vp->setBackgroundColour(ColourValue(0.1,0.1,0.1)); // alle vorhanden skripte (und meshes) analysieren (im aktuellen verzeichnis) try { *************** *** 1200,1212 **** haveToParse = true; - // zwei meshes zur auswahl: Mesh* mesh - //myMesh = createCube(0.5,0.5,0.5,"myMesh"); - - // Now: Prepare for STENCIL SHADOWS: - //myMesh->prepareForShadowVolume(); - //myMesh->buildEdgeList(); - // lichter ! sceneMgr->setAmbientLight(ColourValue(0.2,0.2,0.2)); // ogretree bauen: --- 1211,1216 ---- haveToParse = true; // lichter ! sceneMgr->setAmbientLight(ColourValue(0.1,0.1,0.1)); // ogretree bauen: *************** *** 1237,1241 **** // event listener specifics ! cout << " initializing eventhandling " << endl; --- 1241,1245 ---- // event listener specifics ! cout << "FORC: Initializing eventhandling " << endl; *************** *** 1347,1352 **** --- 1351,1364 ---- int* faceptr = trigeom->faces.dataPtr(); int* faceptr2 = faceptr; + int* faceptr3 = faceptr2; int numfaces = trigeom->faces.size(); + int numverts = trigeom->verts.size(); + + //NEW + //int numverts = numfaces * 3; + + cout << "DEBUG: " << numfaces << " faces, "<< numverts << " vertices" << endl; + // TODO: für später schlau einrichten int vertsize = 8; *************** *** 1365,1369 **** // IndexBuffer erstellen ! sub->indexData->indexCount = numfaces * 3; sub->indexData->indexStart = 0; HardwareIndexBufferSharedPtr ibuf; --- 1377,1381 ---- // IndexBuffer erstellen ! sub->indexData->indexCount = numfaces*3; sub->indexData->indexStart = 0; HardwareIndexBufferSharedPtr ibuf; *************** *** 1385,1390 **** if (texCoords == 0 || texCoords->storage != support3d::VARYING || texCoords->type != support3d::FLOAT || texCoords->multiplicity != 2 ) { ! cout << "could not assign TEXTURE COORDINATES" << endl; ! cout << "either no texture coordinates specified or specified them per-face only" << endl; standardCoords = true; } --- 1397,1401 ---- if (texCoords == 0 || texCoords->storage != support3d::VARYING || texCoords->type != support3d::FLOAT || texCoords->multiplicity != 2 ) { ! cout << "FORC / Warning: Could not assing texture coordinates" << endl; standardCoords = true; } *************** *** 1400,1403 **** --- 1411,1415 ---- // Vorarbeit für von außen spezifizierte Normalen................................................ bool normals = false; + support3d::PrimVarInfo* specNormals = trigeom->findVariable("N"); support3d::vec3d* np; // evtl problemquelle hier *************** *** 1405,1410 **** if (specNormals == 0 || specNormals->storage != support3d::VARYING || specNormals->type != support3d::NORMAL || specNormals->multiplicity != 1 ) { ! cout << "could not assign NORMALS" << endl; ! cout << "either no normals specified or specified them per-face only" << endl; } else --- 1417,1421 ---- if (specNormals == 0 || specNormals->storage != support3d::VARYING || specNormals->type != support3d::NORMAL || specNormals->multiplicity != 1 ) { ! cout << "FORC / Warning: Could not assign normals, hence i will calculate them." << endl; } else *************** *** 1414,1417 **** --- 1425,1429 ---- np = norry->dataPtr(); + cout << "FORC: Normals detected: Count: " << norry->size() << endl; normals = true; } *************** *** 1421,1432 **** Real *pReal = (Real*) vbuf->lock(HardwareBuffer::HBL_DISCARD); // Pointer für Vertices Real *pReal2 = pReal; // Basepointer für Normalen unsigned int* pIndexes = static_cast<unsigned int*>( ibuf->lock(HardwareBuffer::HBL_DISCARD) ); // ( 1 ) Vertices einfügen ! for (int i = 0; i < numverts; ++i) ! { // Koordinaten ! *pReal++ = vertsptr->x; ! *pReal++ = vertsptr->y; ! *pReal++ = vertsptr->z; // ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; // Normalen ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; --- 1433,1450 ---- Real *pReal = (Real*) vbuf->lock(HardwareBuffer::HBL_DISCARD); // Pointer für Vertices Real *pReal2 = pReal; // Basepointer für Normalen + Real *pReal3 = pReal; // zum eintragen der normalen in den vertexbuffer unsigned int* pIndexes = static_cast<unsigned int*>( ibuf->lock(HardwareBuffer::HBL_DISCARD) ); + + cout << "FORC: Filling Vertex Buffer" << endl; // ( 1 ) Vertices einfügen ! int i = 0; ! for (i = 0; i < numverts; ++i) ! { // Koordinaten ! *pReal3++ = vertsptr->x; ! *pReal3++ = vertsptr->y; ! *pReal3++ = vertsptr->z; ! vertsptr++; ! // ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; // Normalen ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; *************** *** 1434,1447 **** if (normals) // zuweisen { ! *pReal++ = np->x; ! *pReal++ = np->y; ! *pReal++ = np->z; ! np++; } else // platz lassen für berechnung { ! pReal++; ! pReal++; ! pReal++; } --- 1452,1465 ---- if (normals) // zuweisen { ! *pReal3++ = np->x; ! *pReal3++ = np->y; ! *pReal3++ = np->z; ! np++; } else // platz lassen für berechnung { ! *pReal3++=0.0; ! *pReal3++=0.0; ! *pReal3++=0.0; } *************** *** 1451,1479 **** if (!standardCoords) { ! *pReal++ = (*mp); mp++; ! *pReal++ = (*mp); mp++; } else // standardCoords == true { ! *pReal++ = 0.0; // schwachsinn ! *pReal++ = 0.0; // schwachsinn } - // incr. - vertsptr++; } ! if (!normals) { ! // normalen berechnen: 1 pro face ! cout << "calculating normals ..." << endl; int ia, ib, ic; support3d::vec3d normal; ! Real* pReal3; // zum eintragen der normalen in den vertexbuffer ! // ( 2 ) Normalen berechnen und einfügen for (i=0; i<numfaces; ++i) { - // Normale, wird berechnet. TODO: evtl. definition abfangen // ia/ib/ic indizes der 3 knoten ia = *faceptr2; --- 1469,1501 ---- if (!standardCoords) { ! *pReal3++ = (*mp); mp++; ! *pReal3++ = (*mp); mp++; } else // standardCoords == true { ! *pReal3++ = 0.0; // schwachsinn ! *pReal3++ = 0.0; // schwachsinn } } ! ! vector<int>* facePerVertex; ! support3d::vec3d* faceNormals; if (!normals) { ! cout << "FORC: Calculating normals now" << endl; ! ! // Gesucht: Für jeden Vertex die Nummer der benutzenden Faces, map[VertexNr]={1, 4, 2, 9 etc. ! facePerVertex = new vector<int>[numverts]; // remember to delete ! int ia, ib, ic; support3d::vec3d normal; ! int* faceptr3 = faceptr2; // Pointer sichern ! ! // STEP 1 : Calculating face normals ! faceNormals = new support3d::vec3d[numfaces]; // remember to delete for (i=0; i<numfaces; ++i) { // ia/ib/ic indizes der 3 knoten ia = *faceptr2; *************** *** 1490,1535 **** catch(...) { normal.set(0,0,0); } ! // TODO: Optimieren, Werte werden überschrieben ! // Position bestimmen & in VertexBuffer eintragen ! pReal3 = pReal2 + vertsize * ( ia ) + 3; ! *pReal3 = normal.x; ! pReal3++; ! *pReal3 = normal.y; ! pReal3++; ! *pReal3 = normal.z; ! pReal3++; ! // Position bestimmen & in VertexBuffer eintragen ! pReal3 = pReal2 + vertsize * ( ib ) + 3; ! *pReal3 = normal.x; ! pReal3++; ! *pReal3 = normal.y; ! pReal3++; ! *pReal3 = normal.z; ! pReal3++; ! // Position bestimmen & in VertexBuffer eintragen ! pReal3 = pReal2 + vertsize * ( ic ) + 3; ! *pReal3 = normal.x; ! pReal3++; ! *pReal3 = normal.y; ! pReal3++; ! *pReal3 = normal.z; ! pReal3++; } ! } // ( 3 ) IndexBuffer füllen (einfach) ! for (i=0; i<numfaces*3; ++i) ! { ! *pIndexes++ = *faceptr; ! //printf("FACE %d /n", *faceptr); ! faceptr++; } // Fertig, daher unlock ibuf->unlock(); vbuf->unlock(); // ||||||||||||||||| V E R T E X D A T A ||||||||||||||||||||||||||||||||||| // ||||||||||||||||| V E R T E X D A T A ||||||||||||||||||||||||||||||||||| --- 1512,1564 ---- catch(...) { + cout << "FORC / Warning: (0,0,0) normal detected." << endl; normal.set(0,0,0); } ! // normale zwischenspeichern ! faceNormals[i] = normal; ! // für die zukunft: ! facePerVertex[ia].push_back(i); ! facePerVertex[ib].push_back(i); ! facePerVertex[ic].push_back(i); } ! cout << "FORC: Assigning normals now" << endl; ! for (i=0; i<numverts; i++) ! { ! support3d::vec3d tnormal = support3d::vec3d(0.0, 0.0, 0.0); ! // durch jeweiligen vektor iterieren und vertex variable berechnen ! unsigned int k = 0; ! int temp; ! for(k = 0; k < facePerVertex[i].size(); k++) ! { ! temp = facePerVertex[i][k]; ! tnormal += faceNormals[ temp ]; ! //cout << "DEBUG: fN " << temp << endl; ! } + //cout << "DEBUG: Normal (before): " << tnormal.x << " " << tnormal.y << " " << tnormal.z << endl; + tnormal = tnormal.normalize(); + //cout << "DEBUG: Normal (final): " << tnormal.x << " " << tnormal.y << " " << tnormal.z << endl; + pReal = pReal2 + (i*vertsize) + 3; + *pReal++ = tnormal.x; + *pReal++ = tnormal.y; + *pReal++ = tnormal.z; + } + } // if ! normals + + cout << "FORC: Filling Index Buffer" << endl; // ( 3 ) IndexBuffer füllen (einfach) ! for (i = 0; i < numfaces * 3; ++i) ! { ! *pIndexes++ = *faceptr; ! faceptr++; } + cout << "FORC: Unlocking Buffers" << endl; + // Fertig, daher unlock ibuf->unlock(); vbuf->unlock(); + // ||||||||||||||||| V E R T E X D A T A ||||||||||||||||||||||||||||||||||| // ||||||||||||||||| V E R T E X D A T A ||||||||||||||||||||||||||||||||||| *************** *** 1560,1566 **** --- 1589,1602 ---- mesh->_setBounds(AxisAlignedBox(min.x, min.y, min.z, max.x, max.y, max.z)); + if (shadowsEnabled) + { + cout << "FORC: Building Edge List for OGRE" << endl; // Now: Prepare for STENCIL SHADOWS: mesh->prepareForShadowVolume(); mesh->buildEdgeList(); + } + + delete faceNormals; + delete facePerVertex; return mesh; *************** *** 1667,1671 **** Real *pReal = (Real*) vbuf->lock(HardwareBuffer::HBL_DISCARD); // special pointer for you to manipulate unsigned int* pIndexes = static_cast<unsigned int*>(ibuf->lock(HardwareBuffer::HBL_DISCARD) ); // special pointer ! for (int i = 0; i < size_vert * num_verts; ++i) { *pReal++ = verts[i]; // filling the VertexBuffer with our vertices as defined above } --- 1703,1708 ---- Real *pReal = (Real*) vbuf->lock(HardwareBuffer::HBL_DISCARD); // special pointer for you to manipulate unsigned int* pIndexes = static_cast<unsigned int*>(ibuf->lock(HardwareBuffer::HBL_DISCARD) ); // special pointer ! int i = 0; ! for (i = 0; i < size_vert * num_verts; ++i) { *pReal++ = verts[i]; // filling the VertexBuffer with our vertices as defined above } |