void setEnabled(bool value) { if (mIsEnabled != value) { mIsEnabled = value; onEnabledChange(); } }
bool RenderableGalaxy::initialize() { // Aspect is currently hardcoded to cubic voxels. _aspect = static_cast<glm::vec3>(_volumeDimensions); _aspect = _aspect / std::max(std::max(_aspect.x, _aspect.y), _aspect.z); RawVolumeReader<glm::tvec4<GLfloat>> reader(_volumeFilename, _volumeDimensions); _volume = reader.read(); _texture = std::make_unique<ghoul::opengl::Texture>( _volumeDimensions, ghoul::opengl::Texture::Format::RGBA, GL_RGBA32F, GL_FLOAT, ghoul::opengl::Texture::FilterMode::Linear, ghoul::opengl::Texture::WrappingMode::Clamp); _texture->setPixelData(reinterpret_cast<char*>(_volume->data()), ghoul::opengl::Texture::TakeOwnership::No); _texture->setDimensions(_volume->dimensions()); _texture->uploadTexture(); _raycaster = std::make_unique<GalaxyRaycaster>(*_texture); _raycaster->initialize(); OsEng.renderEngine().raycasterManager().attachRaycaster(*_raycaster.get()); std::function<void(bool)> onChange = [&](bool enabled) { if (enabled) { OsEng.renderEngine().raycasterManager().attachRaycaster(*_raycaster.get()); } else { OsEng.renderEngine().raycasterManager().detachRaycaster(*_raycaster.get()); } }; onEnabledChange(onChange); addProperty(_stepSize); addProperty(_pointStepSize); addProperty(_translation); addProperty(_rotation); addProperty(_enabledPointsRatio); // initialize points. std::ifstream pointFile(_pointsFilename, std::ios::in | std::ios::binary); std::vector<glm::vec3> pointPositions; std::vector<glm::vec3> pointColors; int64_t nPoints; pointFile.seekg(0, std::ios::beg); // read heder. pointFile.read(reinterpret_cast<char*>(&nPoints), sizeof(int64_t)); _nPoints = static_cast<size_t>(nPoints); size_t nFloats = _nPoints * 7; float* pointData = new float[nFloats]; pointFile.seekg(sizeof(int64_t), std::ios::beg); // read past heder. pointFile.read(reinterpret_cast<char*>(pointData), nFloats * sizeof(float)); pointFile.close(); float maxdist = 0; float x, y, z, r, g, b, a; for (size_t i = 0; i < _nPoints; ++i) { float x = pointData[i * 7 + 0]; float y = pointData[i * 7 + 1]; float z = pointData[i * 7 + 2]; float r = pointData[i * 7 + 3]; float g = pointData[i * 7 + 4]; float b = pointData[i * 7 + 5]; maxdist = std::max(maxdist, glm::length(glm::vec3(x, y, z))); //float a = pointData[i * 7 + 6]; alpha is not used. pointPositions.push_back(glm::vec3(x, y, z)); pointColors.push_back(glm::vec3(r, g, b)); } std::cout << maxdist << std::endl; delete[] pointData; glGenVertexArrays(1, &_pointsVao); glGenBuffers(1, &_positionVbo); glGenBuffers(1, &_colorVbo); glBindVertexArray(_pointsVao); glBindBuffer(GL_ARRAY_BUFFER, _positionVbo); glBufferData(GL_ARRAY_BUFFER, pointPositions.size()*sizeof(glm::vec3), pointPositions.data(), GL_STATIC_DRAW); glBindBuffer(GL_ARRAY_BUFFER, _colorVbo); glBufferData(GL_ARRAY_BUFFER, pointColors.size()*sizeof(glm::vec3), pointColors.data(), GL_STATIC_DRAW); RenderEngine& renderEngine = OsEng.renderEngine(); _pointsProgram = renderEngine.buildRenderProgram("Galaxy points", "${MODULE_GALAXY}/shaders/points.vs", "${MODULE_GALAXY}/shaders/points.fs", ghoul::Dictionary(), RenderEngine::RenderProgramType::Post); _pointsProgram->setIgnoreUniformLocationError(ghoul::opengl::ProgramObject::IgnoreError::Yes); GLint positionAttrib = _pointsProgram->attributeLocation("inPosition"); GLint colorAttrib = _pointsProgram->attributeLocation("inColor"); glBindBuffer(GL_ARRAY_BUFFER, _positionVbo); glEnableVertexAttribArray(positionAttrib); glVertexAttribPointer(positionAttrib, 3, GL_FLOAT, GL_FALSE, 0, 0); glBindBuffer(GL_ARRAY_BUFFER, _colorVbo); glEnableVertexAttribArray(colorAttrib); glVertexAttribPointer(colorAttrib, 3, GL_FLOAT, GL_FALSE, 0, 0); glBindBuffer(GL_ARRAY_BUFFER, 0); glBindVertexArray(0); return true; }