It is currently Sat Aug 22, 2020 1:34 pm


All times are UTC




Post new topic Reply to topic  [ 17 posts ]  Go to page Previous  1, 2
Author Message
 Post subject: Re: How do I setup a simple modifiable terrain in an Ogre sc
PostPosted: Mon Oct 08, 2012 3:12 pm 
User avatar

Joined: Tue Sep 04, 2012 2:35 pm
Posts: 11
Ok. I followed the example you mentioned, and added the code that should create a sphere in the volume. It compiles fine but still doesn't render anything. Here is the relevant part of the code again:

Code:
#include "TutorialApplication.h"
#include <PolyVoxCore/SimpleInterface.h>
#include <PolyVoxCore/Material.h>
#include <PolyVoxCore/MeshDecimator.h>
#include <PolyVoxCore/Vector.h>

//Use the PolyVox namespace
using namespace PolyVox;
using namespace std;

void createSphereInVolume(SimpleVolume<MaterialDensityPair44>& volData, float fRadius)
{
   //This vector hold the position of the center of the volume
   Vector3DFloat v3dVolCenter(volData.getWidth() / 2, volData.getHeight() / 2, volData.getDepth() / 2);

   for (int z = 0; z < volData.getWidth(); z++)
   {
      for (int y = 0; y < volData.getHeight(); y++)
      {
         for (int x = 0; x < volData.getDepth(); x++)
         {
            //Store our current position as a vector...
            Vector3DFloat v3dCurrentPos(x,y,z);
            //And compute how far the current position is from the center of the volume
            float fDistToCenter = (v3dCurrentPos - v3dVolCenter).length();

            //If the current voxel is less than 'radius' units from the center then we make it solid.
            if(fDistToCenter <= fRadius)
            {
               //Our new density value
               uint8_t uDensity = MaterialDensityPair44::getMaxDensity();

               //Get the old voxel
               MaterialDensityPair44 voxel = volData.getVoxelAt(x, y, z);

               //Modify the density
               voxel.setDensity(uDensity);

               //Wrte the voxel value into the volume
               volData.setVoxelAt(x, y, z, voxel);
            }
         }
      }
   }
}

//-------------------------------------------------------------------------------------
TutorialApplication::TutorialApplication(void)
{
}
//-------------------------------------------------------------------------------------
TutorialApplication::~TutorialApplication(void)
{
}

//-------------------------------------------------------------------------------------
void TutorialApplication::createScene(void)
{
   typedef PolyVox::PositionMaterialNormal VertexType;
   SurfaceMesh <VertexType> mesh;
   SurfaceMesh <VertexType> mesh2;
   Region regValid(Vector3DInt32(0,0,0), Vector3DInt32(128,128,128));

   Ogre::ManualObject* ogreMesh;
   // create something to draw the PolyVox stuff to
   ogreMesh = mSceneMgr->createManualObject("PolyVox Mesh");
   // YES we do intend to change the mesh later -.-
   /*
   ogreMesh->setDynamic(true);
   ogreMesh->begin("BaseWhiteNoLighting", Ogre::RenderOperation::OT_TRIANGLE_LIST);
   {
      // do nothing, this will be updated
   }
   ogreMesh->end();
   */
   Ogre::SceneNode* ogreNode = mSceneMgr->getRootSceneNode()->createChildSceneNode("testnode1", Ogre::Vector3(20, 0, 0));
   ogreNode->attachObject(ogreMesh);

   SimpleVolume<MaterialDensityPair44> volume(regValid);

   // now add some data to it
   createSphereInVolume(volume, 30);

   std::cout << "smoothing volume" << std::endl;
   // smoothRegion<MaterialDensityPair44>(volume, volume.getEnclosingRegion());
   std::cout << "updating volume surface" << std::endl;
   {
      PolyVox::SurfaceExtractor<SimpleVolume,MaterialDensityPair44> suf(&volume, volume.getEnclosingRegion(), &mesh);
      suf.execute();
   }
   std::cout << "decimating meshes" << std::endl;
   {
      PolyVox::MeshDecimator<PolyVox::PositionMaterialNormal> decim(&mesh, &mesh2);
      decim.execute();
   }
   // std::cout << "drawing mesh: " << mesh2.getNoOfVertices() << std::endl;
   ogreMesh->begin("BaseWhiteNoLighting", Ogre::RenderOperation::OT_TRIANGLE_LIST);
   {
      const vector<PolyVox::PositionMaterialNormal>& vecVertices = mesh2.getVertices();
      const vector<uint32_t>& vecIndices = mesh2.getIndices();
      unsigned int uLodLevel = 0;
      int beginIndex = mesh2.m_vecLodRecords[uLodLevel].beginIndex;
      int endIndex = mesh2.m_vecLodRecords[uLodLevel].endIndex;
      for(int index = beginIndex; index < endIndex; ++index) {
         const PolyVox::PositionMaterialNormal& vertex = vecVertices[vecIndices[index]];
         const PolyVox::Vector3DFloat& v3dVertexPos = vertex.getPosition();
         const PolyVox::Vector3DFloat& v3dVertexNormal = vertex.getNormal();
         //const Vector3DFloat v3dRegionOffset(uRegionX * g_uRegionSideLength, uRegionY * g_uRegionSideLength, uRegionZ * g_uRegionSideLength);
         const PolyVox::Vector3DFloat v3dFinalVertexPos = v3dVertexPos + static_cast<PolyVox::Vector3DFloat>(mesh2.m_Region.getLowerCorner());
         ogreMesh->position(v3dFinalVertexPos.getX(), v3dFinalVertexPos.getY(), v3dFinalVertexPos.getZ());
         ogreMesh->normal(v3dVertexNormal.getX(), v3dVertexNormal.getY(), v3dVertexNormal.getZ());
         uint8_t mat = vertex.getMaterial() + 0.5;
         uint8_t red = mat & 0xF0;
         uint8_t green = mat & 0x03;
         uint8_t blue = mat & 0x0C;
         ogreMesh->colour(red*2, green*4, blue*4);// just some random colors, I'm too lazy for hsv
      }
   }
   ogreMesh->end();

   mSceneMgr->setAmbientLight(Ogre::ColourValue(0.5f, 0.5f, 0.5f));
}


Top
Offline Profile  
Reply with quote  
 Post subject: Re: How do I setup a simple modifiable terrain in an Ogre sc
PostPosted: Mon Oct 08, 2012 3:24 pm 
Developer
User avatar

Joined: Sun May 11, 2008 4:29 pm
Posts: 198
Location: UK
The first thing I would try is to uncomment the
Code:
std::cout << "drawing mesh: " << mesh2.getNoOfVertices() << std::endl;
line and make sure that the surface extractor is actually generating any vertices. Also, perhaps try doing it without the MeshDecimator for now to reduce the number of things happening at once.

_________________
Matt Williams
Linux/CMake guy


Top
Offline Profile  
Reply with quote  
 Post subject: Re: How do I setup a simple modifiable terrain in an Ogre sc
PostPosted: Mon Oct 08, 2012 5:52 pm 
User avatar

Joined: Tue Sep 04, 2012 2:35 pm
Posts: 11
milliams wrote:
The first thing I would try is to uncomment the
Code:
std::cout << "drawing mesh: " << mesh2.getNoOfVertices() << std::endl;
line and make sure that the surface extractor is actually generating any vertices. Also, perhaps try doing it without the MeshDecimator for now to reduce the number of things happening at once.


Not sure why I had that line commented out... I usually only removed what caused compiling to fail. There's too much output in the console to know what it says however. How do I know if it generates any vertices?

I tried to comment out the decimation part ("PolyVox::MeshDecimator<PolyVox::PositionMaterialNormal> decim(&mesh, &mesh2);" and "decim.execute();"), but the application then crashes:

Code:
smoothing volume
updating volume surface
drawing mesh: 0
Segmentation fault


Top
Offline Profile  
Reply with quote  
 Post subject: Re: How do I setup a simple modifiable terrain in an Ogre sc
PostPosted: Tue Oct 09, 2012 8:18 am 
Developer
User avatar

Joined: Sun May 04, 2008 6:35 pm
Posts: 1827
MirceaKitsune wrote:
There's too much output in the console to know what it says however. How do I know if it generates any vertices?


That line should only be output once. If you don't see it because of other output then try redirecting the output to a log file which you can then search.

MirceaKitsune wrote:
I tried to comment out the decimation part ("PolyVox::MeshDecimator<PolyVox::PositionMaterialNormal> decim(&mesh, &mesh2);" and "decim.execute();"), but the application then crashes:


Matt is correct that the MeshDecimator has some problems and we'll probably remove it in the future. However, in this case it is decimating 'mesh' and storing the result in 'mesh2' and you are then rendering 'mesh2'. If you take out the decimator then 'mesh2' is not getting any data, and so you would need to update the rest of the code to render 'mesh' instead.


Top
Offline Profile  
Reply with quote  
 Post subject: Re: How do I setup a simple modifiable terrain in an Ogre sc
PostPosted: Tue Oct 09, 2012 2:34 pm 
User avatar

Joined: Tue Sep 04, 2012 2:35 pm
Posts: 11
David Williams wrote:
That line should only be output once. If you don't see it because of other output then try redirecting the output to a log file which you can then search.

Matt is correct that the MeshDecimator has some problems and we'll probably remove it in the future. However, in this case it is decimating 'mesh' and storing the result in 'mesh2' and you are then rendering 'mesh2'. If you take out the decimator then 'mesh2' is not getting any data, and so you would need to update the rest of the code to render 'mesh' instead.


I removed the mesh decimator part again, and also renamed mesh2 to mesh. This time there was no crash but still nothing renders visibly. What does the mesh decimator do BTW... is it even needed? Also, I got to see the "drawing mesh" output and if I understand right there should be some vertices.

Code:
...
smoothing volume
updating volume surface
drawing mesh: 16926
*** Initializing OIS ***
...


Top
Offline Profile  
Reply with quote  
 Post subject: Re: How do I setup a simple modifiable terrain in an Ogre sc
PostPosted: Wed Oct 10, 2012 10:00 am 
Developer
User avatar

Joined: Sun May 04, 2008 6:35 pm
Posts: 1827
MirceaKitsune wrote:
What does the mesh decimator do BTW... is it even needed?

It reduces the number of triangles in the mesh. It's basically a performance optimisation, but it has some issues so you should avoid it for now.
MirceaKitsune wrote:
Also, I got to see the "drawing mesh" output and if I understand right there should be some vertices.
Code:
...
smoothing volume
updating volume surface
drawing mesh: 16926
*** Initializing OIS ***
...

Ok, this looks good. The output 'drawing mesh: 16926' indicates that a mesh has indeed been created by PolyVox. I think the most likely reason that your not seeing anything being drawn is simplythat you are facing the wrong direction... have you tried looking around the scene? And are you sure that you haven't placed the camera inside the sphere (in which case you won't see it?

Based on your code, the sphere should be centered at (64, 64, 64) and have a radius of 30. So if you leave the camera at the origin and look at that position then you should see it. You might find it useful to load additional Ogre meshes into your scene to serve as markers... perhaps add an Ogre mesh at the origin and one where the sphere should be centered. If you can see both the markers you should be able to see the sphere.


Top
Offline Profile  
Reply with quote  
 Post subject: Re: How do I setup a simple modifiable terrain in an Ogre sc
PostPosted: Wed Oct 10, 2012 10:52 am 
User avatar

Joined: Tue Sep 04, 2012 2:35 pm
Posts: 11
Ok. Performance is important too so I hope the decimator will get improved. And yes, I tried looking and moving around, but no success. The ogre head example I started the code from worked (including moving the camera) so in this case I'll probably position the ogre head at the origin of the voxel sphere and see what I get then.


Top
Offline Profile  
Reply with quote  
Display posts from previous:  Sort by  
Post new topic Reply to topic  [ 17 posts ]  Go to page Previous  1, 2

All times are UTC


Who is online

Users browsing this forum: No registered users and 2 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Theme created StylerBB.net