diff options
Diffstat (limited to 'servers/visual/visual_server_raster.cpp')
-rw-r--r-- | servers/visual/visual_server_raster.cpp | 438 |
1 files changed, 219 insertions, 219 deletions
diff --git a/servers/visual/visual_server_raster.cpp b/servers/visual/visual_server_raster.cpp index ec468b5e04..c9695b7859 100644 --- a/servers/visual/visual_server_raster.cpp +++ b/servers/visual/visual_server_raster.cpp @@ -45,7 +45,7 @@ BalloonAllocator<> *VisualServerRaster::OctreeAllocator::allocator=NULL; RID VisualServerRaster::texture_create() { - + return rasterizer->texture_create(); } @@ -340,7 +340,7 @@ VisualServerRaster::FixedMaterialLightShader VisualServerRaster::fixed_material_ -/* MESH API */ +/* MESH API */ RID VisualServerRaster::mesh_create() { @@ -625,14 +625,14 @@ RID VisualServerRaster::particles_create() { void VisualServerRaster::particles_set_amount(RID p_particles, int p_amount) { VS_CHANGED; - rasterizer->particles_set_amount(p_particles,p_amount); + rasterizer->particles_set_amount(p_particles,p_amount); } int VisualServerRaster::particles_get_amount(RID p_particles) const { return rasterizer->particles_get_amount(p_particles); } - + void VisualServerRaster::particles_set_emitting(RID p_particles, bool p_emitting) { VS_CHANGED; rasterizer->particles_set_emitting(p_particles,p_emitting); @@ -641,7 +641,7 @@ bool VisualServerRaster::particles_is_emitting(RID p_particles) const { return rasterizer->particles_is_emitting(p_particles); } - + void VisualServerRaster::particles_set_visibility_aabb(RID p_particles, const AABB& p_visibility) { VS_CHANGED; rasterizer->particles_set_visibility_aabb(p_particles, p_visibility); @@ -650,7 +650,7 @@ AABB VisualServerRaster::particles_get_visibility_aabb(RID p_particles) const { return rasterizer->particles_get_visibility_aabb(p_particles); } - + void VisualServerRaster::particles_set_emission_half_extents(RID p_particles, const Vector3& p_half_extents) { VS_CHANGED; rasterizer->particles_set_emission_half_extents(p_particles,p_half_extents); @@ -688,7 +688,7 @@ Vector3 VisualServerRaster::particles_get_gravity_normal(RID p_particles) const return rasterizer->particles_get_gravity_normal(p_particles); } - + void VisualServerRaster::particles_set_variable(RID p_particles, ParticleVariable p_variable,float p_value) { VS_CHANGED; rasterizer->particles_set_variable(p_particles,p_variable,p_value); @@ -770,7 +770,7 @@ RID VisualServerRaster::particles_get_material(RID p_particles) const { return rasterizer->particles_get_material(p_particles); } - + void VisualServerRaster::particles_set_height_from_velocity(RID p_particles, bool p_enable) { @@ -812,33 +812,33 @@ void VisualServerRaster::light_set_color(RID p_light,LightColor p_type, const Co } Color VisualServerRaster::light_get_color(RID p_light,LightColor p_type) const { - + return rasterizer->light_get_color(p_light,p_type); - + } void VisualServerRaster::light_set_shadow(RID p_light,bool p_enabled) { VS_CHANGED; - rasterizer->light_set_shadow(p_light,p_enabled); + rasterizer->light_set_shadow(p_light,p_enabled); } bool VisualServerRaster::light_has_shadow(RID p_light) const { return rasterizer->light_has_shadow(p_light); -} +} void VisualServerRaster::light_set_volumetric(RID p_light,bool p_enabled) { VS_CHANGED; - rasterizer->light_set_volumetric(p_light,p_enabled); + rasterizer->light_set_volumetric(p_light,p_enabled); } bool VisualServerRaster::light_is_volumetric(RID p_light) const { return rasterizer->light_is_volumetric(p_light); -} +} void VisualServerRaster::light_set_projector(RID p_light,RID p_texture) { VS_CHANGED; @@ -854,13 +854,13 @@ void VisualServerRaster::light_set_param(RID p_light, LightParam p_var, float p_ VS_CHANGED; rasterizer->light_set_var(p_light,p_var,p_value); _dependency_queue_update(p_light,true); - + } float VisualServerRaster::light_get_param(RID p_light, LightParam p_var) const { - - return rasterizer->light_get_var(p_light,p_var); + + return rasterizer->light_get_var(p_light,p_var); } void VisualServerRaster::light_set_operator(RID p_light,LightOp p_op) { @@ -940,7 +940,7 @@ Transform VisualServerRaster::skeleton_bone_get_transform(RID p_skeleton,int p_b return rasterizer->skeleton_bone_get_transform(p_skeleton,p_bone); } - + /* VISIBILITY API */ @@ -970,7 +970,7 @@ BSP_Tree VisualServerRaster::room_get_bounds(RID p_room) const { return room->bounds; } - + /* PORTAL API */ RID VisualServerRaster::portal_create() { @@ -1422,7 +1422,7 @@ void VisualServerRaster::camera_set_perspective(RID p_camera,float p_fovy_degree camera->fov=p_fovy_degrees; camera->znear=p_z_near; camera->zfar=p_z_far; - + } void VisualServerRaster::camera_set_orthogonal(RID p_camera,float p_size, float p_z_near, float p_z_far) { @@ -1440,7 +1440,7 @@ void VisualServerRaster::camera_set_transform(RID p_camera,const Transform& p_tr Camera *camera = camera_owner.get( p_camera ); ERR_FAIL_COND(!camera); camera->transform=p_transform.orthonormalized(); - + } @@ -1502,7 +1502,7 @@ RID VisualServerRaster::viewport_create() { Viewport *viewport = memnew( Viewport ); RID rid = viewport_owner.make_rid( viewport ); ERR_FAIL_COND_V( !rid.is_valid(), rid ); - + viewport->self=rid; viewport->hide_scenario=false; viewport->hide_canvas=false; @@ -1670,7 +1670,7 @@ void VisualServerRaster::viewport_set_rect(RID p_viewport,const ViewportRect& p_ viewport = viewport_owner.get( p_viewport ); ERR_FAIL_COND(!viewport); - + viewport->rect=p_rect; if (viewport->render_target.is_valid()) { rasterizer->render_target_set_size(viewport->render_target,viewport->rect.width,viewport->rect.height); @@ -1684,7 +1684,7 @@ VisualServer::ViewportRect VisualServerRaster::viewport_get_rect(RID p_viewport) viewport = viewport_owner.get( p_viewport ); ERR_FAIL_COND_V(!viewport, ViewportRect()); - + return viewport->rect; } @@ -1736,11 +1736,11 @@ void VisualServerRaster::viewport_attach_camera(RID p_viewport,RID p_camera) { - + if (p_camera.is_valid()) { ERR_FAIL_COND(!camera_owner.owns(p_camera)); - // a camera + // a camera viewport->camera=p_camera; } else { viewport->camera=RID(); @@ -1773,7 +1773,7 @@ RID VisualServerRaster::viewport_get_attached_camera(RID p_viewport) const { viewport = viewport_owner.get( p_viewport ); ERR_FAIL_COND_V(!viewport, RID()); - + return viewport->camera; } @@ -1862,7 +1862,7 @@ void VisualServerRaster::viewport_remove_canvas(RID p_viewport,RID p_canvas) { viewport = viewport_owner.get( p_viewport ); ERR_FAIL_COND(!viewport); - Canvas *canvas = canvas_owner.get( p_canvas ); + Canvas *canvas = canvas_owner.get( p_canvas ); ERR_FAIL_COND(!canvas); @@ -1894,7 +1894,7 @@ void VisualServerRaster::viewport_set_canvas_layer(RID p_viewport,RID p_canvas,i } E->get().layer=p_layer; - + } void VisualServerRaster::viewport_set_transparent_background(RID p_viewport,bool p_enabled) { @@ -1916,13 +1916,13 @@ bool VisualServerRaster::viewport_has_transparent_background(RID p_viewport) con RID VisualServerRaster::viewport_get_scenario(RID p_viewport) const { - + const Viewport *viewport=NULL; viewport = viewport_owner.get( p_viewport ); ERR_FAIL_COND_V(!viewport, RID()); - - return viewport->scenario; + + return viewport->scenario; } @@ -1976,38 +1976,38 @@ Variant VisualServerRaster::environment_fx_get_param(RID p_env,EnvironmentFxPara void VisualServerRaster::_dependency_queue_update(RID p_rid,bool p_update_aabb) { Map< RID, Set<RID> >::Element * E = instance_dependency_map.find( p_rid ); - + if (!E) return; - - + + Set<RID>::Element *I = E->get().front(); - + while(I) { - + Instance *ins = instance_owner.get( I->get() ); _instance_queue_update( ins , p_update_aabb ); - + I = I->next(); } - + } void VisualServerRaster::_instance_queue_update(Instance *p_instance,bool p_update_aabb) { if (p_update_aabb) p_instance->update_aabb=true; - + if (p_instance->update) return; p_instance->update_next=instance_update_list; instance_update_list=p_instance; p_instance->update=true; - + } RID VisualServerRaster::scenario_create() { - + Scenario *scenario = memnew( Scenario ); ERR_FAIL_COND_V(!scenario,RID()); RID scenario_rid = scenario_owner.make_rid( scenario ); @@ -2449,10 +2449,10 @@ void VisualServerRaster::instance_set_transform(RID p_instance, const Transform& VS_CHANGED; Instance *instance = instance_owner.get( p_instance ); ERR_FAIL_COND( !instance ); - + if (p_transform==instance->data.transform) // must improve somehow return; - + instance->data.transform=p_transform; if (instance->base_type==INSTANCE_LIGHT) instance->data.transform.orthonormalize(); @@ -2464,7 +2464,7 @@ Transform VisualServerRaster::instance_get_transform(RID p_instance) const { Instance *instance = instance_owner.get( p_instance ); ERR_FAIL_COND_V( !instance, Transform() ); - + return instance->data.transform; } @@ -2574,7 +2574,7 @@ void VisualServerRaster::instance_set_room( RID p_instance, RID p_room ) { ERR_EXPLAIN("Cycle in room assignment"); ERR_FAIL_COND( parent == room ); parent=parent->room; - } + } } if ( (1<<instance->base_type) & INSTANCE_GEOMETRY_MASK ) { @@ -2634,45 +2634,45 @@ real_t VisualServerRaster::instance_get_extra_visibility_margin( RID p_instance Vector<RID> VisualServerRaster::instances_cull_aabb(const AABB& p_aabb, RID p_scenario) const { - + Vector<RID> instances; Scenario *scenario=scenario_owner.get(p_scenario); - ERR_FAIL_COND_V(!scenario,instances); - + ERR_FAIL_COND_V(!scenario,instances); + const_cast<VisualServerRaster*>(this)->_update_instances(); // check dirty instances before culling - + int culled=0; Instance *cull[1024]; culled=scenario->octree.cull_AABB(p_aabb,cull,1024); - + for (int i=0;i<culled;i++) { - + Instance *instance=cull[i]; ERR_CONTINUE(!instance); instances.push_back(instance->self); } - + return instances; } Vector<RID> VisualServerRaster::instances_cull_ray(const Vector3& p_from, const Vector3& p_to, RID p_scenario) const{ Vector<RID> instances; Scenario *scenario=scenario_owner.get(p_scenario); - ERR_FAIL_COND_V(!scenario,instances); + ERR_FAIL_COND_V(!scenario,instances); const_cast<VisualServerRaster*>(this)->_update_instances(); // check dirty instances before culling - + int culled=0; - Instance *cull[1024]; + Instance *cull[1024]; culled=scenario->octree.cull_segment(p_from,p_to*10000,cull,1024); for (int i=0;i<culled;i++) { - + Instance *instance=cull[i]; ERR_CONTINUE(!instance); instances.push_back(instance->self); } - + return instances; } @@ -2680,22 +2680,22 @@ Vector<RID> VisualServerRaster::instances_cull_convex(const Vector<Plane>& p_con Vector<RID> instances; Scenario *scenario=scenario_owner.get(p_scenario); - ERR_FAIL_COND_V(!scenario,instances); + ERR_FAIL_COND_V(!scenario,instances); const_cast<VisualServerRaster*>(this)->_update_instances(); // check dirty instances before culling - + int culled=0; - Instance *cull[1024]; - + Instance *cull[1024]; + culled=scenario->octree.cull_convex(p_convex,cull,1024); - + for (int i=0;i<culled;i++) { - + Instance *instance=cull[i]; - ERR_CONTINUE(!instance); + ERR_CONTINUE(!instance); instances.push_back(instance->self); } - + return instances; } @@ -2976,9 +2976,9 @@ void VisualServerRaster::_update_instance(Instance *p_instance) { p_instance->version++; if (p_instance->base_type == INSTANCE_LIGHT) { - + rasterizer->light_instance_set_transform( p_instance->light_info->instance, p_instance->data.transform ); - + } if (p_instance->aabb.has_no_surface()) @@ -2986,10 +2986,10 @@ void VisualServerRaster::_update_instance(Instance *p_instance) { if (p_instance->base_type == INSTANCE_PARTICLES) { - + rasterizer->particles_instance_set_transform( p_instance->particles_info->instance, p_instance->data.transform ); } - + if ((1<<p_instance->base_type)&INSTANCE_GEOMETRY_MASK) { @@ -3041,7 +3041,7 @@ void VisualServerRaster::_update_instance(Instance *p_instance) { else portal_aabb.expand_to(point); } - + portal_aabb.grow_by(p_instance->portal_info->portal->connect_range); new_aabb = portal_aabb; @@ -3117,7 +3117,7 @@ void VisualServerRaster::_update_instance(Instance *p_instance) { } if (p_instance->base_type==INSTANCE_PORTAL) { - + _portal_attempt_connect(p_instance); } @@ -3138,18 +3138,18 @@ void VisualServerRaster::_update_instance(Instance *p_instance) { void VisualServerRaster::_update_instance_aabb(Instance *p_instance) { AABB new_aabb; - + ERR_FAIL_COND(p_instance->base_type!=INSTANCE_NONE && !p_instance->base_rid.is_valid()); - + switch(p_instance->base_type) { case VisualServer::INSTANCE_NONE: { // do nothing } break; case VisualServer::INSTANCE_MESH: { - + new_aabb = rasterizer->mesh_get_aabb(p_instance->base_rid,p_instance->data.skeleton); - + } break; case VisualServer::INSTANCE_MULTIMESH: { @@ -3163,41 +3163,41 @@ void VisualServerRaster::_update_instance_aabb(Instance *p_instance) { } break; case VisualServer::INSTANCE_PARTICLES: { - + new_aabb = rasterizer->particles_get_aabb(p_instance->base_rid); - + } break; case VisualServer::INSTANCE_LIGHT: { - + new_aabb = rasterizer->light_get_aabb(p_instance->base_rid); - + } break; case VisualServer::INSTANCE_ROOM: { - + Room *room = room_owner.get( p_instance->base_rid ); ERR_FAIL_COND(!room); new_aabb=room->bounds.get_aabb(); - + } break; case VisualServer::INSTANCE_PORTAL: { - + Portal *portal = portal_owner.get( p_instance->base_rid ); - ERR_FAIL_COND(!portal); + ERR_FAIL_COND(!portal); for (int i=0;i<portal->shape.size();i++) { - + Vector3 point( portal->shape[i].x, portal->shape[i].y, 0 ); if (i==0) { - + new_aabb.pos=point; new_aabb.size.z=0.01; // make it not flat for octree } else { - + new_aabb.expand_to(point); } } - } break; + } break; case VisualServer::INSTANCE_BAKED_LIGHT: { BakedLight *baked_light = baked_light_owner.get( p_instance->base_rid ); @@ -3220,24 +3220,24 @@ void VisualServerRaster::_update_instance_aabb(Instance *p_instance) { if (p_instance->extra_margin) new_aabb.grow_by(p_instance->extra_margin); - + p_instance->aabb=new_aabb; - + } void VisualServerRaster::_update_instances() { while(instance_update_list) { - + Instance *instance=instance_update_list; instance_update_list=instance_update_list->update_next; - + if (instance->update_aabb) _update_instance_aabb(instance); - + _update_instance(instance); - + instance->update=false; instance->update_aabb=false; instance->update_next=0; @@ -3277,7 +3277,7 @@ RID VisualServerRaster::canvas_create() { Canvas * canvas = memnew( Canvas ); ERR_FAIL_COND_V(!canvas,RID()); RID rid = canvas_owner.make_rid( canvas ); - + return rid; } @@ -3317,10 +3317,10 @@ void VisualServerRaster::canvas_set_modulate(RID p_canvas,const Color& p_color) RID VisualServerRaster::canvas_item_create() { - + CanvasItem *canvas_item = memnew( CanvasItem ); ERR_FAIL_COND_V(!canvas_item,RID()); - + return canvas_item_owner.make_rid( canvas_item ); } @@ -3448,7 +3448,7 @@ void VisualServerRaster::canvas_item_set_rect(RID p_item, const Rect2& p_rect) { VS_CHANGED; CanvasItem *canvas_item = canvas_item_owner.get( p_item ); ERR_FAIL_COND(!canvas_item); - + canvas_item->rect=p_rect; }*/ @@ -3456,7 +3456,7 @@ void VisualServerRaster::canvas_item_set_clip(RID p_item, bool p_clip) { VS_CHANGED; CanvasItem *canvas_item = canvas_item_owner.get( p_item ); ERR_FAIL_COND(!canvas_item); - + canvas_item->clip=p_clip; } @@ -3543,7 +3543,7 @@ void VisualServerRaster::canvas_item_add_line(RID p_item, const Point2& p_from, VS_CHANGED; CanvasItem *canvas_item = canvas_item_owner.get( p_item ); ERR_FAIL_COND(!canvas_item); - + CanvasItem::CommandLine * line = memnew( CanvasItem::CommandLine ); ERR_FAIL_COND(!line); line->color=p_color; @@ -3552,15 +3552,15 @@ void VisualServerRaster::canvas_item_add_line(RID p_item, const Point2& p_from, line->width=p_width; canvas_item->rect_dirty=true; - - canvas_item->commands.push_back(line); + + canvas_item->commands.push_back(line); } void VisualServerRaster::canvas_item_add_rect(RID p_item, const Rect2& p_rect, const Color& p_color) { VS_CHANGED; CanvasItem *canvas_item = canvas_item_owner.get( p_item ); ERR_FAIL_COND(!canvas_item); - + CanvasItem::CommandRect * rect = memnew( CanvasItem::CommandRect ); ERR_FAIL_COND(!rect); rect->modulate=p_color; @@ -3590,7 +3590,7 @@ void VisualServerRaster::canvas_item_add_texture_rect(RID p_item, const Rect2& p VS_CHANGED; CanvasItem *canvas_item = canvas_item_owner.get( p_item ); ERR_FAIL_COND(!canvas_item); - + CanvasItem::CommandRect * rect = memnew( CanvasItem::CommandRect ); ERR_FAIL_COND(!rect); rect->modulate=p_modulate; @@ -3622,7 +3622,7 @@ void VisualServerRaster::canvas_item_add_texture_rect_region(RID p_item, const R VS_CHANGED; CanvasItem *canvas_item = canvas_item_owner.get( p_item ); ERR_FAIL_COND(!canvas_item); - + CanvasItem::CommandRect * rect = memnew( CanvasItem::CommandRect ); ERR_FAIL_COND(!rect); rect->modulate=p_modulate; @@ -3648,8 +3648,8 @@ void VisualServerRaster::canvas_item_add_texture_rect_region(RID p_item, const R canvas_item->rect_dirty=true; - canvas_item->commands.push_back(rect); - + canvas_item->commands.push_back(rect); + } void VisualServerRaster::canvas_item_add_style_box(RID p_item, const Rect2& p_rect, RID p_texture,const Vector2& p_topleft, const Vector2& p_bottomright, bool p_draw_center,const Color& p_modulate) { @@ -3657,7 +3657,7 @@ void VisualServerRaster::canvas_item_add_style_box(RID p_item, const Rect2& p_re VS_CHANGED; CanvasItem *canvas_item = canvas_item_owner.get( p_item ); ERR_FAIL_COND(!canvas_item); - + CanvasItem::CommandStyle * style = memnew( CanvasItem::CommandStyle ); ERR_FAIL_COND(!style); style->texture=p_texture; @@ -3670,13 +3670,13 @@ void VisualServerRaster::canvas_item_add_style_box(RID p_item, const Rect2& p_re style->margin[MARGIN_BOTTOM]=p_bottomright.y; canvas_item->rect_dirty=true; - canvas_item->commands.push_back(style); + canvas_item->commands.push_back(style); } void VisualServerRaster::canvas_item_add_primitive(RID p_item,const Vector<Point2>& p_points, const Vector<Color>& p_colors,const Vector<Point2>& p_uvs, RID p_texture,float p_width) { VS_CHANGED; CanvasItem *canvas_item = canvas_item_owner.get( p_item ); ERR_FAIL_COND(!canvas_item); - + CanvasItem::CommandPrimitive * prim = memnew( CanvasItem::CommandPrimitive ); ERR_FAIL_COND(!prim); prim->texture=p_texture; @@ -3686,7 +3686,7 @@ void VisualServerRaster::canvas_item_add_primitive(RID p_item,const Vector<Point prim->width=p_width; canvas_item->rect_dirty=true; - canvas_item->commands.push_back(prim); + canvas_item->commands.push_back(prim); } void VisualServerRaster::canvas_item_add_polygon(RID p_item, const Vector<Point2>& p_points, const Vector<Color>& p_colors,const Vector<Point2>& p_uvs, RID p_texture) { @@ -3907,10 +3907,10 @@ void VisualServerRaster::canvas_item_clear(RID p_item) { VS_CHANGED; CanvasItem *canvas_item = canvas_item_owner.get( p_item ); ERR_FAIL_COND(!canvas_item); - - + + canvas_item->clear(); - + } void VisualServerRaster::canvas_item_raise(RID p_item) { @@ -4398,7 +4398,7 @@ void VisualServerRaster::black_bars_set_images(RID p_left, RID p_top, RID p_righ void VisualServerRaster::_free_attached_instances(RID p_rid,bool p_free_scenario) { Map< RID, Set<RID> >::Element * E = instance_dependency_map.find( p_rid ); - + if (E) { // has instances while( E->get().size() ) { @@ -4407,10 +4407,10 @@ void VisualServerRaster::_free_attached_instances(RID p_rid,bool p_free_scenario instance_set_scenario( E->get().front()->get(), RID() ); else instance_set_base( E->get().front()->get(), RID() ); - + } } - + instance_dependency_map.erase(p_rid); } @@ -4452,7 +4452,7 @@ void VisualServerRaster::free( RID p_rid ) { VS_CHANGED; if (rasterizer->is_texture(p_rid) || rasterizer->is_material(p_rid) || rasterizer->is_shader(p_rid) || rasterizer->is_environment(p_rid)) { - + rasterizer->free(p_rid); } else if (rasterizer->is_skeleton(p_rid)) { @@ -4470,14 +4470,14 @@ void VisualServerRaster::free( RID p_rid ) { rasterizer->free(p_rid); } else if (rasterizer->is_mesh(p_rid) || rasterizer->is_multimesh(p_rid) || rasterizer->is_light(p_rid) || rasterizer->is_particles(p_rid) || rasterizer->is_immediate(p_rid)) { //delete the resource - + _free_attached_instances(p_rid); rasterizer->free(p_rid); } else if (room_owner.owns(p_rid)) { _free_attached_instances(p_rid); - Room *room = room_owner.get(p_rid); - ERR_FAIL_COND(!room); + Room *room = room_owner.get(p_rid); + ERR_FAIL_COND(!room); room_owner.free(p_rid); memdelete(room); @@ -4515,16 +4515,16 @@ void VisualServerRaster::free( RID p_rid ) { } else if (camera_owner.owns(p_rid)) { // delete te camera - + Camera *camera = camera_owner.get(p_rid); ERR_FAIL_COND(!camera); - + camera_owner.free( p_rid ); memdelete(camera); - + } else if (viewport_owner.owns(p_rid)) { // delete the viewport - + Viewport *viewport = viewport_owner.get( p_rid ); ERR_FAIL_COND(!viewport); @@ -4549,15 +4549,15 @@ void VisualServerRaster::free( RID p_rid ) { viewport->canvas_map.erase(viewport->canvas_map.front()); } - - viewport_owner.free(p_rid); + + viewport_owner.free(p_rid); memdelete(viewport); - + } else if (instance_owner.owns(p_rid)) { // delete the instance - + _update_instances(); // be sure - + Instance *instance = instance_owner.get(p_rid); ERR_FAIL_COND(!instance); @@ -4572,9 +4572,9 @@ void VisualServerRaster::free( RID p_rid ) { instance_owner.free(p_rid); memdelete(instance); - + } else if (canvas_owner.owns(p_rid)) { - + Canvas *canvas = canvas_owner.get(p_rid); ERR_FAIL_COND(!canvas); @@ -4606,11 +4606,11 @@ void VisualServerRaster::free( RID p_rid ) { } canvas_owner.free( p_rid ); - + memdelete( canvas ); - + } else if (canvas_item_owner.owns(p_rid)) { - + CanvasItem *canvas_item = canvas_item_owner.get(p_rid); ERR_FAIL_COND(!canvas_item); @@ -4638,7 +4638,7 @@ void VisualServerRaster::free( RID p_rid ) { } canvas_item_owner.free( p_rid ); - + memdelete( canvas_item ); } else if (canvas_item_material_owner.owns(p_rid)) { @@ -4710,22 +4710,22 @@ void VisualServerRaster::free( RID p_rid ) { memdelete(occluder_poly); } else if (scenario_owner.owns(p_rid)) { - + Scenario *scenario=scenario_owner.get(p_rid); ERR_FAIL_COND(!scenario); - + _update_instances(); // be sure _free_attached_instances(p_rid,true); - + //rasterizer->free( scenario->environment ); scenario_owner.free(p_rid); memdelete(scenario); - + } else { - + ERR_FAIL(); } - + } @@ -4747,7 +4747,7 @@ void VisualServerRaster::_instance_draw(Instance *p_instance) { switch(p_instance->base_type) { - + case INSTANCE_MESH: { const float *morphs = NULL; if (!p_instance->data.morph_values.empty()) { @@ -4755,7 +4755,7 @@ void VisualServerRaster::_instance_draw(Instance *p_instance) { } rasterizer->add_mesh(p_instance->base_rid, &p_instance->data); - } break; + } break; case INSTANCE_MULTIMESH: { rasterizer->add_multimesh(p_instance->base_rid, &p_instance->data); } break; @@ -4865,17 +4865,17 @@ Vector<Plane> VisualServerRaster::_camera_generate_orthogonal_planes(Instance *p void VisualServerRaster::_light_instance_update_pssm_shadow(Instance *p_light,Scenario *p_scenario,Camera *p_camera,const CullRange& p_cull_range) { int splits = rasterizer->light_instance_get_shadow_passes( p_light->light_info->instance ); - + float split_weight=rasterizer->light_directional_get_shadow_param(p_light->base_rid,LIGHT_DIRECTIONAL_SHADOW_PARAM_PSSM_SPLIT_WEIGHT); float distances[5]; float texsize=rasterizer->light_instance_get_shadow_size( p_light->light_info->instance ); - + // float cull_min=p_cull_range.min; //float cull_max=p_cull_range.max; - + bool overlap = rasterizer->light_instance_get_pssm_shadow_overlap(p_light->light_info->instance); float cull_min=p_camera->znear; @@ -4883,7 +4883,7 @@ void VisualServerRaster::_light_instance_update_pssm_shadow(Instance *p_light,Sc float max_dist = rasterizer->light_directional_get_shadow_param(p_light->base_rid,VS::LIGHT_DIRECTIONAL_SHADOW_PARAM_MAX_DISTANCE); if (max_dist>0.0) cull_max=MIN(cull_max,max_dist); - + for(int i = 0; i < splits; i++) { float idm = i / (float)splits; float lg = cull_min * Math::pow(cull_max/cull_min, idm); @@ -4894,16 +4894,16 @@ void VisualServerRaster::_light_instance_update_pssm_shadow(Instance *p_light,Sc distances[0]=cull_min; distances[splits]=cull_max; - + for (int i=0;i<splits;i++) { - + // setup a camera matrix for that range! CameraMatrix camera_matrix; - + switch(p_camera->type) { - + case Camera::ORTHOGONAL: { - + camera_matrix.set_orthogonal( p_camera->size, viewport_rect.width / (float)viewport_rect.height, @@ -4914,7 +4914,7 @@ void VisualServerRaster::_light_instance_update_pssm_shadow(Instance *p_light,Sc ); } break; case Camera::PERSPECTIVE: { - + camera_matrix.set_perspective( p_camera->fov, @@ -4924,18 +4924,18 @@ void VisualServerRaster::_light_instance_update_pssm_shadow(Instance *p_light,Sc p_camera->vaspect ); - - } break; - } - + + } break; + } + //obtain the frustum endpoints - + Vector3 endpoints[8]; // frustum plane endpoints bool res = camera_matrix.get_endpoints(p_camera->transform,endpoints); ERR_CONTINUE(!res); - + // obtain the light frustm ranges (given endpoints) - + Vector3 x_vec=p_light->data.transform.basis.get_axis( Vector3::AXIS_X ).normalized(); Vector3 y_vec=p_light->data.transform.basis.get_axis( Vector3::AXIS_Y ).normalized(); Vector3 z_vec=p_light->data.transform.basis.get_axis( Vector3::AXIS_Z ).normalized(); @@ -4952,27 +4952,27 @@ void VisualServerRaster::_light_instance_update_pssm_shadow(Instance *p_light,Sc //used for culling for(int j=0;j<8;j++) { - + float d_x=x_vec.dot(endpoints[j]); float d_y=y_vec.dot(endpoints[j]); float d_z=z_vec.dot(endpoints[j]); - + if (j==0 || d_x<x_min) x_min=d_x; if (j==0 || d_x>x_max) x_max=d_x; - + if (j==0 || d_y<y_min) y_min=d_y; if (j==0 || d_y>y_max) y_max=d_y; - + if (j==0 || d_z<z_min) z_min=d_z; if (j==0 || d_z>z_max) z_max=d_z; - - + + } @@ -5024,10 +5024,10 @@ void VisualServerRaster::_light_instance_update_pssm_shadow(Instance *p_light,Sc } //now that we now all ranges, we can proceed to make the light frustum planes, for culling octree - + Vector<Plane> light_frustum_planes; light_frustum_planes.resize(6); - + //right/left light_frustum_planes[0]=Plane( x_vec, x_max ); light_frustum_planes[1]=Plane( -x_vec, -x_min ); @@ -5035,14 +5035,14 @@ void VisualServerRaster::_light_instance_update_pssm_shadow(Instance *p_light,Sc light_frustum_planes[2]=Plane( y_vec, y_max ); light_frustum_planes[3]=Plane( -y_vec, -y_min ); //near/far - light_frustum_planes[4]=Plane( z_vec, z_max+1e6 ); - light_frustum_planes[5]=Plane( -z_vec, -z_min ); // z_min is ok, since casters further than far-light plane are not needed - + light_frustum_planes[4]=Plane( z_vec, z_max+1e6 ); + light_frustum_planes[5]=Plane( -z_vec, -z_min ); // z_min is ok, since casters further than far-light plane are not needed + int caster_cull_count = p_scenario->octree.cull_convex(light_frustum_planes,instance_shadow_cull_result,MAX_INSTANCE_CULL,INSTANCE_GEOMETRY_MASK); - + // a pre pass will need to be needed to determine the actual z-near to be used for(int j=0;j<caster_cull_count;j++) { - + float min,max; Instance *ins=instance_shadow_cull_result[j]; if (!ins->visible || ins->data.cast_shadows == VS::SHADOW_CASTING_SETTING_OFF) @@ -5067,23 +5067,23 @@ void VisualServerRaster::_light_instance_update_pssm_shadow(Instance *p_light,Sc rasterizer->light_instance_set_shadow_transform(p_light->light_info->instance, i, ortho_camera, ortho_transform,distances[i],distances[i+1] ); } - + rasterizer->begin_shadow_map( p_light->light_info->instance, i ); - + for (int j=0;j<caster_cull_count;j++) { - + Instance *instance = instance_shadow_cull_result[j]; if (!instance->visible || instance->data.cast_shadows==VS::SHADOW_CASTING_SETTING_OFF) continue; _instance_draw(instance); } - + rasterizer->end_shadow_map(); - - + + } - - + + } @@ -5519,7 +5519,7 @@ void VisualServerRaster::_light_instance_update_shadow(Instance *p_light,Scenari Rasterizer::ShadowType shadow_type = rasterizer->light_instance_get_shadow_type(p_light->light_info->instance); switch(shadow_type) { - + case Rasterizer::SHADOW_SIMPLE: { /* SPOT SHADOW */ @@ -6047,7 +6047,7 @@ void VisualServerRaster::_cull_room(Camera *p_camera, Instance *p_room,Instance } - + } void VisualServerRaster::_process_sampled_light(const Transform& p_camera,Instance *p_sampled_light,bool p_linear_colorspace) { @@ -6379,7 +6379,7 @@ void VisualServerRaster::_render_camera(Viewport *p_viewport,Camera *p_camera, S switch(p_camera->type) { case Camera::ORTHOGONAL: { - + camera_matrix.set_orthogonal( p_camera->size, viewport_rect.width / (float)viewport_rect.height, @@ -6401,19 +6401,19 @@ void VisualServerRaster::_render_camera(Viewport *p_viewport,Camera *p_camera, S ); ortho=false; - - } break; + + } break; } rasterizer->set_camera(p_camera->transform, camera_matrix,ortho); - + Vector<Plane> planes = camera_matrix.get_projection_planes(p_camera->transform); CullRange cull_range; // cull range is used for PSSM, and having an idea of the rendering depth cull_range.nearp=Plane(p_camera->transform.origin,-p_camera->transform.basis.get_axis(2).normalized()); cull_range.z_near=camera_matrix.get_z_near(); - cull_range.z_far=camera_matrix.get_z_far(); + cull_range.z_far=camera_matrix.get_z_far(); cull_range.min=cull_range.z_far; cull_range.max=cull_range.z_near; @@ -6429,10 +6429,10 @@ void VisualServerRaster::_render_camera(Viewport *p_viewport,Camera *p_camera, S */ /* STEP 3 - PROCESS PORTALS, VALIDATE ROOMS */ - + // compute portals - + exterior_visited=false; exterior_portal_cull_count=0; @@ -6513,11 +6513,11 @@ void VisualServerRaster::_render_camera(Viewport *p_viewport,Camera *p_camera, S } /* STEP 4 - REMOVE FURTHER CULLED OBJECTS, ADD LIGHTS */ - + for(int i=0;i<cull_count;i++) { - + Instance *ins = instance_cull_result[i]; - + bool keep=false; @@ -6603,7 +6603,7 @@ void VisualServerRaster::_render_camera(Viewport *p_viewport,Camera *p_camera, S } } } - + } if (!keep) { @@ -6617,12 +6617,12 @@ void VisualServerRaster::_render_camera(Viewport *p_viewport,Camera *p_camera, S ins->last_render_pass=render_pass; } } - + if (cull_range.max > cull_range.z_far ) cull_range.max=cull_range.z_far; if (cull_range.min < cull_range.z_near ) cull_range.min=cull_range.z_near; - + /* STEP 5 - PROCESS LIGHTS */ rasterizer->shadow_clear_near(); //clear near shadows, will be recreated @@ -6649,7 +6649,7 @@ void VisualServerRaster::_render_camera(Viewport *p_viewport,Camera *p_camera, S //discard lights not affecting anything (useful for deferred rendering, shadowmaps, etc) for (int i=0;i<light_cull_count;i++) { - + Instance *ins = light_cull_result[i]; if (light_discard_enabled) { @@ -6678,7 +6678,7 @@ void VisualServerRaster::_render_camera(Viewport *p_viewport,Camera *p_camera, S } } - + } { //this should eventually change to @@ -6691,12 +6691,12 @@ void VisualServerRaster::_render_camera(Viewport *p_viewport,Camera *p_camera, S if (!rasterizer->light_has_shadow(ins->base_rid) || !shadows_enabled) continue; - + /* for far shadows? if (ins->version == ins->light_info->last_version && rasterizer->light_instance_has_far_shadow(ins->light_info->instance)) continue; // didn't change */ - + _light_instance_update_shadow(ins,p_scenario,p_camera,cull_range); ins->light_info->last_version=ins->version; } @@ -6726,17 +6726,17 @@ void VisualServerRaster::_render_camera(Viewport *p_viewport,Camera *p_camera, S } /* STEP 7 - PROCESS GEOMETRY AND DRAW SCENE*/ - + rasterizer->begin_scene(p_viewport->viewport_data,environment,p_scenario->debug); - rasterizer->set_viewport(viewport_rect); - + rasterizer->set_viewport(viewport_rect); + // add lights { List<RID>::Element *E=p_scenario->directional_lights.front(); - + for(;E;E=E->next()) { Instance *light = E->get().is_valid()?instance_owner.get(E->get()):NULL; @@ -6758,11 +6758,11 @@ void VisualServerRaster::_render_camera(Viewport *p_viewport,Camera *p_camera, S // add geometry for(int i=0;i<cull_count;i++) { - + Instance *ins = instance_cull_result[i]; ERR_CONTINUE(!((1<<ins->base_type)&INSTANCE_GEOMETRY_MASK)); - + _instance_draw(ins); } @@ -6823,7 +6823,7 @@ void VisualServerRaster::_render_canvas_item(CanvasItem *p_canvas_item,const Mat if (global_rect.intersects(p_clip_rect) && ci->viewport.is_valid() && viewport_owner.owns(ci->viewport)) { - Viewport *vp = viewport_owner.get(ci->viewport); + Viewport *vp = viewport_owner.get(ci->viewport); Point2i from = xform.get_origin() + Point2(viewport_rect.x,viewport_rect.y); Point2i size = rect.size; @@ -7364,7 +7364,7 @@ void VisualServerRaster::_draw_viewports() { rasterizer->set_viewport(viewport_rect); } - rasterizer->canvas_begin(); + rasterizer->canvas_begin(); rasterizer->canvas_disable_blending(); rasterizer->canvas_begin_rect(Matrix32()); rasterizer->canvas_draw_rect(E->get()->rt_to_screen_rect,0,Rect2(Point2(),E->get()->rt_to_screen_rect.size),E->get()->render_target_texture,Color(1,1,1)); @@ -7492,7 +7492,7 @@ void VisualServerRaster::draw() { rasterizer->begin_frame(); _draw_viewports(); _draw_cursors_and_margins(); - rasterizer->end_frame(); + rasterizer->end_frame(); draw_extra_frame=rasterizer->needs_to_draw_next_frame(); } @@ -7574,13 +7574,13 @@ void VisualServerRaster::set_boot_image(const Image& p_image, const Color& p_col void VisualServerRaster::init() { rasterizer->init(); - + shadows_enabled=GLOBAL_DEF("render/shadows_enabled",true); //default_scenario = scenario_create(); //default_viewport = viewport_create(); for(int i=0;i<4;i++) black_margin[i]=0; - + Image img; img.create(default_mouse_cursor_xpm); //img.convert(Image::FORMAT_RGB); @@ -7597,7 +7597,7 @@ void VisualServerRaster::_clean_up_owner(RID_OwnerBase *p_owner,String p_type) { List<RID> rids; p_owner->get_owned_list(&rids); - + int lost=0; for(List<RID>::Element *I=rids.front();I;I=I->next()) { if (OS::get_singleton()->is_stdout_verbose()) { @@ -7622,19 +7622,19 @@ void VisualServerRaster::finish() { _clean_up_owner( &room_owner,"Room" ); _clean_up_owner( &portal_owner,"Portal" ); - + _clean_up_owner( &camera_owner,"Camera" ); _clean_up_owner( &viewport_owner,"Viewport" ); - + _clean_up_owner( &scenario_owner,"Scenario" ); _clean_up_owner( &instance_owner,"Instance" ); - + _clean_up_owner( &canvas_owner,"Canvas" ); _clean_up_owner( &canvas_item_owner,"CanvasItem" ); rasterizer->finish(); octree_allocator.clear(); - + if (instance_dependency_map.size()) { print_line("Base resources missing amount: "+itos(instance_dependency_map.size())); } @@ -7646,9 +7646,9 @@ RID VisualServerRaster::get_test_cube() { if (test_cube.is_valid()) return test_cube; - + test_cube=_make_test_cube(); - return test_cube; + return test_cube; } |