void ProjectCubemapToGeometryPass::replace_display_surface_geometry( DisplaySurfaceGeometry* geometry_parameters ) { freemoovr_assert( geometry_parameters!=NULL ); // Tear down usage of previous display surface geometry. if (_state_set.valid()) { if (_observerPositionUniform != NULL) { _state_set->removeUniform(_observerPositionUniform); } } if (_private_geometry.valid()) { _camera->removeChild( _private_geometry.get() ); } if (_inner_geode.valid()) { _public_geometry->removeChild(_inner_geode.get()); } // Use new display surface geometry. _geometry_parameters = geometry_parameters; _private_geometry = create_textured_geometry(); _camera->addChild( _private_geometry.get() ); _state_set = _private_geometry->getOrCreateStateSet(); _state_set->addUniform(_observerPositionUniform); _program = set_shader( _state_set, "ProjectCubemapToGeometryPass.vert", "ProjectCubemapToGeometryPass.frag"); _inner_geode = _create_textured_geometry_inner_geode(); _public_geometry->addChild(_inner_geode.get()); }
ProjectCubemapToGeometryPass::ProjectCubemapToGeometryPass(std::string flyvr_basepath, osg::TextureCubeMap* texture, osg::Uniform::Callback* observer_position_cb, DisplaySurfaceGeometry* geometry_parameters, unsigned int tex_width, unsigned int tex_height) : _geometry_parameters( geometry_parameters), _tex_width(tex_width), _tex_height(tex_height), _observer_position_callback(observer_position_cb) { flyvr_assert( texture!=NULL ); flyvr_assert( geometry_parameters!=NULL ); set_flyvr_base_path(flyvr_basepath); set_plugin_path(flyvr_basepath,false); _top = new osg::Group; _top->addDescription("ProjectCubemapToGeometryPass top node"); _in_texture_cubemap = texture; create_output_texture(); _camera = new osg::Camera; setup_camera(); _geometry = create_textured_geometry(); _camera->addChild( _geometry.get() ); _top->addChild( _camera ); set_shader( "ProjectCubemapToGeometryPass.vert", "ProjectCubemapToGeometryPass.frag"); }
ProjectCubemapToGeometryPass::ProjectCubemapToGeometryPass(std::string freemoovr_basepath, osg::TextureCubeMap* texture, osg::Uniform::Callback* observer_position_cb, DisplaySurfaceGeometry* geometry_parameters, unsigned int tex_width, unsigned int tex_height) : _geometry_parameters( geometry_parameters), _tex_width(tex_width), _tex_height(tex_height), _observer_position_callback(observer_position_cb) { freemoovr_assert( texture!=NULL ); freemoovr_assert( geometry_parameters!=NULL ); set_freemoovr_base_path(freemoovr_basepath); _top = new osg::Group; _top->addDescription("ProjectCubemapToGeometryPass top node"); _in_texture_cubemap = texture; _observerPositionUniform = new osg::Uniform( "ObserverPosition", osg::Vec3(0.22f, 0.22f, 0.9f) ); if (_observer_position_callback!=NULL) { _observerPositionUniform->setUpdateCallback(_observer_position_callback); } create_output_texture(); _camera = new osg::Camera; setup_camera(); _private_geometry = create_textured_geometry(); _camera->addChild( _private_geometry.get() ); _top->addChild( _camera ); _state_set = _private_geometry->getOrCreateStateSet(); _state_set->addUniform(_observerPositionUniform); _program = set_shader( _state_set, "ProjectCubemapToGeometryPass.vert", "ProjectCubemapToGeometryPass.frag"); _public_geometry = new osg::Group; _public_geometry->addDescription("ProjectCubemapToGeometryPass output textured geometry top node"); _inner_geode = _create_textured_geometry_inner_geode(); _public_geometry->addChild(_inner_geode.get()); }