//============================================================================ // Copyright (c) Kitware, Inc. // All rights reserved. // See LICENSE.txt for details. // This software is distributed WITHOUT ANY WARRANTY; without even // the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR // PURPOSE. See the above copyright notice for more information. // // Copyright 2015 Sandia Corporation. // Copyright 2015 UT-Battelle, LLC. // Copyright 2015 Los Alamos National Security. // // Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, // the U.S. Government retains certain rights in this software. // // Under the terms of Contract DE-AC52-06NA25396 with Los Alamos National // Laboratory (LANL), the U.S. Government retains certain rights in // this software. //============================================================================ #ifndef vtk_m_rendering_MapperGL_h #define vtk_m_rendering_MapperGL_h #include #include #include #include #include #include #include #include #include #include #include using namespace std; namespace vtkm { namespace rendering { template class MapperGL : public Mapper { public: VTKM_CONT_EXPORT MapperGL() {} VTKM_CONT_EXPORT virtual void RenderCells(const vtkm::cont::DynamicCellSet &cellset, const vtkm::cont::CoordinateSystem &coords, const vtkm::cont::Field &scalarField, const vtkm::rendering::ColorTable &colorTable, const vtkm::rendering::Camera &camera, const vtkm::Range &scalarRange) { vtkm::cont::ArrayHandle< vtkm::Vec > indices; vtkm::Id numTri; Triangulator triangulator; triangulator.run(cellset, indices, numTri); vtkm::cont::ArrayHandle sf; sf = scalarField.GetData().Cast >(); vtkm::cont::DynamicArrayHandleCoordinateSystem dcoords = coords.GetData(); vtkm::cont::ArrayHandleUniformPointCoordinates uVerts; vtkm::cont::ArrayHandle< vtkm::Vec > eVerts; if(dcoords.IsSameType(vtkm::cont::ArrayHandleUniformPointCoordinates())) { uVerts = dcoords.Cast(); RenderTriangles(numTri, uVerts, indices, sf, colorTable, scalarRange, camera); } else if(dcoords.IsSameType(vtkm::cont::ArrayHandle< vtkm::Vec >())) { eVerts = dcoords.Cast > > (); RenderTriangles(numTri, eVerts, indices, sf, colorTable, scalarRange, camera); } else if(dcoords.IsSameType(vtkm::cont::ArrayHandleCartesianProduct< vtkm::cont::ArrayHandle, vtkm::cont::ArrayHandle, vtkm::cont::ArrayHandle >())) { vtkm::cont::ArrayHandleCartesianProduct< vtkm::cont::ArrayHandle, vtkm::cont::ArrayHandle, vtkm::cont::ArrayHandle > rVerts; rVerts = dcoords.Cast, vtkm::cont::ArrayHandle, vtkm::cont::ArrayHandle > > (); RenderTriangles(numTri, rVerts, indices, sf, colorTable, scalarRange, camera); } glFinish(); glFlush(); } const char* GL_type_to_string (GLenum type) { switch (type) { case GL_BOOL: return "bool"; case GL_INT: return "int"; case GL_FLOAT: return "float"; case GL_FLOAT_VEC2: return "vec2"; case GL_FLOAT_VEC3: return "vec3"; case GL_FLOAT_VEC4: return "vec4"; case GL_FLOAT_MAT2: return "mat2"; case GL_FLOAT_MAT3: return "mat3"; case GL_FLOAT_MAT4: return "mat4"; case GL_SAMPLER_2D: return "sampler2D"; case GL_SAMPLER_3D: return "sampler3D"; case GL_SAMPLER_CUBE: return "samplerCube"; case GL_SAMPLER_2D_SHADOW: return "sampler2DShadow"; default: break; } return "other"; } void _print_programme_info_log (GLuint programme) { int max_length = 2048; int actual_length = 0; char log[2048]; glGetProgramInfoLog (programme, max_length, &actual_length, log); printf ("program info log for GL index %u:\n%s", programme, log); } void print_all (GLuint programme) { printf ("--------------------\nshader programme %i info:\n", programme); int params = -1; glGetProgramiv (programme, GL_LINK_STATUS, ¶ms); printf ("GL_LINK_STATUS = %i\n", params); glGetProgramiv (programme, GL_ATTACHED_SHADERS, ¶ms); printf ("GL_ATTACHED_SHADERS = %i\n", params); glGetProgramiv (programme, GL_ACTIVE_ATTRIBUTES, ¶ms); printf ("GL_ACTIVE_ATTRIBUTES = %i\n", params); for (int i = 0; i < params; i++) { char name[64]; int max_length = 64; int actual_length = 0; int size = 0; GLenum type; glGetActiveAttrib ( programme, i, max_length, &actual_length, &size, &type, name ); if (size > 1) { for (int j = 0; j < size; j++) { char long_name[64]; sprintf (long_name, "%s[%i]", name, j); int location = glGetAttribLocation (programme, long_name); printf (" %i) type:%s name:%s location:%i\n", i, GL_type_to_string (type), long_name, location); } } else { int location = glGetAttribLocation (programme, name); printf (" %i) type:%s name:%s location:%i\n", i, GL_type_to_string (type), name, location); } } glGetProgramiv (programme, GL_ACTIVE_UNIFORMS, ¶ms); printf ("GL_ACTIVE_UNIFORMS = %i\n", params); for (int i = 0; i < params; i++) { char name[64]; int max_length = 64; int actual_length = 0; int size = 0; GLenum type; glGetActiveUniform ( programme, i, max_length, &actual_length, &size, &type, name ); if (size > 1) { for (int j = 0; j < size; j++) { char long_name[64]; sprintf (long_name, "%s[%i]", name, j); int location = glGetUniformLocation (programme, long_name); printf (" %i) type:%s name:%s location:%i\n", i, GL_type_to_string (type), long_name, location); } } else { int location = glGetUniformLocation (programme, name); printf (" %i) type:%s name:%s location:%i\n", i, GL_type_to_string (type), name, location); } } _print_programme_info_log (programme); } template VTKM_CONT_EXPORT void RenderTriangles(vtkm::Id numTri, const PtType &verts, const vtkm::cont::ArrayHandle< vtkm::Vec > &indices, const vtkm::cont::ArrayHandle &scalar, const vtkm::rendering::ColorTable &ct, const vtkm::Range &scalarRange, const vtkm::rendering::Camera &camera) { glewExperimental = GL_TRUE; glewInit(); vtkm::Float32 sMin = vtkm::Float32(scalarRange.Min); vtkm::Float32 sMax = vtkm::Float32(scalarRange.Max); vtkm::Float32 sDiff = sMax-sMin; vector data, colors; int method = 2; for (int i = 0; i < numTri; i++) { vtkm::Vec idx = indices.GetPortalConstControl().Get(i); vtkm::Id i1 = idx[1]; vtkm::Id i2 = idx[2]; vtkm::Id i3 = idx[3]; vtkm::Vec p1 = verts.GetPortalConstControl().Get(idx[1]); vtkm::Vec p2 = verts.GetPortalConstControl().Get(idx[2]); vtkm::Vec p3 = verts.GetPortalConstControl().Get(idx[3]); vtkm::Float32 s; Color color; s = scalar.GetPortalConstControl().Get(i1); s = (s-sMin)/sDiff; color = ct.MapRGB(s); data.push_back(p1[0]); data.push_back(p1[1]); data.push_back(p1[2]); if (method==0) { data.push_back(color.Components[0]); data.push_back(color.Components[1]); data.push_back(color.Components[2]); } else if (method == 2) { colors.push_back(color.Components[0]); colors.push_back(color.Components[1]); colors.push_back(color.Components[2]); } s = scalar.GetPortalConstControl().Get(i2); s = (s-sMin)/sDiff; color = ct.MapRGB(s); data.push_back(p2[0]); data.push_back(p2[1]); data.push_back(p2[2]); if (method==0) { data.push_back(color.Components[0]); data.push_back(color.Components[1]); data.push_back(color.Components[2]); } else if (method == 2) { colors.push_back(color.Components[0]); colors.push_back(color.Components[1]); colors.push_back(color.Components[2]); } s = scalar.GetPortalConstControl().Get(i3); s = (s-sMin)/sDiff; color = ct.MapRGB(s); data.push_back(p3[0]); data.push_back(p3[1]); data.push_back(p3[2]); if (method==0) { data.push_back(color.Components[0]); data.push_back(color.Components[1]); data.push_back(color.Components[2]); } else if (method == 2) { colors.push_back(color.Components[0]); colors.push_back(color.Components[1]); colors.push_back(color.Components[2]); } } cout<<"data.size()= "< viewM = camera.CreateViewMatrix(); //vtkm::Matrix viewM = vtkm::MatrixInverse(camera.CreateViewMatrix(), validV); vtkm::Matrix projM = camera.CreateProjectionMatrix(512,512); //vtkm::Matrix projM = vtkm::MatrixInverse(camera.CreateProjectionMatrix(512,512), validP); cout<<"Valid Inverse: "<