Volumes Of Fun
http://www.volumesoffun.com/phpBB3/

how to set material? (SOLVED)
http://www.volumesoffun.com/phpBB3/viewtopic.php?f=14&t=459
Page 1 of 1

Author:  kalwalt [ Sun Nov 11, 2012 5:29 pm ]
Post subject:  how to set material? (SOLVED)

it seems easy to set... but i can't get it work. look at this code please. i'm doing something wrong?

Code:
#include "testApp.h"
#include "ofxPolyvox.h"
#include "PolyVoxCore/MarchingCubesSurfaceExtractor.h"
#include "PolyVoxCore/RawVolume.h"
#include "PolyVoxCore/MaterialDensityPair.h"
#include "PolyVoxCore/PolyVoxForwardDeclarations.h"

//Use the PolyVox namespace
using namespace PolyVox;

void createRawVolume(RawVolume<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);

    MaterialDensityPair44 voxel;
   //This three-level for loop iterates over every voxel in the volume
   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(fDistToCenter <= fRadius)
            {

                    uint8_t uMaterial = 2;
                    uint8_t uValue = 3;

               //Modify the density and material
               voxel.setMaterial( uMaterial );
               voxel.setDensity( MaterialDensityPair44::getMaxDensity() );
                    //voxel = MaterialDensityPair44(uValue, uValue > 0 ? MaterialDensityPair44::getMaxDensity() : MaterialDensityPair44::getMinDensity());
                    uint8_t mat = voxel.getMaterial();
                    cout << "mat:" << mat << endl;

                    volData.setVoxelAt( x, y, z, voxel );


            }

         }
      }
   }
}


//--------------------------------------------------------------
void testApp::setup(){

    ofSetLogLevel(OF_LOG_VERBOSE);

    PolyVox::Region reg(Vector3DInt32(0,0,0), Vector3DInt32(32, 32, 32));
    RawVolume<MaterialDensityPair44> volData(reg);

    createRawVolume(volData, 12);

    SurfaceMesh<PositionMaterialNormal> mesh;

   MarchingCubesSurfaceExtractor< RawVolume<MaterialDensityPair44> > surfaceExtractor(&volData, volData.getEnclosingRegion(), &mesh);

   surfaceExtractor.execute();

    std::cout << "polyvox vertices: " << mesh.getNoOfVertices() << std::endl;
    std::cout << "polyvox indices: " << mesh.getNoOfIndices() << std::endl;

    OF_mesh.setMode(OF_PRIMITIVE_TRIANGLES);

    polyvox.polyvoxToOfMesh(mesh,OF_mesh);

    std::cout << "OF_mesh vertices: " << OF_mesh.getNumVertices() << std::endl;

    }


and here where i get the materialid and i apply to the OF mesh:

Code:
  for (int i = 0; i < surfaceMesh.getNoOfVertices(); i++ ){

    PositionMaterialNormal vert0 = vecVertices[i];
    //uint8_t material = static_cast<uint8_t>(vert0.getMaterial() + 0.5);
    uint8_t material = static_cast<uint8_t>(vert0.getMaterial() + 0.5);
    cout << "material:" << material << endl;
    ofFloatColor colour = convertMaterialIDToColour(material);


    polyvxToOfMesh.addColor(colour);

    }

ofFloatColor  ofxPolyvox::convertMaterialIDToColour(uint8_t materialID)
{
   ofFloatColor colour;

   switch(materialID)
   {
   case 1:

      colour.red = 255.0f;
      colour.green = 0.0f;
      colour.blue = 0.0f;
      break;
   case 2:
      colour.red = 0.0f;
      colour.green = 255.0f;
      colour.blue = 0.0f;
      break;
   case 3:
      colour.red = 0.0f;
      colour.green = 0.0f;
      colour.blue = 1.0f;
      break;
   case 4:
      colour.red = 1.0f;
      colour.green = 1.0f;
      colour.blue = 0.0f;
      break;
   case 5:
      colour.red = 1.0f;
      colour.green = 0.0f;
      colour.blue = 1.0f;
      break;
   default:
      colour.red = 1.0f;
      colour.green = 1.0f;
      colour.blue = 1.0f;
   }

   return colour;
}


but it seems that no material is assigned to every vertex because i receive from
Code:
uint8_t mat = voxel.getMaterial();
    cout << "mat:" << mat << endl;


the cout output absolutely nothing! So i suppose that i miss to add some very relevant part...
I looked for this at your OpenGL example, but you use LargeVolume, i tried also with LargeVolume but with the same luck.

Author:  KuroSei [ Mon Nov 12, 2012 1:43 am ]
Post subject:  Re: how to set material?

If the cout outputs nothing i guess
Code:
if(fDistToCenter <= fRadius)

never becomes true.

Author:  David Williams [ Mon Nov 12, 2012 9:14 am ]
Post subject:  Re: how to set material?

As KuroSei says you should investigate why the 'cout' is never being executed. Can you step through with the dubugger to see why the 'fDistToCenter <= fRadius' condition is never true? Or place a cout outsite of that condition to check if the loop is being executed?

Author:  kalwalt [ Mon Nov 12, 2012 1:16 pm ]
Post subject:  Re: how to set material?

I think I expressed myself badly. I wanted to say that "cout" in the console I get only "mat" but no value (even not 0!) and this means that the material is not assigned? but instead have a look at the image of my debugging it seems that instead the Material is assigned to the voxel!

Attachments:
Screenshot.Jpeg
Screenshot.Jpeg [ 197.21 KiB | Viewed 6867 times ]

Author:  David Williams [ Mon Nov 12, 2012 3:32 pm ]
Post subject:  Re: how to set material?

Try this:

Code:
cout << "mat:" << int(mat) << endl;


However, I would be more interested in knowing if you are still getting a valid mesh (even if the materials are wrong). Does it have valid vertices and indices or is the mesh completly empty?

Author:  kalwalt [ Mon Nov 12, 2012 4:41 pm ]
Post subject:  Re: how to set material?

Quote:
Code:
cout << "mat:" << int(mat) << endl;


this help me now i get mat: 2 !
Quote:
However, I would be more interested in knowing if you are still getting a valid mesh (even if the materials are wrong). Does it have valid vertices and indices or is the mesh completly empty?


yes,i have a valid mesh and vertices and indices.

The problem is not in the mesh ( it always build, a sphere) but where i use the material info to add the color to the mesh.
p.s. now it is more related to my implementation in OF because i add this
Quote:
bool col = polyvxToOfMesh.hasColors();

cout << "hasColors:" << col << endl;


give me true values so i think there will be a setting to display Color in a ofMesh class that i don't know...

Author:  kalwalt [ Mon Nov 12, 2012 5:34 pm ]
Post subject:  Re: how to set material?

i solved the problem!
first i changed :

Quote:
ofFloatColor colour = convertMaterialIDToColour(material);

to
Quote:
ofFloatColor colour = convertMaterialIDToColour(int(material));


and inside convertMaterialIDToColour(int material) where i define the colors with ofFloatColor


Quote:
colour.red = 1.0f
colour.green = 0.0f;
colur.blue = 0.0f;


to
Quote:
ofFloatColor ofxPolyvox::convertMaterialIDToColour(int materialID)
{
ofFloatColor colour;

switch(materialID)
{
case 1:

colour = ofFloatColor(1.0f,0.0f,0.0f);

break;
case 2:

colour = ofFloatColor(0.0f,1.0f,0.0f);

break;
case 3:

colour = ofFloatColor(0.0f,0.0f,1.0f);

break;
case 4:

colour = ofFloatColor(1.0f,1.0f,0.0f);

break;
case 5:

colour = ofFloatColor(1.0f,0.0f,1.0f);

break;
default:

colour = ofFloatColor(1.0f,1.0f,1.0f);
}

return colour;
}


the reason that weren't displaied the colors was that ofFloatColor accept colours.red (or .green , .blue but has a different meaning)

Now i have my ofMesh coloured in the window!
ofxPolyvox development will continue... :lol:

Author:  kalwalt [ Mon Nov 12, 2012 6:03 pm ]
Post subject:  Re: how to set material?

anyway this wasn't the problem:
Code:
 ofFloatColor colour = convertMaterialIDToColour(int(material));


switching again to:
Code:
 ofFloatColor colour = convertMaterialIDToColour(material);


do the same . the core of the issue resided in the
Code:
colour = ofFloatColor(1.0f,0.0f,0.0f);
way. this is the most important thing!

thanks for your suggestions because(even if doesn't seem) this help me a lot!

Page 1 of 1 All times are UTC
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/