1

I want to use ActiViz .NET and C# to multitexture an object created from .obj file.

As long as I know somehow to use texture with single texture, I have problem with more than one texture. Based on what I found on VTK GitHub I started writing a code, but there comes problem with SetBlendingMode and MapDataArrayToMultiTextureAttribute methods. I use SetBlendingMode like this:

texture.SetBlendingMode(vtkTexture.VTKTextureBlendingMode.VTK_TEXTURE_BLENDING_MODE_REPLACE);

which results with:

The best overloaded method match for 'Kitware.VTK.vtkTexture.SetBlendingMode(int)' has some invalid arguments

With MapDataArrayToMultiTextureAttribute it looks like this:

mapper.MapDataArrayToMultiTextureAttribute(vtkProperty.VTKTextureUnit.VTK_TEXTURE_UNIT_0, "TCoords", vtkDataObject.FIELD_ASSOCIATION, 0);

which ends with similar message:

The best overloaded method match for 'Kitware.VTK.vtkPolyDataMapper.MapDataArrayToMultiTextureAttribute(int, string, int, int)' has some invalid arguments

The whole code:

private void ReadOBJ(string path)
        {

            vtkTesting test = vtkTesting.New();

        // Varibles for obj file and texture
        string filePath = path;
        string texturePath0 = @"C:\Users\admin\Desktop\Fox-Skull-obj\Fox Skull_0.jpg";
        string texturePath1 = @"C:\Users\admin\Desktop\Fox-Skull-obj\Fox Skull_1.jpg";
        string texturePath2 = @"C:\Users\admin\Desktop\Fox-Skull-obj\Fox Skull_2.jpg";
        string texturePath3 = @"C:\Users\admin\Desktop\Fox-Skull-obj\Fox Skull_3.jpg";

        // Open jpeg file including texture
        vtkJPEGReader jpegReader = new vtkJPEGReader();
        jpegReader.SetFileName(texturePath0);
        jpegReader.Update();

        vtkJPEGReader jpegReader1 = new vtkJPEGReader();
        jpegReader1.SetFileName(texturePath1);
        jpegReader1.Update();
        vtkJPEGReader jpegReader2 = new vtkJPEGReader();
        jpegReader2.SetFileName(texturePath2);
        jpegReader2.Update();
        vtkJPEGReader jpegReader3 = new vtkJPEGReader();
        jpegReader3.SetFileName(texturePath3);
        jpegReader3.Update();

        // Open obj file
        vtkOBJReader reader = new vtkOBJReader();
        if (!File.Exists(filePath))
        {
            MessageBox.Show("Cannot read file \"" + filePath + "\"", "Error", MessageBoxButtons.OK);
            return;
        }
        reader.SetFileName(filePath);
        reader.Update();

        vtkTriangleFilter triangleFilter = vtkTriangleFilter.New();
        triangleFilter.SetInputConnection(reader.GetOutputPort());

        vtkStripper stripper = vtkStripper.New();
        stripper.SetInputConnection(triangleFilter.GetOutputPort());
        stripper.Update();

        vtkPolyData polydata = stripper.GetOutput();
        polydata.Register(null);
        polydata.GetPointData().SetNormals(null);

        vtkFloatArray TCoords = vtkFloatArray.New();
        TCoords.SetNumberOfComponents(2);
        TCoords.Allocate(8, 0);

        TCoords.InsertNextTuple2(0.0, 0.0);
        TCoords.InsertNextTuple2(1.0, 0.0);
        TCoords.InsertNextTuple2(0.0, 1.0);
        TCoords.InsertNextTuple2(1.0, 1.0);
        TCoords.SetName("TCoords");

        polydata.GetPointData().AddArray(TCoords);


        // Create texture
        vtkTexture texture = new vtkTexture();
        vtkTexture texture1 = new vtkTexture();
        vtkTexture texture2 = new vtkTexture();
        vtkTexture texture3 = new vtkTexture();
        texture.SetInputConnection(jpegReader.GetOutputPort());
        texture1.SetInputConnection(jpegReader1.GetOutputPort());
        texture2.SetInputConnection(jpegReader2.GetOutputPort());
        texture3.SetInputConnection(jpegReader3.GetOutputPort());

        texture.SetBlendingMode((int)vtkTexture.VTKTextureBlendingMode.VTK_TEXTURE_BLENDING_MODE_REPLACE);
        texture1.SetBlendingMode((int)vtkTexture.VTKTextureBlendingMode.VTK_TEXTURE_BLENDING_MODE_ADD);
        texture2.SetBlendingMode((int)vtkTexture.VTKTextureBlendingMode.VTK_TEXTURE_BLENDING_MODE_ADD);
        texture3.SetBlendingMode((int)vtkTexture.VTKTextureBlendingMode.VTK_TEXTURE_BLENDING_MODE_ADD);

        // Mapping textures


        vtkTextureMapToCylinder mapSphere = new vtkTextureMapToCylinder();
        mapSphere.SetInputConnection(reader.GetOutputPort());


        // Visualize           
        vtkPolyDataMapper mapper = vtkPolyDataMapper.New();           
        mapper.SetInput(polydata);

        // Get a reference to the renderwindow of our renderWindowControl1
        vtkRenderWindow renderWindow = renderWindowControl1.RenderWindow;
        // Renderer
        vtkRenderer renderer = renderWindow.GetRenderers().GetFirstRenderer();  

        vtkRenderWindowInteractor iren = vtkRenderWindowInteractor.New();
        iren.SetRenderWindow(renderWindow);

        // Create actor and add mapper with texture
        vtkActor actor = vtkActor.New();

        vtkOpenGLHardwareSupport hardware = vtkOpenGLRenderWindow.SafeDownCast(renderWindow).GetHardwareSupport();
        bool supported = hardware.GetSupportsMultiTexturing();
        int tu = 0;

        if (supported)
        {
            tu = hardware.GetNumberOfFixedTextureUnits();
        }
        if (supported && tu > 2)
        {
            mapper.MapDataArrayToMultiTextureAttribute((int)vtkProperty.VTKTextureUnit.VTK_TEXTURE_UNIT_0, "TCoords", (int)vtkDataObject.FieldAssociations.FIELD_ASSOCIATION_POINTS, -1);
            mapper.MapDataArrayToMultiTextureAttribute((int)vtkProperty.VTKTextureUnit.VTK_TEXTURE_UNIT_1, "TCoords", (int)vtkDataObject.FieldAssociations.FIELD_ASSOCIATION_POINTS, -1);
            mapper.MapDataArrayToMultiTextureAttribute((int)vtkProperty.VTKTextureUnit.VTK_TEXTURE_UNIT_2, "TCoords", (int)vtkDataObject.FieldAssociations.FIELD_ASSOCIATION_POINTS, -1);
            mapper.MapDataArrayToMultiTextureAttribute((int)vtkProperty.VTKTextureUnit.VTK_TEXTURE_UNIT_3, "TCoords", (int)vtkDataObject.FieldAssociations.FIELD_ASSOCIATION_POINTS, -1);              

            actor.GetProperty().SetTexture((int)vtkProperty.VTKTextureUnit.VTK_TEXTURE_UNIT_0, texture);
            actor.GetProperty().SetTexture((int)vtkProperty.VTKTextureUnit.VTK_TEXTURE_UNIT_1, texture1);
            actor.GetProperty().SetTexture((int)vtkProperty.VTKTextureUnit.VTK_TEXTURE_UNIT_2, texture2);
            actor.GetProperty().SetTexture((int)vtkProperty.VTKTextureUnit.VTK_TEXTURE_UNIT_3, texture3);

        }
        else
        {
            if (supported)
            {
                mapper.MapDataArrayToMultiTextureAttribute((int)vtkProperty.VTKTextureUnit.VTK_TEXTURE_UNIT_0, "TCoords", (int)vtkDataObject.AttributeTypes.POINT, 0);
            }
            actor.SetTexture(texture);
        }

        actor.SetMapper(mapper);
        renderWindow.AddRenderer(renderer);



        // Hide current actor
        renderer.RemoveAllViewProps();
        // Set background color
        renderer.SetBackground(0.3, 0.6, 0.3);
        // Add new actor to the renderer
        renderer.AddActor(actor);

        // Render
        renderWindow.Render();

        }

Does anybody have any experience with multitexture with C# and VTK and can help me? Do you know any other solutions that can help me?

EDIT 01.12.2015

Thanks to JohnnyQ answer I probably make functions mentioned above working. I say "probably" because right now when I'm running code and select .obj file program stops working with one of two errors: An unhandled exception of type 'System.AccessViolationException' occurred in Kitware.VTK.dll with information about attempt of read or write protected memory or program just stops with vshost32.exe stop working message.

I've updated code above to actual version. Any suggestions are still appreciated.

Community
  • 1
  • 1
Ellusion
  • 43
  • 2
  • 7

1 Answers1

0

You have to explicit cast from the enum type to an integral type.

e.g.

texture.SetBlendingMode((int)vtkTexture.VTKTextureBlendingMode.VTK_TEXTURE_BLENDING_MODE_REPLACE);
JohnnyQ
  • 1,591
  • 1
  • 16
  • 25
  • This helped in some point (which I'm grateful), but there's one more problem with code. Please look at main post for more information in Edit section. – Ellusion Dec 01 '15 at 20:54