summaryrefslogtreecommitdiffstats
path: root/scene/main
diff options
context:
space:
mode:
Diffstat (limited to 'scene/main')
-rw-r--r--scene/main/canvas_layer.cpp10
-rw-r--r--scene/main/canvas_layer.h5
-rw-r--r--scene/main/node.cpp10
-rw-r--r--scene/main/scene_main_loop.cpp93
-rw-r--r--scene/main/scene_main_loop.h12
-rw-r--r--scene/main/viewport.cpp439
-rw-r--r--scene/main/viewport.h124
7 files changed, 437 insertions, 256 deletions
diff --git a/scene/main/canvas_layer.cpp b/scene/main/canvas_layer.cpp
index 1de19959db..9f20e0f845 100644
--- a/scene/main/canvas_layer.cpp
+++ b/scene/main/canvas_layer.cpp
@@ -246,6 +246,15 @@ Node* CanvasLayer::get_custom_viewport() const {
return custom_viewport;
}
+void CanvasLayer::reset_sort_index() {
+ sort_index=0;
+}
+
+int CanvasLayer::get_sort_index() {
+
+ return sort_index++;
+}
+
void CanvasLayer::_bind_methods() {
@@ -296,4 +305,5 @@ CanvasLayer::CanvasLayer() {
canvas = Ref<World2D>( memnew(World2D) );
custom_viewport=NULL;
custom_viewport_id=0;
+ sort_index=0;
}
diff --git a/scene/main/canvas_layer.h b/scene/main/canvas_layer.h
index 039db8823e..2e3c917205 100644
--- a/scene/main/canvas_layer.h
+++ b/scene/main/canvas_layer.h
@@ -52,6 +52,8 @@ class CanvasLayer : public Node {
RID viewport;
Viewport *vp;
+ int sort_index;
+
// Deprecated, should be removed in a future version.
void _set_rotationd(real_t p_rotation);
real_t _get_rotationd() const;
@@ -93,6 +95,9 @@ public:
void set_custom_viewport(Node *p_viewport);
Node* get_custom_viewport() const;
+ void reset_sort_index();
+ int get_sort_index();
+
CanvasLayer();
};
diff --git a/scene/main/node.cpp b/scene/main/node.cpp
index 9c97ca4424..23230a8b40 100644
--- a/scene/main/node.cpp
+++ b/scene/main/node.cpp
@@ -316,6 +316,12 @@ void Node::move_child(Node *p_child,int p_pos) {
}
+ if (p_child->data.pos==p_pos)
+ return; //do nothing
+
+ int motion_from = MIN(p_pos,p_child->data.pos);
+ int motion_to = MAX(p_pos,p_child->data.pos);
+
data.children.remove( p_child->data.pos );
data.children.insert( p_pos, p_child );
@@ -325,13 +331,13 @@ void Node::move_child(Node *p_child,int p_pos) {
data.blocked++;
//new pos first
- for (int i=0;i<data.children.size();i++) {
+ for (int i=motion_from;i<=motion_to;i++) {
data.children[i]->data.pos=i;
}
// notification second
move_child_notify(p_child);
- for (int i=0;i<data.children.size();i++) {
+ for (int i=motion_from;i<=motion_to;i++) {
data.children[i]->notification( NOTIFICATION_MOVED_IN_PARENT );
}
diff --git a/scene/main/scene_main_loop.cpp b/scene/main/scene_main_loop.cpp
index f0c1251e43..874562ad3b 100644
--- a/scene/main/scene_main_loop.cpp
+++ b/scene/main/scene_main_loop.cpp
@@ -490,6 +490,8 @@ void SceneTree::input_event( const InputEvent& p_event ) {
}
+ _call_idle_callbacks();
+
}
void SceneTree::init() {
@@ -528,6 +530,7 @@ bool SceneTree::iteration(float p_time) {
root_lock--;
_flush_delete_queue();
+ _call_idle_callbacks();
return _quit;
}
@@ -590,6 +593,8 @@ bool SceneTree::idle(float p_time){
E=N;
}
+ _call_idle_callbacks();
+
return _quit;
}
@@ -745,12 +750,12 @@ Ref<Material> SceneTree::get_debug_navigation_material() {
if (navigation_material.is_valid())
return navigation_material;
- Ref<FixedMaterial> line_material = Ref<FixedMaterial>( memnew( FixedMaterial ));
- line_material->set_flag(Material::FLAG_UNSHADED, true);
+ Ref<FixedSpatialMaterial> line_material = Ref<FixedSpatialMaterial>( memnew( FixedSpatialMaterial ));
+/* line_material->set_flag(Material::FLAG_UNSHADED, true);
line_material->set_line_width(3.0);
- line_material->set_fixed_flag(FixedMaterial::FLAG_USE_ALPHA, true);
- line_material->set_fixed_flag(FixedMaterial::FLAG_USE_COLOR_ARRAY, true);
- line_material->set_parameter(FixedMaterial::PARAM_DIFFUSE,get_debug_navigation_color());
+ line_material->set_fixed_flag(FixedSpatialMaterial::FLAG_USE_ALPHA, true);
+ line_material->set_fixed_flag(FixedSpatialMaterial::FLAG_USE_COLOR_ARRAY, true);
+ line_material->set_parameter(FixedSpatialMaterial::PARAM_DIFFUSE,get_debug_navigation_color());*/
navigation_material=line_material;
@@ -763,12 +768,12 @@ Ref<Material> SceneTree::get_debug_navigation_disabled_material(){
if (navigation_disabled_material.is_valid())
return navigation_disabled_material;
- Ref<FixedMaterial> line_material = Ref<FixedMaterial>( memnew( FixedMaterial ));
- line_material->set_flag(Material::FLAG_UNSHADED, true);
+ Ref<FixedSpatialMaterial> line_material = Ref<FixedSpatialMaterial>( memnew( FixedSpatialMaterial ));
+/* line_material->set_flag(Material::FLAG_UNSHADED, true);
line_material->set_line_width(3.0);
- line_material->set_fixed_flag(FixedMaterial::FLAG_USE_ALPHA, true);
- line_material->set_fixed_flag(FixedMaterial::FLAG_USE_COLOR_ARRAY, true);
- line_material->set_parameter(FixedMaterial::PARAM_DIFFUSE,get_debug_navigation_disabled_color());
+ line_material->set_fixed_flag(FixedSpatialMaterial::FLAG_USE_ALPHA, true);
+ line_material->set_fixed_flag(FixedSpatialMaterial::FLAG_USE_COLOR_ARRAY, true);
+ line_material->set_parameter(FixedSpatialMaterial::PARAM_DIFFUSE,get_debug_navigation_disabled_color());*/
navigation_disabled_material=line_material;
@@ -781,12 +786,12 @@ Ref<Material> SceneTree::get_debug_collision_material() {
return collision_material;
- Ref<FixedMaterial> line_material = Ref<FixedMaterial>( memnew( FixedMaterial ));
- line_material->set_flag(Material::FLAG_UNSHADED, true);
+ Ref<FixedSpatialMaterial> line_material = Ref<FixedSpatialMaterial>( memnew( FixedSpatialMaterial ));
+ /*line_material->set_flag(Material::FLAG_UNSHADED, true);
line_material->set_line_width(3.0);
- line_material->set_fixed_flag(FixedMaterial::FLAG_USE_ALPHA, true);
- line_material->set_fixed_flag(FixedMaterial::FLAG_USE_COLOR_ARRAY, true);
- line_material->set_parameter(FixedMaterial::PARAM_DIFFUSE,get_debug_collisions_color());
+ line_material->set_fixed_flag(FixedSpatialMaterial::FLAG_USE_ALPHA, true);
+ line_material->set_fixed_flag(FixedSpatialMaterial::FLAG_USE_COLOR_ARRAY, true);
+ line_material->set_parameter(FixedSpatialMaterial::PARAM_DIFFUSE,get_debug_collisions_color());*/
collision_material=line_material;
@@ -800,11 +805,11 @@ Ref<Mesh> SceneTree::get_debug_contact_mesh() {
debug_contact_mesh = Ref<Mesh>( memnew( Mesh ) );
- Ref<FixedMaterial> mat = memnew( FixedMaterial );
- mat->set_flag(Material::FLAG_UNSHADED,true);
+ Ref<FixedSpatialMaterial> mat = memnew( FixedSpatialMaterial );
+ /*mat->set_flag(Material::FLAG_UNSHADED,true);
mat->set_flag(Material::FLAG_DOUBLE_SIDED,true);
- mat->set_fixed_flag(FixedMaterial::FLAG_USE_ALPHA,true);
- mat->set_parameter(FixedMaterial::PARAM_DIFFUSE,get_debug_collision_contact_color());
+ mat->set_fixed_flag(FixedSpatialMaterial::FLAG_USE_ALPHA,true);
+ mat->set_parameter(FixedSpatialMaterial::PARAM_DIFFUSE,get_debug_collision_contact_color());*/
Vector3 diamond[6]={
Vector3(-1, 0, 0),
@@ -840,7 +845,7 @@ Ref<Mesh> SceneTree::get_debug_contact_mesh() {
arr[Mesh::ARRAY_INDEX]=indices;
- debug_contact_mesh->add_surface(Mesh::PRIMITIVE_TRIANGLES,arr);
+ debug_contact_mesh->add_surface_from_arrays(Mesh::PRIMITIVE_TRIANGLES,arr);
debug_contact_mesh->surface_set_material(0,mat);
return debug_contact_mesh;
@@ -1098,7 +1103,11 @@ void SceneTree::_update_root_rect() {
if (stretch_mode==STRETCH_MODE_DISABLED) {
- root->set_rect(Rect2(Point2(),last_screen_size));
+
+ root->set_size(last_screen_size);
+ root->set_attach_to_screen_rect(Rect2(Point2(),last_screen_size));
+ root->set_size_override_stretch(false);
+ root->set_size_override(false,Size2());
return; //user will take care
}
@@ -1174,21 +1183,18 @@ void SceneTree::_update_root_rect() {
switch (stretch_mode) {
case STRETCH_MODE_2D: {
-// root->set_rect(Rect2(Point2(),video_mode));
- root->set_as_render_target(false);
- root->set_rect(Rect2(margin,screen_size));
+ root->set_size(screen_size);
+ root->set_attach_to_screen_rect(Rect2(margin,screen_size));
root->set_size_override_stretch(true);
root->set_size_override(true,viewport_size);
} break;
case STRETCH_MODE_VIEWPORT: {
- root->set_rect(Rect2(Point2(),viewport_size));
+ root->set_size(viewport_size);
+ root->set_attach_to_screen_rect(Rect2(margin,screen_size));
root->set_size_override_stretch(false);
root->set_size_override(false,Size2());
- root->set_as_render_target(true);
- root->set_render_target_update_mode(Viewport::RENDER_TARGET_UPDATE_ALWAYS);
- root->set_render_target_to_screen_rect(Rect2(margin,screen_size));
} break;
@@ -2258,6 +2264,23 @@ void SceneTree::_bind_methods() {
SceneTree *SceneTree::singleton=NULL;
+
+SceneTree::IdleCallback SceneTree::idle_callbacks[SceneTree::MAX_IDLE_CALLBACKS];
+int SceneTree::idle_callback_count=0;
+
+void SceneTree::_call_idle_callbacks() {
+
+ for(int i=0;i<idle_callback_count;i++) {
+ idle_callbacks[i]();
+ }
+}
+
+void SceneTree::add_idle_callback(IdleCallback p_callback) {
+ ERR_FAIL_COND(idle_callback_count>=MAX_IDLE_CALLBACKS);
+ idle_callbacks[idle_callback_count++]=p_callback;
+}
+
+
SceneTree::SceneTree() {
singleton=this;
@@ -2273,6 +2296,7 @@ SceneTree::SceneTree() {
collision_debug_contacts=GLOBAL_DEF("debug/collision_max_contacts_displayed",10000);
+
tree_version=1;
fixed_process_time=1;
idle_process_time=1;
@@ -2296,11 +2320,22 @@ SceneTree::SceneTree() {
root->set_as_audio_listener_2d(true);
current_scene=NULL;
+ int ref_atlas_size = GLOBAL_DEF("rendering/reflections/atlas_size",2048);
+ int ref_atlas_subdiv = GLOBAL_DEF("rendering/reflections/atlas_subdiv",8);
+ int msaa_mode = GLOBAL_DEF("rendering/antialias/msaa",0);
+ Globals::get_singleton()->set_custom_property_info("rendering/antialias/msaa",PropertyInfo(Variant::INT,"rendering/antialias/msaa",PROPERTY_HINT_ENUM,"Disabled,2x,4x,8x,16x"));
+ root->set_msaa(Viewport::MSAA(msaa_mode));
+ bool hdr = GLOBAL_DEF("rendering/dynamic_range/hdr",true);
+ root->set_hdr(hdr);
+
+ VS::get_singleton()->scenario_set_reflection_atlas_size(root->get_world()->get_scenario(),ref_atlas_size,ref_atlas_subdiv);
+
+
stretch_mode=STRETCH_MODE_DISABLED;
stretch_aspect=STRETCH_ASPECT_IGNORE;
last_screen_size=Size2( OS::get_singleton()->get_video_mode().width, OS::get_singleton()->get_video_mode().height );
- root->set_rect(Rect2(Point2(),last_screen_size));
+ root->set_size(last_screen_size);
if (ScriptDebugger::get_singleton()) {
ScriptDebugger::get_singleton()->set_request_scene_tree_message_func(_debugger_request_tree,this);
diff --git a/scene/main/scene_main_loop.h b/scene/main/scene_main_loop.h
index 9380011078..915a78918a 100644
--- a/scene/main/scene_main_loop.h
+++ b/scene/main/scene_main_loop.h
@@ -74,6 +74,8 @@ class SceneTree : public MainLoop {
public:
+ typedef void (*IdleCallback)();
+
enum StretchMode {
STRETCH_MODE_DISABLED,
@@ -303,6 +305,15 @@ friend class Viewport;
static void _live_edit_reparent_node_funcs(void* self,const NodePath& p_at,const NodePath& p_new_place,const String& p_new_name,int p_at_pos) { reinterpret_cast<SceneTree*>(self)->_live_edit_reparent_node_func(p_at,p_new_place,p_new_name,p_at_pos); }
#endif
+
+ enum {
+ MAX_IDLE_CALLBACKS=256
+ };
+
+ static IdleCallback idle_callbacks[MAX_IDLE_CALLBACKS];
+ static int idle_callback_count;
+ void _call_idle_callbacks();
+
protected:
@@ -430,6 +441,7 @@ public:
void set_refuse_new_network_connections(bool p_refuse);
bool is_refusing_new_network_connections() const;
+ static void add_idle_callback(IdleCallback p_callback);
SceneTree();
~SceneTree();
diff --git a/scene/main/viewport.cpp b/scene/main/viewport.cpp
index 5bb5e918b1..ff148cc413 100644
--- a/scene/main/viewport.cpp
+++ b/scene/main/viewport.cpp
@@ -51,50 +51,52 @@
#include "globals.h"
-int RenderTargetTexture::get_width() const {
+int ViewportTexture::get_width() const {
ERR_FAIL_COND_V(!vp,0);
- return vp->rect.size.width;
+ return vp->size.width;
}
-int RenderTargetTexture::get_height() const{
+int ViewportTexture::get_height() const{
ERR_FAIL_COND_V(!vp,0);
- return vp->rect.size.height;
+ return vp->size.height;
}
-Size2 RenderTargetTexture::get_size() const{
+Size2 ViewportTexture::get_size() const{
ERR_FAIL_COND_V(!vp,Size2());
- return vp->rect.size;
+ return vp->size;
}
-RID RenderTargetTexture::get_rid() const{
+RID ViewportTexture::get_rid() const{
ERR_FAIL_COND_V(!vp,RID());
- return vp->render_target_texture_rid;
+ return vp->texture_rid;
}
-bool RenderTargetTexture::has_alpha() const{
+bool ViewportTexture::has_alpha() const{
return false;
}
-void RenderTargetTexture::set_flags(uint32_t p_flags){
+void ViewportTexture::set_flags(uint32_t p_flags){
+
+ if (!vp)
+ return;
- ERR_FAIL_COND(!vp);
if (p_flags&FLAG_FILTER)
flags=FLAG_FILTER;
else
flags=0;
- VS::get_singleton()->texture_set_flags(vp->render_target_texture_rid,flags);
+ VS::get_singleton()->texture_set_flags(vp->texture_rid,flags);
}
-uint32_t RenderTargetTexture::get_flags() const{
+uint32_t ViewportTexture::get_flags() const{
return flags;
}
-RenderTargetTexture::RenderTargetTexture(Viewport *p_vp){
+ViewportTexture::ViewportTexture(Viewport *p_vp){
vp=p_vp;
flags=0;
@@ -141,9 +143,9 @@ void Viewport::_update_stretch_transform() {
if (size_override_stretch && size_override) {
//print_line("sive override size "+size_override_size);
- //print_line("rect size "+rect.size);
+ //print_line("rect size "+size);
stretch_transform=Matrix32();
- Size2 scale = rect.size/(size_override_size+size_override_margin*2);
+ Size2 scale = size/(size_override_size+size_override_margin*2);
stretch_transform.scale(scale);
stretch_transform.elements[2]=size_override_margin*scale;
@@ -164,14 +166,14 @@ void Viewport::_update_rect() {
return;
- if (!render_target && parent_control) {
+ /*if (!render_target && parent_control) {
Control *c = parent_control;
rect.pos=Point2();
rect.size=c->get_size();
- }
-
+ }*/
+/*
VisualServer::ViewportRect vr;
vr.x=rect.pos.x;
vr.y=rect.pos.y;
@@ -191,8 +193,8 @@ void Viewport::_update_rect() {
}
emit_signal("size_changed");
- render_target_texture->emit_changed();
-
+ texture->emit_changed();
+*/
}
@@ -207,7 +209,7 @@ void Viewport::_parent_draw() {
void Viewport::_parent_visibility_changed() {
-
+/*
if (parent_control) {
Control *c = parent_control;
@@ -216,14 +218,14 @@ void Viewport::_parent_visibility_changed() {
_update_listener();
_update_listener_2d();
}
-
+*/
}
void Viewport::_vp_enter_tree() {
- if (parent_control) {
+/* if (parent_control) {
Control *cparent=parent_control;
RID parent_ci = cparent->get_canvas_item();
@@ -232,20 +234,21 @@ void Viewport::_vp_enter_tree() {
VisualServer::get_singleton()->canvas_item_set_parent(canvas_item,parent_ci);
VisualServer::get_singleton()->canvas_item_set_visible(canvas_item,false);
- VisualServer::get_singleton()->canvas_item_attach_viewport(canvas_item,viewport);
+// VisualServer::get_singleton()->canvas_item_attach_viewport(canvas_item,viewport);
parent_control->connect("resized",this,"_parent_resized");
parent_control->connect("visibility_changed",this,"_parent_visibility_changed");
} else if (!parent){
- VisualServer::get_singleton()->viewport_attach_to_screen(viewport,0);
+// VisualServer::get_singleton()->viewport_attach_to_screen(viewport,0);
}
-
+*/
}
void Viewport::_vp_exit_tree() {
+ /*
if (parent_control) {
parent_control->disconnect("resized",this,"_parent_resized");
@@ -268,7 +271,7 @@ void Viewport::_vp_exit_tree() {
VisualServer::get_singleton()->viewport_detach(viewport);
}
-
+*/
}
@@ -326,31 +329,12 @@ void Viewport::_notification(int p_what) {
case NOTIFICATION_ENTER_TREE: {
if (get_parent()) {
- Node *parent=get_parent();
- if (parent) {
- parent_control=parent->cast_to<Control>();
- }
- }
-
-
- parent=NULL;
- Node *parent_node=get_parent();
-
-
- while(parent_node) {
-
- parent = parent_node->cast_to<Viewport>();
- if (parent)
- break;
-
- parent_node=parent_node->get_parent();
+ parent = get_parent()->get_viewport();
+ VisualServer::get_singleton()->viewport_set_parent_viewport(viewport,parent->get_viewport());
+ } else {
+ parent=NULL;
}
-
- if (!render_target)
- _vp_enter_tree();
-
-
current_canvas=find_world_2d()->get_canvas();
VisualServer::get_singleton()->viewport_set_scenario(viewport,find_world()->get_scenario());
VisualServer::get_singleton()->viewport_attach_canvas(viewport,current_canvas);
@@ -370,7 +354,7 @@ void Viewport::_notification(int p_what) {
//3D
PhysicsServer::get_singleton()->space_set_debug_contacts(find_world()->get_space(),get_tree()->get_collision_debug_contact_count());
contact_3d_debug_multimesh=VisualServer::get_singleton()->multimesh_create();
- VisualServer::get_singleton()->multimesh_set_instance_count(contact_3d_debug_multimesh,get_tree()->get_collision_debug_contact_count());
+ VisualServer::get_singleton()->multimesh_allocate(contact_3d_debug_multimesh,get_tree()->get_collision_debug_contact_count(),VS::MULTIMESH_TRANSFORM_3D,VS::MULTIMESH_COLOR_8BIT);
VisualServer::get_singleton()->multimesh_set_visible_instances(contact_3d_debug_multimesh,0);
VisualServer::get_singleton()->multimesh_set_mesh(contact_3d_debug_multimesh,get_tree()->get_debug_contact_mesh()->get_rid());
contact_3d_debug_instance=VisualServer::get_singleton()->instance_create();
@@ -380,6 +364,7 @@ void Viewport::_notification(int p_what) {
}
+ VS::get_singleton()->viewport_set_active(viewport,true);
} break;
case NOTIFICATION_READY: {
#ifndef _3D_DISABLED
@@ -418,8 +403,8 @@ void Viewport::_notification(int p_what) {
if (world_2d.is_valid())
world_2d->_remove_viewport(this);
- if (!render_target)
- _vp_exit_tree();
+ //if (!render_target)
+ // _vp_exit_tree();
VisualServer::get_singleton()->viewport_set_scenario(viewport,RID());
SpatialSoundServer::get_singleton()->listener_set_space(internal_listener, RID());
@@ -437,7 +422,10 @@ void Viewport::_notification(int p_what) {
}
remove_from_group("_viewports");
- parent_control=NULL;
+
+
+ VS::get_singleton()->viewport_set_active(viewport,false);
+
} break;
case NOTIFICATION_FIXED_PROCESS: {
@@ -452,7 +440,7 @@ void Viewport::_notification(int p_what) {
if (get_tree()->is_debugging_collisions_hint() && contact_2d_debug.is_valid()) {
VisualServer::get_singleton()->canvas_item_clear(contact_2d_debug);
- VisualServer::get_singleton()->canvas_item_raise(contact_2d_debug);
+ VisualServer::get_singleton()->canvas_item_set_draw_index(contact_2d_debug,0xFFFFF); //very high index
Vector<Vector2> points = Physics2DServer::get_singleton()->space_get_contacts(find_world_2d()->get_space());
int point_count = Physics2DServer::get_singleton()->space_get_contact_count(find_world_2d()->get_space());
@@ -474,27 +462,11 @@ void Viewport::_notification(int p_what) {
VS::get_singleton()->multimesh_set_visible_instances(contact_3d_debug_multimesh,point_count);
- if (point_count>0) {
- AABB aabb;
-
- Transform t;
- for(int i=0;i<point_count;i++) {
-
- if (i==0)
- aabb.pos=points[i];
- else
- aabb.expand_to(points[i]);
- t.origin=points[i];
- VisualServer::get_singleton()->multimesh_instance_set_transform(contact_3d_debug_multimesh,i,t);
- }
- aabb.grow(aabb.get_longest_axis_size()*0.01);
- VisualServer::get_singleton()->multimesh_set_aabb(contact_3d_debug_multimesh,aabb);
- }
}
- if (physics_object_picking && (render_target || Input::get_singleton()->get_mouse_mode()!=Input::MOUSE_MODE_CAPTURED)) {
+ if (physics_object_picking && (to_screen_rect==Rect2() || Input::get_singleton()->get_mouse_mode()!=Input::MOUSE_MODE_CAPTURED)) {
Vector2 last_pos(1e20,1e20);
CollisionObject *last_object;
@@ -708,15 +680,18 @@ RID Viewport::get_viewport() const {
return viewport;
}
-void Viewport::set_rect(const Rect2& p_rect) {
+void Viewport::set_size(const Size2 &p_size) {
- if (rect==p_rect)
+ if (size==p_size.floor())
return;
- rect=p_rect;
+ size=p_size.floor();
+ VS::get_singleton()->viewport_set_size(viewport,size.width,size.height);
_update_rect();
_update_stretch_transform();
+ emit_signal("size_changed");
+
}
Rect2 Viewport::get_visible_rect() const {
@@ -724,12 +699,12 @@ Rect2 Viewport::get_visible_rect() const {
Rect2 r;
- if (rect.pos==Vector2() && rect.size==Size2()) {
+ if (size==Size2()) {
r=Rect2( Point2(), Size2( OS::get_singleton()->get_video_mode().width, OS::get_singleton()->get_video_mode().height ) );
} else {
- r=Rect2( rect.pos , rect.size );
+ r=Rect2( Point2() , size );
}
if (size_override) {
@@ -740,9 +715,9 @@ Rect2 Viewport::get_visible_rect() const {
return r;
}
-Rect2 Viewport::get_rect() const {
+Size2 Viewport::get_size() const {
- return rect;
+ return size;
}
@@ -1219,10 +1194,10 @@ bool Viewport::is_size_override_stretch_enabled() const {
return size_override_stretch;
}
-
+#if 0
void Viewport::set_as_render_target(bool p_enable){
- if (render_target==p_enable)
+/* if (render_target==p_enable)
return;
render_target=p_enable;
@@ -1238,117 +1213,126 @@ void Viewport::set_as_render_target(bool p_enable){
if (p_enable) {
- render_target_texture_rid = VS::get_singleton()->viewport_get_render_target_texture(viewport);
+ texture_rid = VS::get_singleton()->viewport_get_texture(viewport);
} else {
- render_target_texture_rid=RID();
+ texture_rid=RID();
}
- render_target_texture->set_flags(render_target_texture->flags);
- render_target_texture->emit_changed();
+ texture->set_flags(texture->flags);
+ texture->emit_changed();
update_configuration_warning();
+ */
}
bool Viewport::is_set_as_render_target() const{
return render_target;
+
}
-void Viewport::set_render_target_update_mode(RenderTargetUpdateMode p_mode){
+#endif
+void Viewport::set_update_mode(UpdateMode p_mode){
- render_target_update_mode=p_mode;
- VS::get_singleton()->viewport_set_render_target_update_mode(viewport,VS::RenderTargetUpdateMode(p_mode));
+ update_mode=p_mode;
+ VS::get_singleton()->viewport_set_update_mode(viewport,VS::ViewportUpdateMode(p_mode));
}
-Viewport::RenderTargetUpdateMode Viewport::get_render_target_update_mode() const{
+Viewport::UpdateMode Viewport::get_update_mode() const{
- return render_target_update_mode;
+ return update_mode;
}
-//RID get_render_target_texture() const;
+//RID get_texture() const;
void Viewport::queue_screen_capture(){
- VS::get_singleton()->viewport_queue_screen_capture(viewport);
+ //VS::get_singleton()->viewport_queue_screen_capture(viewport);
}
Image Viewport::get_screen_capture() const {
- return VS::get_singleton()->viewport_get_screen_capture(viewport);
+// return VS::get_singleton()->viewport_get_screen_capture(viewport);
+ return Image();
}
-Ref<RenderTargetTexture> Viewport::get_render_target_texture() const {
+Ref<ViewportTexture> Viewport::get_texture() const {
- return render_target_texture;
+ return texture;
}
-void Viewport::set_render_target_vflip(bool p_enable) {
+void Viewport::set_vflip(bool p_enable) {
- render_target_vflip=p_enable;
- VisualServer::get_singleton()->viewport_set_render_target_vflip(viewport,p_enable);
+ vflip=p_enable;
+ VisualServer::get_singleton()->viewport_set_vflip(viewport,p_enable);
}
-bool Viewport::get_render_target_vflip() const{
+bool Viewport::get_vflip() const{
- return render_target_vflip;
+ return vflip;
}
-void Viewport::set_render_target_clear_on_new_frame(bool p_enable) {
+void Viewport::set_clear_on_new_frame(bool p_enable) {
- render_target_clear_on_new_frame=p_enable;
- VisualServer::get_singleton()->viewport_set_render_target_clear_on_new_frame(viewport,p_enable);
+ clear_on_new_frame=p_enable;
+ //VisualServer::get_singleton()->viewport_set_clear_on_new_frame(viewport,p_enable);
}
-bool Viewport::get_render_target_clear_on_new_frame() const{
+bool Viewport::get_clear_on_new_frame() const{
- return render_target_clear_on_new_frame;
+ return clear_on_new_frame;
}
-void Viewport::render_target_clear() {
+void Viewport::set_shadow_atlas_size(int p_size) {
+
+ if (shadow_atlas_size==p_size)
+ return;
- //render_target_clear=true;
- VisualServer::get_singleton()->viewport_render_target_clear(viewport);
+ shadow_atlas_size=p_size;
+ VS::get_singleton()->viewport_set_shadow_atlas_size(viewport,p_size);
}
-void Viewport::set_render_target_filter(bool p_enable) {
+int Viewport::get_shadow_atlas_size() const{
- if(!render_target)
- return;
+ return shadow_atlas_size;
+}
- render_target_texture->set_flags(p_enable?int(Texture::FLAG_FILTER):int(0));
+void Viewport::set_shadow_atlas_quadrant_subdiv(int p_quadrant,ShadowAtlasQuadrantSubdiv p_subdiv){
-}
-bool Viewport::get_render_target_filter() const{
+ ERR_FAIL_INDEX(p_quadrant,4);
+ ERR_FAIL_INDEX(p_subdiv,SHADOW_ATLAS_QUADRANT_SUBDIV_MAX);
- return (render_target_texture->get_flags()&Texture::FLAG_FILTER)!=0;
-}
+ if (shadow_atlas_quadrant_subdiv[p_quadrant]==p_subdiv)
+ return;
-void Viewport::set_render_target_gen_mipmaps(bool p_enable) {
+ shadow_atlas_quadrant_subdiv[p_quadrant]=p_subdiv;
+ static const int subdiv[SHADOW_ATLAS_QUADRANT_SUBDIV_MAX]={0,1,4,16,64,256,1024};
- //render_target_texture->set_flags(p_enable?int(Texture::FLAG_FILTER):int(0));
- render_target_gen_mipmaps=p_enable;
+ VS::get_singleton()->viewport_set_shadow_atlas_quadrant_subdivision(viewport,p_quadrant,subdiv[p_subdiv]);
}
+Viewport::ShadowAtlasQuadrantSubdiv Viewport::get_shadow_atlas_quadrant_subdiv(int p_quadrant) const{
+
+ ERR_FAIL_INDEX_V(p_quadrant,4,SHADOW_ATLAS_QUADRANT_SUBDIV_DISABLED);
+ return shadow_atlas_quadrant_subdiv[p_quadrant];
+}
+
-bool Viewport::get_render_target_gen_mipmaps() const{
+void Viewport::clear() {
- //return (render_target_texture->get_flags()&Texture::FLAG_FILTER)!=0;
- return render_target_gen_mipmaps;
+ //clear=true;
+// VisualServer::get_singleton()->viewport_clear(viewport);
}
Matrix32 Viewport::_get_input_pre_xform() const {
Matrix32 pre_xf;
- if (render_target) {
- if (to_screen_rect!=Rect2()) {
- pre_xf.elements[2]=-to_screen_rect.pos;
- pre_xf.scale(rect.size/to_screen_rect.size);
- }
- } else {
+ if (to_screen_rect!=Rect2()) {
- pre_xf.elements[2]=-rect.pos;
+ pre_xf.elements[2]=-to_screen_rect.pos;
+ pre_xf.scale(size/to_screen_rect.size);
}
return pre_xf;
@@ -1356,9 +1340,9 @@ Matrix32 Viewport::_get_input_pre_xform() const {
Vector2 Viewport::_get_window_offset() const {
- if (parent_control) {
- return (parent_control->get_viewport()->get_final_transform() * parent_control->get_global_transform_with_canvas()).get_origin();
- }
+// if (parent_control) {
+// return (parent_control->get_viewport()->get_final_transform() * parent_control->get_global_transform_with_canvas()).get_origin();
+// }
return Vector2();
}
@@ -1454,10 +1438,8 @@ void Viewport::_vp_input(const InputEvent& p_ev) {
}
#endif
- if (parent_control && !parent_control->is_visible())
- return;
- if (render_target && to_screen_rect==Rect2())
+ if (to_screen_rect==Rect2())
return; //if render target, can't get input events
//this one handles system input, p_ev are in system coordinates
@@ -1480,10 +1462,10 @@ void Viewport::_vp_unhandled_input(const InputEvent& p_ev) {
}
#endif
- if (parent_control && !parent_control->is_visible())
- return;
+// if (parent_control && !parent_control->is_visible())
+// return;
- if (render_target && to_screen_rect==Rect2())
+ if (to_screen_rect==Rect2())
return; //if render target, can't get input events
//this one handles system input, p_ev are in system coordinates
@@ -2521,17 +2503,18 @@ bool Viewport::is_using_own_world() const {
return own_world.is_valid();
}
-void Viewport::set_render_target_to_screen_rect(const Rect2& p_rect) {
+void Viewport::set_attach_to_screen_rect(const Rect2& p_rect) {
+ VS::get_singleton()->viewport_attach_to_screen(viewport,p_rect);
to_screen_rect=p_rect;
- VisualServer::get_singleton()->viewport_set_render_target_to_screen_rect(viewport,to_screen_rect);
}
-Rect2 Viewport::get_render_target_to_screen_rect() const{
+Rect2 Viewport::get_attach_to_screen_rect() const{
return to_screen_rect;
}
+
void Viewport::set_physics_object_picking(bool p_enable) {
physics_object_picking=p_enable;
@@ -2553,7 +2536,7 @@ Vector2 Viewport::get_camera_coords(const Vector2 &p_viewport_coords) const {
Vector2 Viewport::get_camera_rect_size() const {
- return last_vp_rect.size;
+ return size;
}
@@ -2577,6 +2560,16 @@ bool Viewport::is_input_disabled() const {
return disable_input;
}
+void Viewport::set_disable_3d(bool p_disable) {
+ disable_3d=p_disable;
+ VS::get_singleton()->viewport_set_disable_3d(viewport,p_disable);
+}
+
+bool Viewport::is_3d_disabled() const {
+
+ return disable_3d;
+}
+
Variant Viewport::gui_get_drag_data() const {
return gui.drag_data;
}
@@ -2587,19 +2580,58 @@ Control *Viewport::get_modal_stack_top() const {
String Viewport::get_configuration_warning() const {
- if (get_parent() && !get_parent()->cast_to<Control>() && !render_target) {
+ /*if (get_parent() && !get_parent()->cast_to<Control>() && !render_target) {
return TTR("This viewport is not set as render target. If you intend for it to display its contents directly to the screen, make it a child of a Control so it can obtain a size. Otherwise, make it a RenderTarget and assign its internal texture to some node for display.");
- }
+ }*/
return String();
}
+void Viewport::gui_reset_canvas_sort_index() {
+ gui.canvas_sort_index=0;
+}
+int Viewport::gui_get_canvas_sort_index() {
+
+ return gui.canvas_sort_index++;
+}
+
+void Viewport::set_msaa(MSAA p_msaa) {
+
+ ERR_FAIL_INDEX(p_msaa,5);
+ if (msaa==p_msaa)
+ return;
+ msaa=p_msaa;
+ VS::get_singleton()->viewport_set_msaa(viewport,VS::ViewportMSAA(p_msaa));
+}
+
+Viewport::MSAA Viewport::get_msaa() const {
+
+ return msaa;
+}
+
+void Viewport::set_hdr(bool p_hdr) {
+
+ if (hdr==p_hdr)
+ return;
+
+ hdr=p_hdr;
+ VS::get_singleton()->viewport_set_hdr(viewport,p_hdr);
+
+}
+
+bool Viewport::get_hdr() const{
+
+ return hdr;
+}
+
+
+
void Viewport::_bind_methods() {
- ObjectTypeDB::bind_method(_MD("set_rect","rect"), &Viewport::set_rect);
- ObjectTypeDB::bind_method(_MD("get_rect"), &Viewport::get_rect);
+ ObjectTypeDB::bind_method(_MD("set_size","size"), &Viewport::set_size);
+ ObjectTypeDB::bind_method(_MD("get_size"), &Viewport::get_size);
ObjectTypeDB::bind_method(_MD("set_world_2d","world_2d:World2D"), &Viewport::set_world_2d);
ObjectTypeDB::bind_method(_MD("get_world_2d:World2D"), &Viewport::get_world_2d);
ObjectTypeDB::bind_method(_MD("find_world_2d:World2D"), &Viewport::find_world_2d);
@@ -2633,27 +2665,24 @@ void Viewport::_bind_methods() {
ObjectTypeDB::bind_method(_MD("queue_screen_capture"), &Viewport::queue_screen_capture);
ObjectTypeDB::bind_method(_MD("get_screen_capture"), &Viewport::get_screen_capture);
- ObjectTypeDB::bind_method(_MD("set_as_render_target","enable"), &Viewport::set_as_render_target);
- ObjectTypeDB::bind_method(_MD("is_set_as_render_target"), &Viewport::is_set_as_render_target);
-
- ObjectTypeDB::bind_method(_MD("set_render_target_vflip","enable"), &Viewport::set_render_target_vflip);
- ObjectTypeDB::bind_method(_MD("get_render_target_vflip"), &Viewport::get_render_target_vflip);
- ObjectTypeDB::bind_method(_MD("set_render_target_clear_on_new_frame","enable"), &Viewport::set_render_target_clear_on_new_frame);
- ObjectTypeDB::bind_method(_MD("get_render_target_clear_on_new_frame"), &Viewport::get_render_target_clear_on_new_frame);
+ ObjectTypeDB::bind_method(_MD("set_vflip","enable"), &Viewport::set_vflip);
+ ObjectTypeDB::bind_method(_MD("get_vflip"), &Viewport::get_vflip);
- ObjectTypeDB::bind_method(_MD("render_target_clear"), &Viewport::render_target_clear);
+ ObjectTypeDB::bind_method(_MD("set_clear_on_new_frame","enable"), &Viewport::set_clear_on_new_frame);
+ ObjectTypeDB::bind_method(_MD("get_clear_on_new_frame"), &Viewport::get_clear_on_new_frame);
- ObjectTypeDB::bind_method(_MD("set_render_target_filter","enable"), &Viewport::set_render_target_filter);
- ObjectTypeDB::bind_method(_MD("get_render_target_filter"), &Viewport::get_render_target_filter);
+ ObjectTypeDB::bind_method(_MD("clear"), &Viewport::clear);
+ ObjectTypeDB::bind_method(_MD("set_update_mode","mode"), &Viewport::set_update_mode);
+ ObjectTypeDB::bind_method(_MD("get_update_mode"), &Viewport::get_update_mode);
- ObjectTypeDB::bind_method(_MD("set_render_target_gen_mipmaps","enable"), &Viewport::set_render_target_gen_mipmaps);
- ObjectTypeDB::bind_method(_MD("get_render_target_gen_mipmaps"), &Viewport::get_render_target_gen_mipmaps);
+ ObjectTypeDB::bind_method(_MD("set_msaa","msaa"), &Viewport::set_msaa);
+ ObjectTypeDB::bind_method(_MD("get_msaa"), &Viewport::get_msaa);
- ObjectTypeDB::bind_method(_MD("set_render_target_update_mode","mode"), &Viewport::set_render_target_update_mode);
- ObjectTypeDB::bind_method(_MD("get_render_target_update_mode"), &Viewport::get_render_target_update_mode);
+ ObjectTypeDB::bind_method(_MD("set_hdr","enable"), &Viewport::set_hdr);
+ ObjectTypeDB::bind_method(_MD("get_hdr"), &Viewport::get_hdr);
- ObjectTypeDB::bind_method(_MD("get_render_target_texture:RenderTargetTexture"), &Viewport::get_render_target_texture);
+ ObjectTypeDB::bind_method(_MD("get_texture:ViewportTexture"), &Viewport::get_texture);
ObjectTypeDB::bind_method(_MD("set_physics_object_picking","enable"), &Viewport::set_physics_object_picking);
ObjectTypeDB::bind_method(_MD("get_physics_object_picking"), &Viewport::get_physics_object_picking);
@@ -2674,7 +2703,7 @@ void Viewport::_bind_methods() {
ObjectTypeDB::bind_method(_MD("set_as_audio_listener_2d","enable"), &Viewport::set_as_audio_listener_2d);
ObjectTypeDB::bind_method(_MD("is_audio_listener_2d","enable"), &Viewport::is_audio_listener_2d);
- ObjectTypeDB::bind_method(_MD("set_render_target_to_screen_rect","rect"), &Viewport::set_render_target_to_screen_rect);
+ ObjectTypeDB::bind_method(_MD("set_attach_to_screen_rect","rect"), &Viewport::set_attach_to_screen_rect);
ObjectTypeDB::bind_method(_MD("get_mouse_pos"), &Viewport::get_mouse_pos);
ObjectTypeDB::bind_method(_MD("warp_mouse","to_pos"), &Viewport::warp_mouse);
@@ -2685,31 +2714,60 @@ void Viewport::_bind_methods() {
ObjectTypeDB::bind_method(_MD("set_disable_input","disable"), &Viewport::set_disable_input);
ObjectTypeDB::bind_method(_MD("is_input_disabled"), &Viewport::is_input_disabled);
+ ObjectTypeDB::bind_method(_MD("set_disable_3d","disable"), &Viewport::set_disable_3d);
+ ObjectTypeDB::bind_method(_MD("is_3d_disabled"), &Viewport::is_3d_disabled);
+
ObjectTypeDB::bind_method(_MD("_gui_show_tooltip"), &Viewport::_gui_show_tooltip);
ObjectTypeDB::bind_method(_MD("_gui_remove_focus"), &Viewport::_gui_remove_focus);
- ADD_PROPERTY( PropertyInfo(Variant::RECT2,"rect"), _SCS("set_rect"), _SCS("get_rect") );
+ ObjectTypeDB::bind_method(_MD("set_shadow_atlas_size","size"), &Viewport::set_shadow_atlas_size);
+ ObjectTypeDB::bind_method(_MD("get_shadow_atlas_size"), &Viewport::get_shadow_atlas_size);
+
+ ObjectTypeDB::bind_method(_MD("set_shadow_atlas_quadrant_subdiv","quadrant","subdiv"), &Viewport::set_shadow_atlas_quadrant_subdiv);
+ ObjectTypeDB::bind_method(_MD("get_shadow_atlas_quadrant_subdiv","quadrant"), &Viewport::get_shadow_atlas_quadrant_subdiv);
+
+ ADD_PROPERTY( PropertyInfo(Variant::RECT2,"size"), _SCS("set_size"), _SCS("get_size") );
ADD_PROPERTY( PropertyInfo(Variant::BOOL,"own_world"), _SCS("set_use_own_world"), _SCS("is_using_own_world") );
ADD_PROPERTY( PropertyInfo(Variant::OBJECT,"world",PROPERTY_HINT_RESOURCE_TYPE,"World"), _SCS("set_world"), _SCS("get_world") );
// ADD_PROPERTY( PropertyInfo(Variant::OBJECT,"world_2d",PROPERTY_HINT_RESOURCE_TYPE,"World2D"), _SCS("set_world_2d"), _SCS("get_world_2d") );
ADD_PROPERTY( PropertyInfo(Variant::BOOL,"transparent_bg"), _SCS("set_transparent_background"), _SCS("has_transparent_background") );
- ADD_PROPERTY( PropertyInfo(Variant::BOOL,"render_target/enabled"), _SCS("set_as_render_target"), _SCS("is_set_as_render_target") );
- ADD_PROPERTY( PropertyInfo(Variant::BOOL,"render_target/v_flip"), _SCS("set_render_target_vflip"), _SCS("get_render_target_vflip") );
- ADD_PROPERTY( PropertyInfo(Variant::BOOL,"render_target/clear_on_new_frame"), _SCS("set_render_target_clear_on_new_frame"), _SCS("get_render_target_clear_on_new_frame") );
- ADD_PROPERTY( PropertyInfo(Variant::BOOL,"render_target/filter"), _SCS("set_render_target_filter"), _SCS("get_render_target_filter") );
- ADD_PROPERTY( PropertyInfo(Variant::BOOL,"render_target/gen_mipmaps"), _SCS("set_render_target_gen_mipmaps"), _SCS("get_render_target_gen_mipmaps") );
- ADD_PROPERTY( PropertyInfo(Variant::INT,"render_target/update_mode",PROPERTY_HINT_ENUM,"Disabled,Once,When Visible,Always"), _SCS("set_render_target_update_mode"), _SCS("get_render_target_update_mode") );
+ ADD_PROPERTY( PropertyInfo(Variant::INT,"msaa",PROPERTY_HINT_ENUM,"Disabled,2x,4x,8x,16x"), _SCS("set_msaa"), _SCS("get_msaa") );
+ ADD_PROPERTY( PropertyInfo(Variant::BOOL,"hdr"), _SCS("set_hdr"), _SCS("get_hdr") );
+ ADD_PROPERTY( PropertyInfo(Variant::BOOL,"render_target/v_flip"), _SCS("set_vflip"), _SCS("get_vflip") );
+ ADD_PROPERTY( PropertyInfo(Variant::BOOL,"render_target/clear_on_new_frame"), _SCS("set_clear_on_new_frame"), _SCS("get_clear_on_new_frame") );
+ ADD_PROPERTY( PropertyInfo(Variant::INT,"render_target/update_mode",PROPERTY_HINT_ENUM,"Disabled,Once,When Visible,Always"), _SCS("set_update_mode"), _SCS("get_update_mode") );
ADD_PROPERTY( PropertyInfo(Variant::BOOL,"audio_listener/enable_2d"), _SCS("set_as_audio_listener_2d"), _SCS("is_audio_listener_2d") );
ADD_PROPERTY( PropertyInfo(Variant::BOOL,"audio_listener/enable_3d"), _SCS("set_as_audio_listener"), _SCS("is_audio_listener") );
ADD_PROPERTY( PropertyInfo(Variant::BOOL,"physics/object_picking"), _SCS("set_physics_object_picking"), _SCS("get_physics_object_picking") );
ADD_PROPERTY( PropertyInfo(Variant::BOOL,"gui/disable_input"), _SCS("set_disable_input"), _SCS("is_input_disabled") );
+ ADD_PROPERTY( PropertyInfo(Variant::BOOL,"3d/disable_3d"), _SCS("set_disable_3d"), _SCS("is_3d_disabled") );
+ ADD_PROPERTY( PropertyInfo(Variant::INT,"shadow_atlas/size"), _SCS("set_shadow_atlas_size"), _SCS("get_shadow_atlas_size") );
+ ADD_PROPERTYI( PropertyInfo(Variant::INT,"shadow_atlas/quad_0",PROPERTY_HINT_ENUM,"Disabled,1 Shadow,4 Shadows,16 Shadows,64 Shadows,256 Shadows,1024 Shadows"), _SCS("set_shadow_atlas_quadrant_subdiv"), _SCS("get_shadow_atlas_quadrant_subdiv"),0 );
+ ADD_PROPERTYI( PropertyInfo(Variant::INT,"shadow_atlas/quad_1",PROPERTY_HINT_ENUM,"Disabled,1 Shadow,4 Shadows,16 Shadows,64 Shadows,256 Shadows,1024 Shadows"), _SCS("set_shadow_atlas_quadrant_subdiv"), _SCS("get_shadow_atlas_quadrant_subdiv"),1 );
+ ADD_PROPERTYI( PropertyInfo(Variant::INT,"shadow_atlas/quad_2",PROPERTY_HINT_ENUM,"Disabled,1 Shadow,4 Shadows,16 Shadows,64 Shadows,256 Shadows,1024 Shadows"), _SCS("set_shadow_atlas_quadrant_subdiv"), _SCS("get_shadow_atlas_quadrant_subdiv"),2 );
+ ADD_PROPERTYI( PropertyInfo(Variant::INT,"shadow_atlas/quad_3",PROPERTY_HINT_ENUM,"Disabled,1 Shadow,4 Shadows,16 Shadows,64 Shadows,256 Shadows,1024 Shadows"), _SCS("set_shadow_atlas_quadrant_subdiv"), _SCS("get_shadow_atlas_quadrant_subdiv"),3 );
ADD_SIGNAL(MethodInfo("size_changed"));
- BIND_CONSTANT( RENDER_TARGET_UPDATE_DISABLED );
- BIND_CONSTANT( RENDER_TARGET_UPDATE_ONCE );
- BIND_CONSTANT( RENDER_TARGET_UPDATE_WHEN_VISIBLE );
- BIND_CONSTANT( RENDER_TARGET_UPDATE_ALWAYS );
+ BIND_CONSTANT( UPDATE_DISABLED );
+ BIND_CONSTANT( UPDATE_ONCE );
+ BIND_CONSTANT( UPDATE_WHEN_VISIBLE );
+ BIND_CONSTANT( UPDATE_ALWAYS );
+
+ BIND_CONSTANT( SHADOW_ATLAS_QUADRANT_SUBDIV_DISABLED );
+ BIND_CONSTANT( SHADOW_ATLAS_QUADRANT_SUBDIV_1 );
+ BIND_CONSTANT( SHADOW_ATLAS_QUADRANT_SUBDIV_4 );
+ BIND_CONSTANT( SHADOW_ATLAS_QUADRANT_SUBDIV_16 );
+ BIND_CONSTANT( SHADOW_ATLAS_QUADRANT_SUBDIV_64 );
+ BIND_CONSTANT( SHADOW_ATLAS_QUADRANT_SUBDIV_256 );
+ BIND_CONSTANT( SHADOW_ATLAS_QUADRANT_SUBDIV_1024 );
+ BIND_CONSTANT( SHADOW_ATLAS_QUADRANT_SUBDIV_MAX );
+
+ BIND_CONSTANT( MSAA_DISABLED );
+ BIND_CONSTANT( MSAA_2X );
+ BIND_CONSTANT( MSAA_4X );
+ BIND_CONSTANT( MSAA_8X );
+ BIND_CONSTANT( MSAA_16X );
}
@@ -2723,6 +2781,7 @@ Viewport::Viewport() {
world_2d = Ref<World2D>( memnew( World2D ));
viewport = VisualServer::get_singleton()->viewport_create();
+ texture_rid=VisualServer::get_singleton()->viewport_get_texture(viewport);
internal_listener = SpatialSoundServer::get_singleton()->listener_create();
audio_listener=false;
internal_listener_2d = SpatialSound2DServer::get_singleton()->listener_create();
@@ -2734,19 +2793,28 @@ Viewport::Viewport() {
size_override=false;
size_override_stretch=false;
size_override_size=Size2(1,1);
- render_target_gen_mipmaps=false;
- render_target=false;
- render_target_vflip=false;
- render_target_clear_on_new_frame=true;
- //render_target_clear=true;
- render_target_update_mode=RENDER_TARGET_UPDATE_WHEN_VISIBLE;
- render_target_texture = Ref<RenderTargetTexture>( memnew( RenderTargetTexture(this) ) );
+ gen_mipmaps=false;
+
+ vflip=false;
+ clear_on_new_frame=true;
+ //clear=true;
+ update_mode=UPDATE_WHEN_VISIBLE;
+ texture = Ref<ViewportTexture>( memnew( ViewportTexture(this) ) );
physics_object_picking=false;
physics_object_capture=0;
physics_object_over=0;
physics_last_mousepos=Vector2(1e20,1e20);
+ shadow_atlas_size=0;
+ for(int i=0;i<4;i++) {
+ shadow_atlas_quadrant_subdiv[i]=SHADOW_ATLAS_QUADRANT_SUBDIV_MAX;
+ }
+ set_shadow_atlas_quadrant_subdiv(0,SHADOW_ATLAS_QUADRANT_SUBDIV_4);
+ set_shadow_atlas_quadrant_subdiv(1,SHADOW_ATLAS_QUADRANT_SUBDIV_4);
+ set_shadow_atlas_quadrant_subdiv(2,SHADOW_ATLAS_QUADRANT_SUBDIV_16);
+ set_shadow_atlas_quadrant_subdiv(3,SHADOW_ATLAS_QUADRANT_SUBDIV_64);
+
String id=itos(get_instance_ID());
input_group = "_vp_input"+id;
@@ -2755,6 +2823,7 @@ Viewport::Viewport() {
unhandled_key_input_group = "_vp_unhandled_key_input"+id;
disable_input=false;
+ disable_3d=false;
//window tooltip
gui.tooltip_timer = -1;
@@ -2766,9 +2835,11 @@ Viewport::Viewport() {
gui.tooltip_label=NULL;
gui.drag_preview=NULL;
gui.drag_attempted=false;
+ gui.canvas_sort_index=0;
- parent_control=NULL;
+ msaa=MSAA_DISABLED;
+ hdr=false;
}
@@ -2779,8 +2850,8 @@ Viewport::~Viewport() {
VisualServer::get_singleton()->free( viewport );
SpatialSoundServer::get_singleton()->free(internal_listener);
SpatialSound2DServer::get_singleton()->free(internal_listener_2d);
- if (render_target_texture.is_valid())
- render_target_texture->vp=NULL; //so if used, will crash
+ if (texture.is_valid())
+ texture->vp=NULL; //so if used, will crash
}
diff --git a/scene/main/viewport.h b/scene/main/viewport.h
index 2a54aec96a..c4b4948c30 100644
--- a/scene/main/viewport.h
+++ b/scene/main/viewport.h
@@ -48,9 +48,9 @@ class Label;
class Timer;
class Viewport;
-class RenderTargetTexture : public Texture {
+class ViewportTexture : public Texture {
- OBJ_TYPE( RenderTargetTexture, Texture );
+ OBJ_TYPE( ViewportTexture, Texture );
int flags;
friend class Viewport;
@@ -70,7 +70,7 @@ public:
virtual void set_flags(uint32_t p_flags);
virtual uint32_t get_flags() const;
- RenderTargetTexture(Viewport *p_vp=NULL);
+ ViewportTexture(Viewport *p_vp=NULL);
};
@@ -79,19 +79,39 @@ class Viewport : public Node {
OBJ_TYPE( Viewport, Node );
public:
- enum RenderTargetUpdateMode {
- RENDER_TARGET_UPDATE_DISABLED,
- RENDER_TARGET_UPDATE_ONCE, //then goes to disabled
- RENDER_TARGET_UPDATE_WHEN_VISIBLE, // default
- RENDER_TARGET_UPDATE_ALWAYS
+ enum UpdateMode {
+ UPDATE_DISABLED,
+ UPDATE_ONCE, //then goes to disabled
+ UPDATE_WHEN_VISIBLE, // default
+ UPDATE_ALWAYS
+ };
+
+ enum ShadowAtlasQuadrantSubdiv {
+ SHADOW_ATLAS_QUADRANT_SUBDIV_DISABLED,
+ SHADOW_ATLAS_QUADRANT_SUBDIV_1,
+ SHADOW_ATLAS_QUADRANT_SUBDIV_4,
+ SHADOW_ATLAS_QUADRANT_SUBDIV_16,
+ SHADOW_ATLAS_QUADRANT_SUBDIV_64,
+ SHADOW_ATLAS_QUADRANT_SUBDIV_256,
+ SHADOW_ATLAS_QUADRANT_SUBDIV_1024,
+ SHADOW_ATLAS_QUADRANT_SUBDIV_MAX,
+
+ };
+
+ enum MSAA {
+ MSAA_DISABLED,
+ MSAA_2X,
+ MSAA_4X,
+ MSAA_8X,
+ MSAA_16X,
};
private:
-friend class RenderTargetTexture;
+friend class ViewportTexture;
+
- Control *parent_control;
Viewport *parent;
Listener *listener;
@@ -101,7 +121,6 @@ friend class RenderTargetTexture;
Set<Camera*> cameras;
RID viewport;
- RID canvas_item;
RID current_canvas;
bool audio_listener;
@@ -114,15 +133,13 @@ friend class RenderTargetTexture;
Matrix32 global_canvas_transform;
Matrix32 stretch_transform;
- Rect2 rect;
+ Size2 size;
Rect2 to_screen_rect;
RID contact_2d_debug;
RID contact_3d_debug_multimesh;
RID contact_3d_debug_instance;
-
-
bool size_override;
bool size_override_stretch;
Size2 size_override_size;
@@ -131,10 +148,10 @@ friend class RenderTargetTexture;
Rect2 last_vp_rect;
bool transparent_bg;
- bool render_target_vflip;
- bool render_target_clear_on_new_frame;
- bool render_target_filter;
- bool render_target_gen_mipmaps;
+ bool vflip;
+ bool clear_on_new_frame;
+ bool filter;
+ bool gen_mipmaps;
bool physics_object_picking;
List<InputEvent> physics_picking_events;
@@ -170,10 +187,17 @@ friend class RenderTargetTexture;
void _update_stretch_transform();
void _update_global_transform();
- bool render_target;
- RenderTargetUpdateMode render_target_update_mode;
- RID render_target_texture_rid;
- Ref<RenderTargetTexture> render_target_texture;
+
+ bool disable_3d;
+ UpdateMode update_mode;
+ RID texture_rid;
+ Ref<ViewportTexture> texture;
+
+ int shadow_atlas_size;
+ ShadowAtlasQuadrantSubdiv shadow_atlas_quadrant_subdiv[4];
+
+ MSAA msaa;
+ bool hdr;
struct GUI {
@@ -202,6 +226,7 @@ friend class RenderTargetTexture;
List<Control*> subwindows;
bool roots_order_dirty;
List<Control*> roots;
+ int canvas_sort_index; //for sorting items with canvas as root
GUI();
@@ -299,8 +324,10 @@ public:
void set_as_audio_listener_2d(bool p_enable);
bool is_audio_listener_2d() const;
- void set_rect(const Rect2& p_rect);
- Rect2 get_rect() const;
+ void set_size(const Size2& p_size);
+
+
+ Size2 get_size() const;
Rect2 get_visible_rect() const;
RID get_viewport() const;
@@ -327,30 +354,34 @@ public:
void set_size_override(bool p_enable,const Size2& p_size=Size2(-1,-1),const Vector2& p_margin=Vector2());
Size2 get_size_override() const;
+
bool is_size_override_enabled() const;
void set_size_override_stretch(bool p_enable);
bool is_size_override_stretch_enabled() const;
- void set_as_render_target(bool p_enable);
- bool is_set_as_render_target() const;
+ void set_vflip(bool p_enable);
+ bool get_vflip() const;
+
+ void set_clear_on_new_frame(bool p_enable);
+ bool get_clear_on_new_frame() const;
+ void clear();
- void set_render_target_vflip(bool p_enable);
- bool get_render_target_vflip() const;
- void set_render_target_clear_on_new_frame(bool p_enable);
- bool get_render_target_clear_on_new_frame() const;
- void render_target_clear();
+ void set_update_mode(UpdateMode p_mode);
+ UpdateMode get_update_mode() const;
+ Ref<ViewportTexture> get_texture() const;
- void set_render_target_filter(bool p_enable);
- bool get_render_target_filter() const;
+ void set_shadow_atlas_size(int p_size);
+ int get_shadow_atlas_size() const;
- void set_render_target_gen_mipmaps(bool p_enable);
- bool get_render_target_gen_mipmaps() const;
+ void set_shadow_atlas_quadrant_subdiv(int p_quadrant,ShadowAtlasQuadrantSubdiv p_subdiv);
+ ShadowAtlasQuadrantSubdiv get_shadow_atlas_quadrant_subdiv(int p_quadrant) const;
- void set_render_target_update_mode(RenderTargetUpdateMode p_mode);
- RenderTargetUpdateMode get_render_target_update_mode() const;
- Ref<RenderTargetTexture> get_render_target_texture() const;
+ void set_msaa(MSAA p_msaa);
+ MSAA get_msaa() const;
+ void set_hdr(bool p_hdr);
+ bool get_hdr() const;
Vector2 get_camera_coords(const Vector2& p_viewport_coords) const;
Vector2 get_camera_rect_size() const;
@@ -367,8 +398,11 @@ public:
void set_disable_input(bool p_disable);
bool is_input_disabled() const;
- void set_render_target_to_screen_rect(const Rect2& p_rect);
- Rect2 get_render_target_to_screen_rect() const;
+ void set_disable_3d(bool p_disable);
+ bool is_3d_disabled() const;
+
+ void set_attach_to_screen_rect(const Rect2& p_rect);
+ Rect2 get_attach_to_screen_rect() const;
Vector2 get_mouse_pos() const;
void warp_mouse(const Vector2& p_pos);
@@ -381,12 +415,20 @@ public:
Variant gui_get_drag_data() const;
Control *get_modal_stack_top() const;
+ void gui_reset_canvas_sort_index();
+ int gui_get_canvas_sort_index();
+
virtual String get_configuration_warning() const;
+
+
Viewport();
~Viewport();
};
-VARIANT_ENUM_CAST(Viewport::RenderTargetUpdateMode);
+VARIANT_ENUM_CAST( Viewport::UpdateMode );
+VARIANT_ENUM_CAST( Viewport::ShadowAtlasQuadrantSubdiv );
+VARIANT_ENUM_CAST( Viewport::MSAA );
+
#endif