viewport.cpp 40 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464
  1. /*************************************************************************/
  2. /* viewport.cpp */
  3. /*************************************************************************/
  4. /* This file is part of: */
  5. /* GODOT ENGINE */
  6. /* http://www.godotengine.org */
  7. /*************************************************************************/
  8. /* Copyright (c) 2007-2015 Juan Linietsky, Ariel Manzur. */
  9. /* */
  10. /* Permission is hereby granted, free of charge, to any person obtaining */
  11. /* a copy of this software and associated documentation files (the */
  12. /* "Software"), to deal in the Software without restriction, including */
  13. /* without limitation the rights to use, copy, modify, merge, publish, */
  14. /* distribute, sublicense, and/or sell copies of the Software, and to */
  15. /* permit persons to whom the Software is furnished to do so, subject to */
  16. /* the following conditions: */
  17. /* */
  18. /* The above copyright notice and this permission notice shall be */
  19. /* included in all copies or substantial portions of the Software. */
  20. /* */
  21. /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
  22. /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
  23. /* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
  24. /* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
  25. /* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
  26. /* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
  27. /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
  28. /*************************************************************************/
  29. #include "viewport.h"
  30. #include "os/os.h"
  31. #include "scene/3d/spatial.h"
  32. #include "os/input.h"
  33. #include "servers/physics_2d_server.h"
  34. //#include "scene/3d/camera.h"
  35. #include "servers/spatial_sound_server.h"
  36. #include "servers/spatial_sound_2d_server.h"
  37. #include "scene/gui/control.h"
  38. #include "scene/3d/camera.h"
  39. #include "scene/3d/spatial_indexer.h"
  40. #include "scene/3d/collision_object.h"
  41. #include "scene/2d/collision_object_2d.h"
  42. int RenderTargetTexture::get_width() const {
  43. ERR_FAIL_COND_V(!vp,0);
  44. return vp->rect.size.width;
  45. }
  46. int RenderTargetTexture::get_height() const{
  47. ERR_FAIL_COND_V(!vp,0);
  48. return vp->rect.size.height;
  49. }
  50. Size2 RenderTargetTexture::get_size() const{
  51. ERR_FAIL_COND_V(!vp,Size2());
  52. return vp->rect.size;
  53. }
  54. RID RenderTargetTexture::get_rid() const{
  55. ERR_FAIL_COND_V(!vp,RID());
  56. return vp->render_target_texture_rid;
  57. }
  58. bool RenderTargetTexture::has_alpha() const{
  59. return false;
  60. }
  61. void RenderTargetTexture::set_flags(uint32_t p_flags){
  62. ERR_FAIL_COND(!vp);
  63. if (p_flags&FLAG_FILTER)
  64. flags=FLAG_FILTER;
  65. else
  66. flags=0;
  67. VS::get_singleton()->texture_set_flags(vp->render_target_texture_rid,flags);
  68. }
  69. uint32_t RenderTargetTexture::get_flags() const{
  70. return flags;
  71. }
  72. RenderTargetTexture::RenderTargetTexture(Viewport *p_vp){
  73. vp=p_vp;
  74. flags=0;
  75. }
  76. void Viewport::_update_stretch_transform() {
  77. if (size_override_stretch && size_override) {
  78. //print_line("sive override size "+size_override_size);
  79. //print_line("rect size "+rect.size);
  80. stretch_transform=Matrix32();
  81. Size2 scale = rect.size/(size_override_size+size_override_margin*2);
  82. stretch_transform.scale(scale);
  83. stretch_transform.elements[2]=size_override_margin*scale;
  84. } else {
  85. stretch_transform=Matrix32();
  86. }
  87. _update_global_transform();
  88. }
  89. void Viewport::_update_rect() {
  90. if (!is_inside_tree())
  91. return;
  92. Node *parent = get_parent();
  93. if (!render_target && parent && parent->cast_to<Control>()) {
  94. Control *c = parent->cast_to<Control>();
  95. rect.pos=Point2();
  96. rect.size=c->get_size();
  97. }
  98. VisualServer::ViewportRect vr;
  99. vr.x=rect.pos.x;
  100. vr.y=rect.pos.y;
  101. if (render_target) {
  102. vr.x=0;
  103. vr.y=0;
  104. }
  105. vr.width=rect.size.width;
  106. vr.height=rect.size.height;
  107. VisualServer::get_singleton()->viewport_set_rect(viewport,vr);
  108. last_vp_rect=rect;
  109. if (canvas_item.is_valid()) {
  110. VisualServer::get_singleton()->canvas_item_set_custom_rect(canvas_item,true,rect);
  111. }
  112. emit_signal("size_changed");
  113. render_target_texture->emit_changed();
  114. }
  115. void Viewport::_parent_resized() {
  116. _update_rect();
  117. }
  118. void Viewport::_parent_draw() {
  119. }
  120. void Viewport::_parent_visibility_changed() {
  121. Node *parent = get_parent();
  122. if (parent && parent->cast_to<Control>()) {
  123. Control *c = parent->cast_to<Control>();
  124. VisualServer::get_singleton()->canvas_item_set_visible(canvas_item,c->is_visible());
  125. _update_listener();
  126. _update_listener_2d();
  127. }
  128. }
  129. void Viewport::_vp_enter_tree() {
  130. Node *parent = get_parent();
  131. //none?
  132. if (parent && parent->cast_to<Control>()) {
  133. Control *cparent=parent->cast_to<Control>();
  134. RID parent_ci = cparent->get_canvas_item();
  135. ERR_FAIL_COND(!parent_ci.is_valid());
  136. canvas_item = VisualServer::get_singleton()->canvas_item_create();
  137. VisualServer::get_singleton()->canvas_item_set_parent(canvas_item,parent_ci);
  138. VisualServer::get_singleton()->canvas_item_set_visible(canvas_item,false);
  139. VisualServer::get_singleton()->canvas_item_attach_viewport(canvas_item,viewport);
  140. parent->connect("resized",this,"_parent_resized");
  141. parent->connect("visibility_changed",this,"_parent_visibility_changed");
  142. } else if (!parent){
  143. VisualServer::get_singleton()->viewport_attach_to_screen(viewport,0);
  144. }
  145. }
  146. void Viewport::_vp_exit_tree() {
  147. Node *parent = get_parent();
  148. if (parent && parent->cast_to<Control>()) {
  149. parent->disconnect("resized",this,"_parent_resized");
  150. }
  151. if (parent && parent->cast_to<Control>()) {
  152. parent->disconnect("visibility_changed",this,"_parent_visibility_changed");
  153. }
  154. if (canvas_item.is_valid()) {
  155. VisualServer::get_singleton()->free(canvas_item);
  156. canvas_item=RID();
  157. }
  158. if (!parent) {
  159. VisualServer::get_singleton()->viewport_detach(viewport);
  160. }
  161. }
  162. void Viewport::update_worlds() {
  163. if (!is_inside_tree())
  164. return;
  165. Rect2 xformed_rect = (global_canvas_transform * canvas_transform).affine_inverse().xform(get_visible_rect());
  166. find_world_2d()->_update_viewport(this,xformed_rect);
  167. find_world_2d()->_update();
  168. find_world()->_update(get_tree()->get_frame());
  169. }
  170. void Viewport::_test_new_mouseover(ObjectID new_collider) {
  171. #ifndef _3D_DISABLED
  172. if (new_collider!=physics_object_over) {
  173. if (physics_object_over) {
  174. Object *obj = ObjectDB::get_instance(physics_object_over);
  175. if (obj) {
  176. CollisionObject *co = obj->cast_to<CollisionObject>();
  177. if (co) {
  178. co->_mouse_exit();
  179. }
  180. }
  181. }
  182. if (new_collider) {
  183. Object *obj = ObjectDB::get_instance(new_collider);
  184. if (obj) {
  185. CollisionObject *co = obj->cast_to<CollisionObject>();
  186. if (co) {
  187. co->_mouse_enter();
  188. }
  189. }
  190. }
  191. physics_object_over=new_collider;
  192. }
  193. #endif
  194. }
  195. void Viewport::_notification(int p_what) {
  196. switch( p_what ) {
  197. case NOTIFICATION_ENTER_TREE: {
  198. if (!render_target)
  199. _vp_enter_tree();
  200. this->parent=NULL;
  201. Node *parent=get_parent();
  202. if (parent) {
  203. while(parent && !(this->parent=parent->cast_to<Viewport>())) {
  204. parent=parent->get_parent();
  205. }
  206. }
  207. current_canvas=find_world_2d()->get_canvas();
  208. VisualServer::get_singleton()->viewport_set_scenario(viewport,find_world()->get_scenario());
  209. VisualServer::get_singleton()->viewport_attach_canvas(viewport,current_canvas);
  210. _update_listener();
  211. _update_listener_2d();
  212. _update_rect();
  213. if (world_2d.is_valid()) {
  214. find_world_2d()->_register_viewport(this,Rect2());
  215. //best to defer this and not do it here, as it can annoy a lot of setup logic if user
  216. //adds a node and then moves it, will get enter/exit screen/viewport notifications
  217. //unnecesarily
  218. // update_worlds();
  219. }
  220. add_to_group("_viewports");
  221. } break;
  222. case NOTIFICATION_READY: {
  223. #ifndef _3D_DISABLED
  224. if (cameras.size() && !camera) {
  225. //there are cameras but no current camera, pick first in tree and make it current
  226. Camera *first=NULL;
  227. for(Set<Camera*>::Element *E=cameras.front();E;E=E->next()) {
  228. if (first==NULL || first->is_greater_than(E->get())) {
  229. first=E->get();
  230. }
  231. }
  232. if (first)
  233. first->make_current();
  234. }
  235. #endif
  236. } break;
  237. case NOTIFICATION_EXIT_TREE: {
  238. if (world_2d.is_valid())
  239. world_2d->_remove_viewport(this);
  240. if (!render_target)
  241. _vp_exit_tree();
  242. VisualServer::get_singleton()->viewport_set_scenario(viewport,RID());
  243. SpatialSoundServer::get_singleton()->listener_set_space(listener,RID());
  244. VisualServer::get_singleton()->viewport_remove_canvas(viewport,current_canvas);
  245. remove_from_group("_viewports");
  246. } break;
  247. case NOTIFICATION_FIXED_PROCESS: {
  248. if (physics_object_picking) {
  249. Vector2 last_pos(1e20,1e20);
  250. CollisionObject *last_object;
  251. ObjectID last_id=0;
  252. PhysicsDirectSpaceState::RayResult result;
  253. Physics2DDirectSpaceState *ss2d=Physics2DServer::get_singleton()->space_get_direct_state(find_world_2d()->get_space());
  254. bool motion_tested=false;
  255. while(physics_picking_events.size()) {
  256. InputEvent ev = physics_picking_events.front()->get();
  257. physics_picking_events.pop_front();
  258. Vector2 pos;
  259. switch(ev.type) {
  260. case InputEvent::MOUSE_MOTION: {
  261. pos.x=ev.mouse_motion.x;
  262. pos.y=ev.mouse_motion.y;
  263. motion_tested=true;
  264. physics_last_mousepos=pos;
  265. } break;
  266. case InputEvent::MOUSE_BUTTON: {
  267. pos.x=ev.mouse_button.x;
  268. pos.y=ev.mouse_button.y;
  269. } break;
  270. case InputEvent::SCREEN_DRAG: {
  271. pos.x=ev.screen_drag.x;
  272. pos.y=ev.screen_drag.y;
  273. } break;
  274. case InputEvent::SCREEN_TOUCH: {
  275. pos.x=ev.screen_touch.x;
  276. pos.y=ev.screen_touch.y;
  277. } break;
  278. }
  279. if (ss2d) {
  280. //send to 2D
  281. uint64_t frame = get_tree()->get_frame();
  282. Vector2 point = get_canvas_transform().affine_inverse().xform(pos);
  283. Physics2DDirectSpaceState::ShapeResult res[64];
  284. int rc = ss2d->intersect_point(point,res,64,Set<RID>(),0xFFFFFFFF,0xFFFFFFFF);
  285. for(int i=0;i<rc;i++) {
  286. if (res[i].collider_id && res[i].collider) {
  287. CollisionObject2D *co=res[i].collider->cast_to<CollisionObject2D>();
  288. if (co) {
  289. Map<ObjectID,uint64_t>::Element *E=physics_2d_mouseover.find(res[i].collider_id);
  290. if (!E) {
  291. E=physics_2d_mouseover.insert(res[i].collider_id,frame);
  292. co->_mouse_enter();
  293. } else {
  294. E->get()=frame;
  295. }
  296. co->_input_event(this,ev,res[i].shape);
  297. }
  298. }
  299. }
  300. List<Map<ObjectID,uint64_t>::Element*> to_erase;
  301. for (Map<ObjectID,uint64_t>::Element*E=physics_2d_mouseover.front();E;E=E->next()) {
  302. if (E->get()!=frame) {
  303. Object *o=ObjectDB::get_instance(E->key());
  304. if (o) {
  305. CollisionObject2D *co=o->cast_to<CollisionObject2D>();
  306. if (co) {
  307. co->_mouse_exit();
  308. }
  309. }
  310. to_erase.push_back(E);
  311. }
  312. }
  313. while(to_erase.size()) {
  314. physics_2d_mouseover.erase(to_erase.front()->get());
  315. to_erase.pop_front();
  316. }
  317. }
  318. #ifndef _3D_DISABLED
  319. bool captured=false;
  320. if (physics_object_capture!=0) {
  321. Object *obj = ObjectDB::get_instance(physics_object_capture);
  322. if (obj) {
  323. CollisionObject *co = obj->cast_to<CollisionObject>();
  324. if (co) {
  325. co->_input_event(camera,ev,Vector3(),Vector3(),0);
  326. captured=true;
  327. if (ev.type==InputEvent::MOUSE_BUTTON && ev.mouse_button.button_index==1 && !ev.mouse_button.pressed) {
  328. physics_object_capture=0;
  329. }
  330. } else {
  331. physics_object_capture=0;
  332. }
  333. } else {
  334. physics_object_capture=0;
  335. }
  336. }
  337. if (captured) {
  338. //none
  339. } else if (pos==last_pos) {
  340. if (last_id) {
  341. if (ObjectDB::get_instance(last_id)) {
  342. //good, exists
  343. last_object->_input_event(camera,ev,result.position,result.normal,result.shape);
  344. if (last_object->get_capture_input_on_drag() && ev.type==InputEvent::MOUSE_BUTTON && ev.mouse_button.button_index==1 && ev.mouse_button.pressed) {
  345. physics_object_capture=last_id;
  346. }
  347. }
  348. }
  349. } else {
  350. if (camera) {
  351. Vector3 from = camera->project_ray_origin(pos);
  352. Vector3 dir = camera->project_ray_normal(pos);
  353. PhysicsDirectSpaceState *space = PhysicsServer::get_singleton()->space_get_direct_state(find_world()->get_space());
  354. if (space) {
  355. bool col = space->intersect_ray(from,from+dir*10000,result,Set<RID>(),0xFFFFFFFF,0xFFFFFFFF);
  356. ObjectID new_collider=0;
  357. if (col) {
  358. if (result.collider) {
  359. CollisionObject *co = result.collider->cast_to<CollisionObject>();
  360. if (co) {
  361. co->_input_event(camera,ev,result.position,result.normal,result.shape);
  362. last_object=co;
  363. last_id=result.collider_id;
  364. new_collider=last_id;
  365. if (co->get_capture_input_on_drag() && ev.type==InputEvent::MOUSE_BUTTON && ev.mouse_button.button_index==1 && ev.mouse_button.pressed) {
  366. physics_object_capture=last_id;
  367. }
  368. }
  369. }
  370. }
  371. if (ev.type==InputEvent::MOUSE_MOTION) {
  372. _test_new_mouseover(new_collider);
  373. }
  374. }
  375. last_pos=pos;
  376. }
  377. }
  378. }
  379. if (!motion_tested && camera && physics_last_mousepos!=Vector2(1e20,1e20)) {
  380. //test anyway for mouseenter/exit because objects might move
  381. Vector3 from = camera->project_ray_origin(physics_last_mousepos);
  382. Vector3 dir = camera->project_ray_normal(physics_last_mousepos);
  383. PhysicsDirectSpaceState *space = PhysicsServer::get_singleton()->space_get_direct_state(find_world()->get_space());
  384. if (space) {
  385. bool col = space->intersect_ray(from,from+dir*10000,result,Set<RID>(),0xFFFFFFFF,0xFFFFFFFF);
  386. ObjectID new_collider=0;
  387. if (col) {
  388. if (result.collider) {
  389. CollisionObject *co = result.collider->cast_to<CollisionObject>();
  390. if (co) {
  391. new_collider=result.collider_id;
  392. }
  393. }
  394. }
  395. _test_new_mouseover(new_collider);
  396. }
  397. #endif
  398. }
  399. }
  400. } break;
  401. }
  402. }
  403. RID Viewport::get_viewport() const {
  404. return viewport;
  405. }
  406. void Viewport::set_rect(const Rect2& p_rect) {
  407. if (rect==p_rect)
  408. return;
  409. rect=p_rect;
  410. _update_rect();
  411. _update_stretch_transform();
  412. }
  413. Rect2 Viewport::get_visible_rect() const {
  414. Rect2 r;
  415. if (rect.pos==Vector2() && rect.size==Size2()) {
  416. r=Rect2( Point2(), Size2( OS::get_singleton()->get_video_mode().width, OS::get_singleton()->get_video_mode().height ) );
  417. } else {
  418. r=Rect2( rect.pos , rect.size );
  419. }
  420. if (size_override) {
  421. r.size=size_override_size;
  422. }
  423. return r;
  424. }
  425. Rect2 Viewport::get_rect() const {
  426. return rect;
  427. }
  428. void Viewport::_update_listener() {
  429. if (is_inside_tree() && audio_listener && camera && (!get_parent() || (get_parent()->cast_to<Control>() && get_parent()->cast_to<Control>()->is_visible()))) {
  430. SpatialSoundServer::get_singleton()->listener_set_space(listener,find_world()->get_sound_space());
  431. } else {
  432. SpatialSoundServer::get_singleton()->listener_set_space(listener,RID());
  433. }
  434. }
  435. void Viewport::_update_listener_2d() {
  436. if (is_inside_tree() && audio_listener && (!get_parent() || (get_parent()->cast_to<Control>() && get_parent()->cast_to<Control>()->is_visible())))
  437. SpatialSound2DServer::get_singleton()->listener_set_space(listener_2d,find_world_2d()->get_sound_space());
  438. else
  439. SpatialSound2DServer::get_singleton()->listener_set_space(listener_2d,RID());
  440. }
  441. void Viewport::set_as_audio_listener(bool p_enable) {
  442. if (p_enable==audio_listener)
  443. return;
  444. audio_listener=p_enable;
  445. _update_listener();
  446. }
  447. bool Viewport::is_audio_listener() const {
  448. return audio_listener;
  449. }
  450. void Viewport::set_as_audio_listener_2d(bool p_enable) {
  451. if (p_enable==audio_listener_2d)
  452. return;
  453. audio_listener_2d=p_enable;
  454. _update_listener_2d();
  455. }
  456. bool Viewport::is_audio_listener_2d() const {
  457. return audio_listener_2d;
  458. }
  459. void Viewport::set_canvas_transform(const Matrix32& p_transform) {
  460. canvas_transform=p_transform;
  461. VisualServer::get_singleton()->viewport_set_canvas_transform(viewport,find_world_2d()->get_canvas(),canvas_transform);
  462. Matrix32 xform = (global_canvas_transform * canvas_transform).affine_inverse();
  463. Size2 ss = get_visible_rect().size;
  464. SpatialSound2DServer::get_singleton()->listener_set_transform(listener_2d,Matrix32(0,xform.xform(ss*0.5)));
  465. Vector2 ss2 = ss*xform.get_scale();
  466. float panrange = MAX(ss2.x,ss2.y);
  467. SpatialSound2DServer::get_singleton()->listener_set_param(listener_2d,SpatialSound2DServer::LISTENER_PARAM_PAN_RANGE,panrange);
  468. }
  469. Matrix32 Viewport::get_canvas_transform() const{
  470. return canvas_transform;
  471. }
  472. void Viewport::_update_global_transform() {
  473. Matrix32 sxform = stretch_transform * global_canvas_transform;
  474. VisualServer::get_singleton()->viewport_set_global_canvas_transform(viewport,sxform);
  475. Matrix32 xform = (sxform * canvas_transform).affine_inverse();
  476. Size2 ss = get_visible_rect().size;
  477. SpatialSound2DServer::get_singleton()->listener_set_transform(listener_2d,Matrix32(0,xform.xform(ss*0.5)));
  478. Vector2 ss2 = ss*xform.get_scale();
  479. float panrange = MAX(ss2.x,ss2.y);
  480. SpatialSound2DServer::get_singleton()->listener_set_param(listener_2d,SpatialSound2DServer::LISTENER_PARAM_PAN_RANGE,panrange);
  481. }
  482. void Viewport::set_global_canvas_transform(const Matrix32& p_transform) {
  483. global_canvas_transform=p_transform;
  484. _update_global_transform();
  485. }
  486. Matrix32 Viewport::get_global_canvas_transform() const{
  487. return global_canvas_transform;
  488. }
  489. void Viewport::_camera_transform_changed_notify() {
  490. #ifndef _3D_DISABLED
  491. if (camera)
  492. SpatialSoundServer::get_singleton()->listener_set_transform(listener,camera->get_camera_transform());
  493. #endif
  494. }
  495. void Viewport::_set_camera(Camera* p_camera) {
  496. #ifndef _3D_DISABLED
  497. if (camera==p_camera)
  498. return;
  499. if (camera && find_world().is_valid()) {
  500. camera->notification(Camera::NOTIFICATION_LOST_CURRENT);
  501. }
  502. camera=p_camera;
  503. if (camera)
  504. VisualServer::get_singleton()->viewport_attach_camera(viewport,camera->get_camera());
  505. else
  506. VisualServer::get_singleton()->viewport_attach_camera(viewport,RID());
  507. if (camera && find_world().is_valid()) {
  508. camera->notification(Camera::NOTIFICATION_BECAME_CURRENT);
  509. }
  510. _update_listener();
  511. _camera_transform_changed_notify();
  512. #endif
  513. }
  514. void Viewport::set_transparent_background(bool p_enable) {
  515. transparent_bg=p_enable;
  516. VS::get_singleton()->viewport_set_transparent_background(viewport,p_enable);
  517. }
  518. bool Viewport::has_transparent_background() const {
  519. return transparent_bg;
  520. }
  521. #if 0
  522. void Viewport::set_world_2d(const Ref<World2D>& p_world_2d) {
  523. world_2d=p_world_2d;
  524. _update_listener_2d();
  525. if (is_inside_scene()) {
  526. if (current_canvas.is_valid())
  527. VisualServer::get_singleton()->viewport_remove_canvas(viewport,current_canvas);
  528. current_canvas=find_world_2d()->get_canvas();
  529. VisualServer::get_singleton()->viewport_attach_canvas(viewport,current_canvas);
  530. }
  531. }
  532. Ref<World2D> Viewport::find_world_2d() const{
  533. if (world_2d.is_valid())
  534. return world_2d;
  535. else if (parent)
  536. return parent->find_world_2d();
  537. else
  538. return Ref<World2D>();
  539. }
  540. #endif
  541. Ref<World2D> Viewport::find_world_2d() const{
  542. return world_2d;
  543. }
  544. void Viewport::_propagate_enter_world(Node *p_node) {
  545. if (p_node!=this) {
  546. if (!p_node->is_inside_tree()) //may not have entered scene yet
  547. return;
  548. Spatial *s = p_node->cast_to<Spatial>();
  549. if (s) {
  550. s->notification(Spatial::NOTIFICATION_ENTER_WORLD);
  551. } else {
  552. Viewport *v = p_node->cast_to<Viewport>();
  553. if (v) {
  554. if (v->world.is_valid())
  555. return;
  556. }
  557. }
  558. }
  559. for(int i=0;i<p_node->get_child_count();i++) {
  560. _propagate_enter_world(p_node->get_child(i));
  561. }
  562. }
  563. void Viewport::_propagate_exit_world(Node *p_node) {
  564. if (p_node!=this) {
  565. if (!p_node->is_inside_tree()) //may have exited scene already
  566. return;
  567. Spatial *s = p_node->cast_to<Spatial>();
  568. if (s) {
  569. s->notification(Spatial::NOTIFICATION_EXIT_WORLD,false);
  570. } else {
  571. Viewport *v = p_node->cast_to<Viewport>();
  572. if (v) {
  573. if (v->world.is_valid())
  574. return;
  575. }
  576. }
  577. }
  578. for(int i=0;i<p_node->get_child_count();i++) {
  579. _propagate_exit_world(p_node->get_child(i));
  580. }
  581. }
  582. void Viewport::set_world(const Ref<World>& p_world) {
  583. if (world==p_world)
  584. return;
  585. if (is_inside_tree())
  586. _propagate_exit_world(this);
  587. #ifndef _3D_DISABLED
  588. if (find_world().is_valid() && camera)
  589. camera->notification(Camera::NOTIFICATION_LOST_CURRENT);
  590. #endif
  591. world=p_world;
  592. if (is_inside_tree())
  593. _propagate_enter_world(this);
  594. #ifndef _3D_DISABLED
  595. if (find_world().is_valid() && camera)
  596. camera->notification(Camera::NOTIFICATION_BECAME_CURRENT);
  597. #endif
  598. //propagate exit
  599. if (is_inside_tree()) {
  600. VisualServer::get_singleton()->viewport_set_scenario(viewport,find_world()->get_scenario());
  601. }
  602. _update_listener();
  603. }
  604. Ref<World> Viewport::get_world() const{
  605. return world;
  606. }
  607. Ref<World> Viewport::find_world() const{
  608. if (own_world.is_valid())
  609. return own_world;
  610. else if (world.is_valid())
  611. return world;
  612. else if (parent)
  613. return parent->find_world();
  614. else
  615. return Ref<World>();
  616. }
  617. Camera* Viewport::get_camera() const {
  618. return camera;
  619. }
  620. Matrix32 Viewport::get_final_transform() const {
  621. return stretch_transform * global_canvas_transform;
  622. }
  623. void Viewport::set_size_override(bool p_enable, const Size2& p_size, const Vector2 &p_margin) {
  624. if (size_override==p_enable && p_size==size_override_size)
  625. return;
  626. size_override=p_enable;
  627. if (p_size.x>=0 || p_size.y>=0) {
  628. size_override_size=p_size;
  629. }
  630. size_override_margin=p_margin;
  631. _update_rect();
  632. _update_stretch_transform();
  633. }
  634. Size2 Viewport::get_size_override() const {
  635. return size_override_size;
  636. }
  637. bool Viewport::is_size_override_enabled() const {
  638. return size_override;
  639. }
  640. void Viewport::set_size_override_stretch(bool p_enable) {
  641. if (p_enable==size_override_stretch)
  642. return;
  643. size_override_stretch=p_enable;
  644. if (size_override) {
  645. _update_rect();
  646. }
  647. _update_stretch_transform();
  648. }
  649. bool Viewport::is_size_override_stretch_enabled() const {
  650. return size_override;
  651. }
  652. void Viewport::set_as_render_target(bool p_enable){
  653. if (render_target==p_enable)
  654. return;
  655. render_target=p_enable;
  656. VS::get_singleton()->viewport_set_as_render_target(viewport,p_enable);
  657. if (is_inside_tree()) {
  658. if (p_enable)
  659. _vp_exit_tree();
  660. else
  661. _vp_enter_tree();
  662. }
  663. if (p_enable) {
  664. render_target_texture_rid = VS::get_singleton()->viewport_get_render_target_texture(viewport);
  665. } else {
  666. render_target_texture_rid=RID();
  667. }
  668. render_target_texture->set_flags(render_target_texture->flags);
  669. render_target_texture->emit_changed();
  670. }
  671. bool Viewport::is_set_as_render_target() const{
  672. return render_target;
  673. }
  674. void Viewport::set_render_target_update_mode(RenderTargetUpdateMode p_mode){
  675. render_target_update_mode=p_mode;
  676. VS::get_singleton()->viewport_set_render_target_update_mode(viewport,VS::RenderTargetUpdateMode(p_mode));
  677. }
  678. Viewport::RenderTargetUpdateMode Viewport::get_render_target_update_mode() const{
  679. return render_target_update_mode;
  680. }
  681. //RID get_render_target_texture() const;
  682. void Viewport::queue_screen_capture(){
  683. VS::get_singleton()->viewport_queue_screen_capture(viewport);
  684. }
  685. Image Viewport::get_screen_capture() const {
  686. return VS::get_singleton()->viewport_get_screen_capture(viewport);
  687. }
  688. Ref<RenderTargetTexture> Viewport::get_render_target_texture() const {
  689. return render_target_texture;
  690. }
  691. void Viewport::set_render_target_vflip(bool p_enable) {
  692. render_target_vflip=p_enable;
  693. VisualServer::get_singleton()->viewport_set_render_target_vflip(viewport,p_enable);
  694. }
  695. bool Viewport::get_render_target_vflip() const{
  696. return render_target_vflip;
  697. }
  698. void Viewport::set_render_target_clear_on_new_frame(bool p_enable) {
  699. render_target_clear_on_new_frame=p_enable;
  700. VisualServer::get_singleton()->viewport_set_render_target_clear_on_new_frame(viewport,p_enable);
  701. }
  702. bool Viewport::get_render_target_clear_on_new_frame() const{
  703. return render_target_clear_on_new_frame;
  704. }
  705. void Viewport::render_target_clear() {
  706. //render_target_clear=true;
  707. VisualServer::get_singleton()->viewport_render_target_clear(viewport);
  708. }
  709. void Viewport::set_render_target_filter(bool p_enable) {
  710. render_target_texture->set_flags(p_enable?int(Texture::FLAG_FILTER):int(0));
  711. }
  712. bool Viewport::get_render_target_filter() const{
  713. return (render_target_texture->get_flags()&Texture::FLAG_FILTER)!=0;
  714. }
  715. void Viewport::set_render_target_gen_mipmaps(bool p_enable) {
  716. //render_target_texture->set_flags(p_enable?int(Texture::FLAG_FILTER):int(0));
  717. render_target_gen_mipmaps=p_enable;
  718. }
  719. bool Viewport::get_render_target_gen_mipmaps() const{
  720. //return (render_target_texture->get_flags()&Texture::FLAG_FILTER)!=0;
  721. return render_target_gen_mipmaps;
  722. }
  723. Matrix32 Viewport::_get_input_pre_xform() const {
  724. Matrix32 pre_xf;
  725. if (render_target) {
  726. ERR_FAIL_COND_V(to_screen_rect.size.x==0,pre_xf);
  727. ERR_FAIL_COND_V(to_screen_rect.size.y==0,pre_xf);
  728. pre_xf.elements[2]=-to_screen_rect.pos;
  729. pre_xf.scale(rect.size/to_screen_rect.size);
  730. } else {
  731. pre_xf.elements[2]=-rect.pos;
  732. }
  733. return pre_xf;
  734. }
  735. void Viewport::_make_input_local(InputEvent& ev) {
  736. switch(ev.type) {
  737. case InputEvent::MOUSE_BUTTON: {
  738. Matrix32 ai = get_final_transform().affine_inverse() * _get_input_pre_xform();
  739. Vector2 g = ai.xform(Vector2(ev.mouse_button.global_x,ev.mouse_button.global_y));
  740. Vector2 l = ai.xform(Vector2(ev.mouse_button.x,ev.mouse_button.y));
  741. ev.mouse_button.x=l.x;
  742. ev.mouse_button.y=l.y;
  743. ev.mouse_button.global_x=g.x;
  744. ev.mouse_button.global_y=g.y;
  745. } break;
  746. case InputEvent::MOUSE_MOTION: {
  747. Matrix32 ai = get_final_transform().affine_inverse() * _get_input_pre_xform();
  748. Vector2 g = ai.xform(Vector2(ev.mouse_motion.global_x,ev.mouse_motion.global_y));
  749. Vector2 l = ai.xform(Vector2(ev.mouse_motion.x,ev.mouse_motion.y));
  750. Vector2 r = ai.basis_xform(Vector2(ev.mouse_motion.relative_x,ev.mouse_motion.relative_y));
  751. Vector2 s = ai.basis_xform(Vector2(ev.mouse_motion.speed_x,ev.mouse_motion.speed_y));
  752. ev.mouse_motion.x=l.x;
  753. ev.mouse_motion.y=l.y;
  754. ev.mouse_motion.global_x=g.x;
  755. ev.mouse_motion.global_y=g.y;
  756. ev.mouse_motion.relative_x=r.x;
  757. ev.mouse_motion.relative_y=r.y;
  758. ev.mouse_motion.speed_x=s.x;
  759. ev.mouse_motion.speed_y=s.y;
  760. } break;
  761. case InputEvent::SCREEN_TOUCH: {
  762. Matrix32 ai = get_final_transform().affine_inverse() * _get_input_pre_xform();
  763. Vector2 t = ai.xform(Vector2(ev.screen_touch.x,ev.screen_touch.y));
  764. ev.screen_touch.x=t.x;
  765. ev.screen_touch.y=t.y;
  766. } break;
  767. case InputEvent::SCREEN_DRAG: {
  768. Matrix32 ai = get_final_transform().affine_inverse() * _get_input_pre_xform();
  769. Vector2 t = ai.xform(Vector2(ev.screen_drag.x,ev.screen_drag.y));
  770. Vector2 r = ai.basis_xform(Vector2(ev.screen_drag.relative_x,ev.screen_drag.relative_y));
  771. Vector2 s = ai.basis_xform(Vector2(ev.screen_drag.speed_x,ev.screen_drag.speed_y));
  772. ev.screen_drag.x=t.x;
  773. ev.screen_drag.y=t.y;
  774. ev.screen_drag.relative_x=r.x;
  775. ev.screen_drag.relative_y=r.y;
  776. ev.screen_drag.speed_x=s.x;
  777. ev.screen_drag.speed_y=s.y;
  778. } break;
  779. }
  780. }
  781. void Viewport::_vp_input(const InputEvent& p_ev) {
  782. if (render_target && to_screen_rect==Rect2())
  783. return; //if render target, can't get input events
  784. //this one handles system input, p_ev are in system coordinates
  785. //they are converted to viewport coordinates
  786. InputEvent ev = p_ev;
  787. _make_input_local(ev);
  788. input(ev);
  789. }
  790. void Viewport::_vp_unhandled_input(const InputEvent& p_ev) {
  791. if (render_target && to_screen_rect==Rect2())
  792. return; //if render target, can't get input events
  793. //this one handles system input, p_ev are in system coordinates
  794. //they are converted to viewport coordinates
  795. InputEvent ev = p_ev;
  796. _make_input_local(ev);
  797. unhandled_input(ev);
  798. }
  799. Vector2 Viewport::get_mouse_pos() const {
  800. return (get_final_transform().affine_inverse() * _get_input_pre_xform()).xform(Input::get_singleton()->get_mouse_pos());
  801. }
  802. void Viewport::warp_mouse(const Vector2& p_pos) {
  803. Vector2 gpos = (get_final_transform().affine_inverse() * _get_input_pre_xform()).affine_inverse().xform(p_pos);
  804. Input::get_singleton()->warp_mouse_pos(gpos);
  805. }
  806. void Viewport::input(const InputEvent& p_event) {
  807. ERR_FAIL_COND(!is_inside_tree());
  808. get_tree()->_call_input_pause(input_group,"_input",p_event);
  809. get_tree()->call_group(SceneTree::GROUP_CALL_REVERSE|SceneTree::GROUP_CALL_REALTIME|SceneTree::GROUP_CALL_MULIILEVEL,gui_input_group,"_gui_input",p_event); //special one for GUI, as controls use their own process check
  810. }
  811. void Viewport::unhandled_input(const InputEvent& p_event) {
  812. ERR_FAIL_COND(!is_inside_tree());
  813. get_tree()->_call_input_pause(unhandled_input_group,"_unhandled_input",p_event);
  814. //call_group(GROUP_CALL_REVERSE|GROUP_CALL_REALTIME|GROUP_CALL_MULIILEVEL,"unhandled_input","_unhandled_input",ev);
  815. if (!get_tree()->input_handled && p_event.type==InputEvent::KEY) {
  816. get_tree()->_call_input_pause(unhandled_key_input_group,"_unhandled_key_input",p_event);
  817. //call_group(GROUP_CALL_REVERSE|GROUP_CALL_REALTIME|GROUP_CALL_MULIILEVEL,"unhandled_key_input","_unhandled_key_input",ev);
  818. }
  819. if (physics_object_picking && !get_tree()->input_handled) {
  820. if (p_event.type==InputEvent::MOUSE_BUTTON || p_event.type==InputEvent::MOUSE_MOTION || p_event.type==InputEvent::SCREEN_DRAG || p_event.type==InputEvent::SCREEN_TOUCH) {
  821. physics_picking_events.push_back(p_event);
  822. }
  823. }
  824. }
  825. void Viewport::set_use_own_world(bool p_world) {
  826. if (p_world==own_world.is_valid())
  827. return;
  828. if (is_inside_tree())
  829. _propagate_exit_world(this);
  830. #ifndef _3D_DISABLED
  831. if (find_world().is_valid() && camera)
  832. camera->notification(Camera::NOTIFICATION_LOST_CURRENT);
  833. #endif
  834. if (!p_world)
  835. own_world=Ref<World>();
  836. else
  837. own_world=Ref<World>( memnew( World ));
  838. if (is_inside_tree())
  839. _propagate_enter_world(this);
  840. #ifndef _3D_DISABLED
  841. if (find_world().is_valid() && camera)
  842. camera->notification(Camera::NOTIFICATION_BECAME_CURRENT);
  843. #endif
  844. //propagate exit
  845. if (is_inside_tree()) {
  846. VisualServer::get_singleton()->viewport_set_scenario(viewport,find_world()->get_scenario());
  847. }
  848. _update_listener();
  849. }
  850. bool Viewport::is_using_own_world() const {
  851. return own_world.is_valid();
  852. }
  853. void Viewport::set_render_target_to_screen_rect(const Rect2& p_rect) {
  854. to_screen_rect=p_rect;
  855. VisualServer::get_singleton()->viewport_set_render_target_to_screen_rect(viewport,to_screen_rect);
  856. }
  857. Rect2 Viewport::get_render_target_to_screen_rect() const{
  858. return to_screen_rect;
  859. }
  860. void Viewport::set_physics_object_picking(bool p_enable) {
  861. physics_object_picking=p_enable;
  862. set_fixed_process(physics_object_picking);
  863. if (!physics_object_picking)
  864. physics_picking_events.clear();
  865. }
  866. Vector2 Viewport::get_camera_coords(const Vector2 &p_viewport_coords) const {
  867. Matrix32 xf = get_final_transform();
  868. return xf.xform(p_viewport_coords);
  869. }
  870. Vector2 Viewport::get_camera_rect_size() const {
  871. return last_vp_rect.size;
  872. }
  873. bool Viewport::get_physics_object_picking() {
  874. return physics_object_picking;
  875. }
  876. void Viewport::_bind_methods() {
  877. ObjectTypeDB::bind_method(_MD("set_rect","rect"), &Viewport::set_rect);
  878. ObjectTypeDB::bind_method(_MD("get_rect"), &Viewport::get_rect);
  879. //ObjectTypeDB::bind_method(_MD("set_world_2d","world_2d:World2D"), &Viewport::set_world_2d);
  880. //ObjectTypeDB::bind_method(_MD("get_world_2d:World2D"), &Viewport::get_world_2d);
  881. ObjectTypeDB::bind_method(_MD("find_world_2d:World2D"), &Viewport::find_world_2d);
  882. ObjectTypeDB::bind_method(_MD("set_world","world:World"), &Viewport::set_world);
  883. ObjectTypeDB::bind_method(_MD("get_world:World"), &Viewport::get_world);
  884. ObjectTypeDB::bind_method(_MD("find_world:World"), &Viewport::find_world);
  885. ObjectTypeDB::bind_method(_MD("set_canvas_transform","xform"), &Viewport::set_canvas_transform);
  886. ObjectTypeDB::bind_method(_MD("get_canvas_transform"), &Viewport::get_canvas_transform);
  887. ObjectTypeDB::bind_method(_MD("set_global_canvas_transform","xform"), &Viewport::set_global_canvas_transform);
  888. ObjectTypeDB::bind_method(_MD("get_global_canvas_transform"), &Viewport::get_global_canvas_transform);
  889. ObjectTypeDB::bind_method(_MD("get_final_transform"), &Viewport::get_final_transform);
  890. ObjectTypeDB::bind_method(_MD("get_visible_rect"), &Viewport::get_visible_rect);
  891. ObjectTypeDB::bind_method(_MD("set_transparent_background","enable"), &Viewport::set_transparent_background);
  892. ObjectTypeDB::bind_method(_MD("has_transparent_background"), &Viewport::has_transparent_background);
  893. ObjectTypeDB::bind_method(_MD("_parent_visibility_changed"), &Viewport::_parent_visibility_changed);
  894. ObjectTypeDB::bind_method(_MD("_parent_resized"), &Viewport::_parent_resized);
  895. ObjectTypeDB::bind_method(_MD("_vp_input"), &Viewport::_vp_input);
  896. ObjectTypeDB::bind_method(_MD("_vp_unhandled_input"), &Viewport::_vp_unhandled_input);
  897. ObjectTypeDB::bind_method(_MD("set_size_override","enable","size","margin"), &Viewport::set_size_override,DEFVAL(Size2(-1,-1)),DEFVAL(Size2(0,0)));
  898. ObjectTypeDB::bind_method(_MD("get_size_override"), &Viewport::get_size_override);
  899. ObjectTypeDB::bind_method(_MD("is_size_override_enabled"), &Viewport::is_size_override_enabled);
  900. ObjectTypeDB::bind_method(_MD("set_size_override_stretch","enabled"), &Viewport::set_size_override_stretch);
  901. ObjectTypeDB::bind_method(_MD("is_size_override_stretch_enabled"), &Viewport::is_size_override_stretch_enabled);
  902. ObjectTypeDB::bind_method(_MD("queue_screen_capture"), &Viewport::queue_screen_capture);
  903. ObjectTypeDB::bind_method(_MD("get_screen_capture"), &Viewport::get_screen_capture);
  904. ObjectTypeDB::bind_method(_MD("set_as_render_target","enable"), &Viewport::set_as_render_target);
  905. ObjectTypeDB::bind_method(_MD("is_set_as_render_target"), &Viewport::is_set_as_render_target);
  906. ObjectTypeDB::bind_method(_MD("set_render_target_vflip","enable"), &Viewport::set_render_target_vflip);
  907. ObjectTypeDB::bind_method(_MD("get_render_target_vflip"), &Viewport::get_render_target_vflip);
  908. ObjectTypeDB::bind_method(_MD("set_render_target_clear_on_new_frame","enable"), &Viewport::set_render_target_clear_on_new_frame);
  909. ObjectTypeDB::bind_method(_MD("get_render_target_clear_on_new_frame"), &Viewport::get_render_target_clear_on_new_frame);
  910. ObjectTypeDB::bind_method(_MD("render_target_clear"), &Viewport::render_target_clear);
  911. ObjectTypeDB::bind_method(_MD("set_render_target_filter","enable"), &Viewport::set_render_target_filter);
  912. ObjectTypeDB::bind_method(_MD("get_render_target_filter"), &Viewport::get_render_target_filter);
  913. ObjectTypeDB::bind_method(_MD("set_render_target_gen_mipmaps","enable"), &Viewport::set_render_target_gen_mipmaps);
  914. ObjectTypeDB::bind_method(_MD("get_render_target_gen_mipmaps"), &Viewport::get_render_target_gen_mipmaps);
  915. ObjectTypeDB::bind_method(_MD("set_render_target_update_mode","mode"), &Viewport::set_render_target_update_mode);
  916. ObjectTypeDB::bind_method(_MD("get_render_target_update_mode"), &Viewport::get_render_target_update_mode);
  917. ObjectTypeDB::bind_method(_MD("get_render_target_texture:RenderTargetTexture"), &Viewport::get_render_target_texture);
  918. ObjectTypeDB::bind_method(_MD("set_physics_object_picking","enable"), &Viewport::set_physics_object_picking);
  919. ObjectTypeDB::bind_method(_MD("get_physics_object_picking"), &Viewport::get_physics_object_picking);
  920. ObjectTypeDB::bind_method(_MD("get_viewport"), &Viewport::get_viewport);
  921. ObjectTypeDB::bind_method(_MD("input","local_event"), &Viewport::input);
  922. ObjectTypeDB::bind_method(_MD("unhandled_input","local_event"), &Viewport::unhandled_input);
  923. ObjectTypeDB::bind_method(_MD("update_worlds"), &Viewport::update_worlds);
  924. ObjectTypeDB::bind_method(_MD("set_use_own_world","enable"), &Viewport::set_use_own_world);
  925. ObjectTypeDB::bind_method(_MD("is_using_own_world"), &Viewport::is_using_own_world);
  926. ObjectTypeDB::bind_method(_MD("get_camera:Camera"), &Viewport::get_camera);
  927. ObjectTypeDB::bind_method(_MD("set_as_audio_listener","enable"), &Viewport::set_as_audio_listener);
  928. ObjectTypeDB::bind_method(_MD("is_audio_listener","enable"), &Viewport::is_audio_listener);
  929. ObjectTypeDB::bind_method(_MD("set_as_audio_listener_2d","enable"), &Viewport::set_as_audio_listener_2d);
  930. ObjectTypeDB::bind_method(_MD("is_audio_listener_2d","enable"), &Viewport::is_audio_listener_2d);
  931. ObjectTypeDB::bind_method(_MD("set_render_target_to_screen_rect"), &Viewport::set_render_target_to_screen_rect);
  932. ObjectTypeDB::bind_method(_MD("get_mouse_pos"), &Viewport::get_mouse_pos);
  933. ObjectTypeDB::bind_method(_MD("warp_mouse","to_pos"), &Viewport::warp_mouse);
  934. ADD_PROPERTY( PropertyInfo(Variant::RECT2,"rect"), _SCS("set_rect"), _SCS("get_rect") );
  935. ADD_PROPERTY( PropertyInfo(Variant::BOOL,"own_world"), _SCS("set_use_own_world"), _SCS("is_using_own_world") );
  936. ADD_PROPERTY( PropertyInfo(Variant::OBJECT,"world",PROPERTY_HINT_RESOURCE_TYPE,"World"), _SCS("set_world"), _SCS("get_world") );
  937. // ADD_PROPERTY( PropertyInfo(Variant::OBJECT,"world_2d",PROPERTY_HINT_RESOURCE_TYPE,"World2D"), _SCS("set_world_2d"), _SCS("get_world_2d") );
  938. ADD_PROPERTY( PropertyInfo(Variant::BOOL,"transparent_bg"), _SCS("set_transparent_background"), _SCS("has_transparent_background") );
  939. ADD_PROPERTY( PropertyInfo(Variant::BOOL,"render_target/enabled"), _SCS("set_as_render_target"), _SCS("is_set_as_render_target") );
  940. ADD_PROPERTY( PropertyInfo(Variant::BOOL,"render_target/v_flip"), _SCS("set_render_target_vflip"), _SCS("get_render_target_vflip") );
  941. 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") );
  942. ADD_PROPERTY( PropertyInfo(Variant::BOOL,"render_target/filter"), _SCS("set_render_target_filter"), _SCS("get_render_target_filter") );
  943. ADD_PROPERTY( PropertyInfo(Variant::BOOL,"render_target/gen_mipmaps"), _SCS("set_render_target_gen_mipmaps"), _SCS("get_render_target_gen_mipmaps") );
  944. 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") );
  945. ADD_PROPERTY( PropertyInfo(Variant::BOOL,"audio_listener/enable_2d"), _SCS("set_as_audio_listener_2d"), _SCS("is_audio_listener_2d") );
  946. ADD_PROPERTY( PropertyInfo(Variant::BOOL,"audio_listener/enable_3d"), _SCS("set_as_audio_listener"), _SCS("is_audio_listener") );
  947. ADD_PROPERTY( PropertyInfo(Variant::BOOL,"physics/object_picking"), _SCS("set_physics_object_picking"), _SCS("get_physics_object_picking") );
  948. ADD_SIGNAL(MethodInfo("size_changed"));
  949. BIND_CONSTANT( RENDER_TARGET_UPDATE_DISABLED );
  950. BIND_CONSTANT( RENDER_TARGET_UPDATE_ONCE );
  951. BIND_CONSTANT( RENDER_TARGET_UPDATE_WHEN_VISIBLE );
  952. BIND_CONSTANT( RENDER_TARGET_UPDATE_ALWAYS );
  953. }
  954. Viewport::Viewport() {
  955. world_2d = Ref<World2D>( memnew( World2D ));
  956. viewport = VisualServer::get_singleton()->viewport_create();
  957. listener=SpatialSoundServer::get_singleton()->listener_create();
  958. audio_listener=false;
  959. listener_2d=SpatialSound2DServer::get_singleton()->listener_create();
  960. audio_listener_2d=false;
  961. transparent_bg=false;
  962. parent=NULL;
  963. camera=NULL;
  964. size_override=false;
  965. size_override_stretch=false;
  966. size_override_size=Size2(1,1);
  967. render_target_gen_mipmaps=false;
  968. render_target=false;
  969. render_target_vflip=false;
  970. render_target_clear_on_new_frame=true;
  971. //render_target_clear=true;
  972. render_target_update_mode=RENDER_TARGET_UPDATE_WHEN_VISIBLE;
  973. render_target_texture = Ref<RenderTargetTexture>( memnew( RenderTargetTexture(this) ) );
  974. physics_object_picking=false;
  975. physics_object_capture=0;
  976. physics_object_over=0;
  977. physics_last_mousepos=Vector2(1e20,1e20);
  978. String id=itos(get_instance_ID());
  979. input_group = "_vp_input"+id;
  980. gui_input_group = "_vp_gui_input"+id;
  981. unhandled_input_group = "_vp_unhandled_input"+id;
  982. unhandled_key_input_group = "_vp_unhandled_key_input"+id;
  983. }
  984. Viewport::~Viewport() {
  985. VisualServer::get_singleton()->free( viewport );
  986. SpatialSoundServer::get_singleton()->free(listener);
  987. SpatialSound2DServer::get_singleton()->free(listener_2d);
  988. if (render_target_texture.is_valid())
  989. render_target_texture->vp=NULL; //so if used, will crash
  990. }