From e709468bb13e795cff72b3e87198c61c5b1a2ee7 Mon Sep 17 00:00:00 2001 From: Juan Linietsky Date: Wed, 19 Nov 2014 11:33:15 -0300 Subject: [PATCH] missing navmesh demo and small fixes --- demos/3d/navmesh/engine.cfg | 9 ++ demos/3d/navmesh/navmesh.gd | 110 ++++++++++++++++++ demos/3d/navmesh/navmesh.scn | Bin 0 -> 37856 bytes demos/3d/navmesh/particle.png | Bin 0 -> 260 bytes drivers/theoraplayer/SCsub | 5 +- .../TheoraVideoClip_AVFoundation.mm | 2 + .../video_stream_theoraplayer.cpp | 33 ++++-- .../theoraplayer/video_stream_theoraplayer.h | 1 + modules/gdscript/gd_script.cpp | 2 + platform/windows/os_windows.cpp | 2 +- 10 files changed, 155 insertions(+), 9 deletions(-) create mode 100644 demos/3d/navmesh/engine.cfg create mode 100644 demos/3d/navmesh/navmesh.gd create mode 100644 demos/3d/navmesh/navmesh.scn create mode 100644 demos/3d/navmesh/particle.png diff --git a/demos/3d/navmesh/engine.cfg b/demos/3d/navmesh/engine.cfg new file mode 100644 index 0000000000..30af6ce5a5 --- /dev/null +++ b/demos/3d/navmesh/engine.cfg @@ -0,0 +1,9 @@ +[application] + +name="Navmesh Demo" +main_scene="res://navmesh.scn" +icon="res://icon.png" + +[rasterizer] + +shadow_filter=3 diff --git a/demos/3d/navmesh/navmesh.gd b/demos/3d/navmesh/navmesh.gd new file mode 100644 index 0000000000..a81a5e90d6 --- /dev/null +++ b/demos/3d/navmesh/navmesh.gd @@ -0,0 +1,110 @@ + +extends Navigation + +# member variables here, example: +# var a=2 +# var b="textvar" + +const SPEED=4.0 + +var camrot=0.0 + +var begin=Vector3() +var end=Vector3() +var m = FixedMaterial.new() + +var path=[] + +func _process(delta): + + + if (path.size()>1): + + var to_walk = delta*SPEED + var to_watch = Vector3(0,1,0) + while(to_walk>0 and path.size()>=2): + var pfrom = path[path.size()-1] + var pto = path[path.size()-2] + to_watch = (pto - pfrom).normalized() + var d = pfrom.distance_to(pto) + if (d<=to_walk): + path.remove(path.size()-1) + to_walk-=d + else: + path[path.size()-1] = pfrom.linear_interpolate(pto,to_walk/d) + to_walk=0 + + var atpos = path[path.size()-1] + var atdir = to_watch + atdir.y=0 + + var t = Transform() + t.origin=atpos + t=t.looking_at(atpos+atdir,Vector3(0,1,0)) + get_node("robot_base").set_transform(t) + + if (path.size()<2): + path=[] + set_process(false) + + else: + set_process(false) + +var draw_path=false + +func _update_path(): + + var p = get_simple_path(begin,end,true) + path=Array(p) # Vector3array to complex to use, convert to regular array + path.invert() + set_process(true) + + if (draw_path): + var im = get_node("draw") + im.set_material_override(m) + im.clear() + im.begin(Mesh.PRIMITIVE_POINTS,null) + im.add_vertex(begin) + im.add_vertex(end) + im.end() + im.begin(Mesh.PRIMITIVE_LINE_STRIP,null) + for x in p: + im.add_vertex(x) + im.end() + +func _input(ev): + + if (ev.type==InputEvent.MOUSE_BUTTON and ev.button_index==BUTTON_LEFT and ev.pressed): + + var from = get_node("cambase/Camera").project_position(ev.pos) + var to = from+get_node("cambase/Camera").project_ray_normal(ev.pos)*100 + var p = get_closest_point_to_segment(from,to) + + begin=get_closest_point(get_node("robot_base").get_translation()) + end=p + + _update_path() + + if (ev.type==InputEvent.MOUSE_MOTION): + if (ev.button_mask&BUTTON_MASK_MIDDLE): + + camrot+=ev.relative_x*0.005 + get_node("cambase").set_rotation(Vector3(0,camrot,0)) + print("camrot ", camrot) + + + +func _ready(): + # Initalization here + set_process_input(true) + m.set_line_width(3) + m.set_point_size(3) + m.set_fixed_flag(FixedMaterial.FLAG_USE_POINT_SIZE,true) + m.set_flag(Material.FLAG_UNSHADED,true) + #begin = get_closest_point(get_node("start").get_translation()) + #end = get_closest_point(get_node("end").get_translation()) + #call_deferred("_update_path") + + pass + + diff --git a/demos/3d/navmesh/navmesh.scn b/demos/3d/navmesh/navmesh.scn new file mode 100644 index 0000000000000000000000000000000000000000..73df340b1ecea618f9ff293334009c47a530f580 GIT binary patch literal 37856 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 literal 0 HcmV?d00001 diff --git a/demos/3d/navmesh/particle.png b/demos/3d/navmesh/particle.png new file mode 100644 index 0000000000000000000000000000000000000000..18851c8c9de23f043cc0c297237fb9a0ad158ab9 GIT binary patch literal 260 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s7*pj^6T^JrPXfbHne=Bof zU|`@Z@Q5sCVBi)8VMc~ob0ioT7}!fZeO=k_aq}|^NnY)m@QHzeL9)a(qQp5rH#aq} zgu%HeHL)Z$MWH;iBtya7(>EZzkx!g~fg#7!#WBR<^w~*DH~a8&w@&2(-*L zo~hs&CH=leBH7F{%FTWncM`j}H`8^+g3tFYmU= audioTracks.count) + audio_track = 0; AVAssetTrack *audioTrack = audioTracks.count > 0 ? [audioTracks objectAtIndex:audio_track] : NULL; printf("*********** using audio track %i\n", audio_track); diff --git a/drivers/theoraplayer/video_stream_theoraplayer.cpp b/drivers/theoraplayer/video_stream_theoraplayer.cpp index 643899aaed..62dee1336a 100644 --- a/drivers/theoraplayer/video_stream_theoraplayer.cpp +++ b/drivers/theoraplayer/video_stream_theoraplayer.cpp @@ -122,6 +122,7 @@ class AudioStreamInput : public AudioStreamResampled { int rb_power; int total_wrote; bool playing; + bool paused; public: @@ -133,6 +134,7 @@ public: AudioServer::get_singleton()->stream_set_active(stream_rid,true); AudioServer::get_singleton()->stream_set_volume_scale(stream_rid,1); playing = true; + paused = false; }; virtual void stop() { @@ -146,8 +148,8 @@ public: virtual bool is_playing() const { return true; }; - virtual void set_paused(bool p_paused) {}; - virtual bool is_paused(bool p_paused) const { return false; }; + virtual void set_paused(bool p_paused) { paused = p_paused; }; + virtual bool is_paused(bool p_paused) const { return paused; }; virtual void set_loop(bool p_enable) {}; virtual bool has_loop() const { return false; }; @@ -209,6 +211,7 @@ public: AudioStreamInput(int p_channels, int p_freq) { playing = false; + paused = true; channels = p_channels; freq = p_freq; total_wrote = 0; @@ -285,12 +288,12 @@ void VideoStreamTheoraplayer::stop() { clip->stop(); clip->seek(0); }; + started = true; }; void VideoStreamTheoraplayer::play() { - - playing = true; - started = true; + if (clip) + playing = true; }; bool VideoStreamTheoraplayer::is_playing() const { @@ -300,7 +303,13 @@ bool VideoStreamTheoraplayer::is_playing() const { void VideoStreamTheoraplayer::set_paused(bool p_paused) { - playing = false; + paused = p_paused; + if (paused) { + clip->pause(); + } else { + if (clip && playing && !started) + clip->play(); + } }; bool VideoStreamTheoraplayer::is_paused(bool p_paused) const { @@ -355,6 +364,9 @@ int VideoStreamTheoraplayer::get_pending_frame_count() const { void VideoStreamTheoraplayer::pop_frame(Ref p_tex) { + if (!clip) + return; + TheoraVideoFrame* f = clip->getNextFrame(); if (!f) { return; @@ -374,7 +386,7 @@ void VideoStreamTheoraplayer::pop_frame(Ref p_tex) { { DVector::Write wr = data.write(); uint8_t* ptr = wr.ptr(); - memcpy(ptr, f->getBuffer(), imgsize); + copymem(ptr, f->getBuffer(), imgsize); } /* for (int i=0; igetNumReadyFrames() < 2) { @@ -499,6 +517,7 @@ VideoStreamTheoraplayer::VideoStreamTheoraplayer() { clip = NULL; started = false; playing = false; + paused = false; loop = false; audio_track=0; }; diff --git a/drivers/theoraplayer/video_stream_theoraplayer.h b/drivers/theoraplayer/video_stream_theoraplayer.h index f926dfdaf5..d43c12609f 100644 --- a/drivers/theoraplayer/video_stream_theoraplayer.h +++ b/drivers/theoraplayer/video_stream_theoraplayer.h @@ -17,6 +17,7 @@ class VideoStreamTheoraplayer : public VideoStream { bool started; bool playing; bool loop; + bool paused; int audio_track; diff --git a/modules/gdscript/gd_script.cpp b/modules/gdscript/gd_script.cpp index 8738185d41..7085ae6a56 100644 --- a/modules/gdscript/gd_script.cpp +++ b/modules/gdscript/gd_script.cpp @@ -2464,6 +2464,8 @@ void GDScriptLanguage::get_reserved_words(List *p_words) const { "assert", "yield", "static", + "float", + "int", 0}; diff --git a/platform/windows/os_windows.cpp b/platform/windows/os_windows.cpp index 19bf324916..8eb5746948 100644 --- a/platform/windows/os_windows.cpp +++ b/platform/windows/os_windows.cpp @@ -1494,7 +1494,7 @@ OS::Date OS_Windows::get_date() const { OS::Time OS_Windows::get_time() const { SYSTEMTIME systemtime; - GetSystemTime(&systemtime); + GetLocalTime(&systemtime); Time time; time.hour=systemtime.wHour;