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 00000000000..30af6ce5a5c --- /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 00000000000..a81a5e90d6b --- /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/drivers/theoraplayer/SCsub b/drivers/theoraplayer/SCsub index 979ff2ed1bd..d4218debb61 100644 --- a/drivers/theoraplayer/SCsub +++ b/drivers/theoraplayer/SCsub @@ -67,10 +67,13 @@ if env["platform"] == "iphone": env_theora = env.Clone() -env_theora.Append(CPPFLAGS=["-D_YUV_C", "-D__THEORA", "-D_LIB"]) +env_theora.Append(CPPFLAGS=["-D_YUV_C", "-D_LIB", "-D__THEORA"]) if env["platform"] == "iphone": env_theora.Append(CPPFLAGS=["-D__AVFOUNDATION"]) +else: + pass + #env_theora.Append(CPPFLAGS=["-D__FFMPEG"]) if env["platform"] == "android": env_theora.Append(CPPFLAGS=["-D_ANDROID"]) diff --git a/drivers/theoraplayer/src/AVFoundation/TheoraVideoClip_AVFoundation.mm b/drivers/theoraplayer/src/AVFoundation/TheoraVideoClip_AVFoundation.mm index 72e3dfc9fa2..1b5cf0ab13b 100644 --- a/drivers/theoraplayer/src/AVFoundation/TheoraVideoClip_AVFoundation.mm +++ b/drivers/theoraplayer/src/AVFoundation/TheoraVideoClip_AVFoundation.mm @@ -271,6 +271,8 @@ void TheoraVideoClip_AVFoundation::load(TheoraDataSource* source) AVAssetTrack *videoTrack = [tracks objectAtIndex:0]; NSArray* audioTracks = [asset tracksWithMediaType:AVMediaTypeAudio]; + if (audio_track >= 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 643899aaede..62dee1336a7 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 f926dfdaf50..d43c12609fe 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 8738185d413..7085ae6a568 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 19bf3249168..8eb5746948c 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;