height_field_tessellator::height_field_tessellator(const gl::render_device_ptr& device) : _pixel_tolerance(4.0f) { using namespace scm; using namespace scm::gl; using namespace scm::math; using boost::assign::list_of; // state objects ////////////////////////////////////////////////////////////////////////////// _bstate_no_blend = device->create_blend_state(false, FUNC_ONE, FUNC_ZERO, FUNC_ONE, FUNC_ZERO); _bstate_omsa = device->create_blend_state(true, FUNC_SRC_ALPHA, FUNC_ONE_MINUS_SRC_ALPHA, FUNC_ONE, FUNC_ZERO); _dstate_less = device->create_depth_stencil_state(true, true, COMPARISON_LESS); _rstate_ms_wire = device->create_rasterizer_state(FILL_WIREFRAME, CULL_NONE, ORIENT_CCW, true); _rstate_ms_solid = device->create_rasterizer_state(FILL_SOLID, CULL_NONE, ORIENT_CCW, true); _rstate_ms_solid_ss = device->create_rasterizer_state(FILL_SOLID, CULL_NONE, ORIENT_CCW, true, true, 1.0f); //_rstate_ms_wire = device->create_rasterizer_state(FILL_WIREFRAME, CULL_BACK, ORIENT_CCW, true); //_rstate_ms_solid = device->create_rasterizer_state(FILL_SOLID, CULL_BACK, ORIENT_CCW, true); _sstate_nearest = device->create_sampler_state(FILTER_MIN_MAG_NEAREST, WRAP_CLAMP_TO_EDGE); _sstate_linear = device->create_sampler_state(FILTER_MIN_MAG_LINEAR, WRAP_CLAMP_TO_EDGE); _sstate_linear_mip = device->create_sampler_state(FILTER_MIN_MAG_MIP_LINEAR, WRAP_CLAMP_TO_EDGE); if ( !_bstate_no_blend || !_bstate_omsa || !_dstate_less || !_rstate_ms_wire || !_rstate_ms_solid || !_sstate_nearest || !_sstate_linear || !_sstate_linear_mip) { throw (std::runtime_error("height_field_tessellator::height_field_tessellator(): error creating state objects")); } gl::camera_uniform_block::add_block_include_string(device); device->add_include_files("./../../../src/renderers/shaders", "/scm/data"); // ray casting program //////////////////////////////////////////////////////////////////////// _hf_quad_tessellation_program = device->create_program( list_of(device->create_shader_from_file(STAGE_VERTEX_SHADER, "../../../src/renderers/shaders/height_field/tessellate.glslv")) (device->create_shader_from_file(STAGE_TESS_CONTROL_SHADER, "../../../src/renderers/shaders/height_field/tessellate_quad.glsltc")) (device->create_shader_from_file(STAGE_TESS_EVALUATION_SHADER, "../../../src/renderers/shaders/height_field/tessellate_quad.glslte")) (device->create_shader_from_file(STAGE_GEOMETRY_SHADER, "../../../src/renderers/shaders/height_field/tessellate.glslg")) (device->create_shader_from_file(STAGE_FRAGMENT_SHADER, "../../../src/renderers/shaders/height_field/tessellate.glslf")), "height_field_tessellator::hf_quad_tessellation_program"); _hf_triangle_tessellation_program = device->create_program( list_of(device->create_shader_from_file(STAGE_VERTEX_SHADER, "../../../src/renderers/shaders/height_field/tessellate.glslv")) (device->create_shader_from_file(STAGE_TESS_CONTROL_SHADER, "../../../src/renderers/shaders/height_field/tessellate_tri.glsltc", shader_macro("PRIMITIVE_ID_REPRO", "0"))) (device->create_shader_from_file(STAGE_TESS_EVALUATION_SHADER, "../../../src/renderers/shaders/height_field/tessellate_tri.glslte")) (device->create_shader_from_file(STAGE_GEOMETRY_SHADER, "../../../src/renderers/shaders/height_field/tessellate.glslg")) (device->create_shader_from_file(STAGE_FRAGMENT_SHADER, "../../../src/renderers/shaders/height_field/tessellate.glslf")), //separate_stream_capture("per_vertex.vertex.ws_position"), //interleaved_stream_capture("per_vertex.vertex.ws_position")("per_vertex.vertex.texcoord_hm"), //interleaved_stream_capture("per_vertex.vertex.ws_position")("per_vertex.vertex.texcoord_hm")(stream_capture::skip_4_float), // GL4+ only //stream_capture_array("per_vertex.vertex.ws_position") //stream_capture_array("per_vertex.vertex.ws_position")("per_vertex.vertex.texcoord_hm")("per_vertex.vertex.texcoord_dm"), //stream_capture_array(interleaved_stream_capture("per_vertex.vertex.ws_position")("per_vertex.vertex.texcoord_hm")) // (separate_stream_capture("per_vertex.vertex.texcoord_dm")), //stream_capture_array(interleaved_stream_capture("per_vertex.vertex.ws_position")("per_vertex.vertex.texcoord_hm")(stream_capture::skip_4_float)) // (separate_stream_capture("per_vertex.vertex.texcoord_dm")), "height_field_tessellator::hf_triangle_tessellation_program"); if ( !_hf_quad_tessellation_program || !_hf_triangle_tessellation_program) { throw (std::runtime_error("height_field_ray_caster::height_field_ray_caster(): error creating quad or triangle program")); } // set default uniforms _hf_quad_tessellation_program->uniform_buffer("camera_matrices", 0); _hf_quad_tessellation_program->uniform_sampler("height_map", 0); _hf_quad_tessellation_program->uniform_sampler("height_map_nearest", 1); _hf_quad_tessellation_program->uniform_sampler("density_map", 2); _hf_quad_tessellation_program->uniform_sampler("color_map", 3); // set default uniforms _hf_triangle_tessellation_program->uniform_buffer("camera_matrices", 0); _hf_triangle_tessellation_program->uniform_sampler("height_map", 0); _hf_triangle_tessellation_program->uniform_sampler("height_map_nearest", 1); _hf_triangle_tessellation_program->uniform_sampler("density_map", 2); _hf_triangle_tessellation_program->uniform_sampler("color_map", 3); _hf_triangle_tessellation_program->uniform_sampler("edge_densities", 4); _main_camera_block.reset(new gl::camera_uniform_block(device)); }