using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System.Threading;
using System.ComponentModel;
#if UNITY_5_3_OR_NEWER
using UnityEngine.SceneManagement;
#endif
namespace thelab.mvc
{
/// <summary>
/// Extension of the BaseApplication class to handle different types of Model View Controllers.
/// </summary>
/// <typeparam name="M"></typeparam>
/// <typeparam name="V"></typeparam>
/// <typeparam name="C"></typeparam>
public class BaseApplication<M, V, C> : BaseApplication
where M : Element
where V : Element
where C : Element
{
/// <summary>
/// Model reference using the new type.
/// </summary>
new public M model { get { return (M)(object)base.model; } }
/// <summary>
/// View reference using the new type.
/// </summary>
new public V view { get { return (V)(object)base.view; } }
/// <summary>
/// Controller reference using the new type.
/// </summary>
new public C controller { get { return (C)(object)base.controller; } }
}
/// <summary>
/// Root class for the scene's scripts.
/// </summary>
public class BaseApplication : Element
{
/// <summary>
/// Arguments to be passed between scenes.
/// </summary>
static List<string> __args;
/// <summary>
/// Flag that indicates the first scene was loaded.
/// </summary>
static bool m_first_scene;
/// <summary>
/// Little static init.
/// </summary>
static BaseApplication() { m_first_scene = true; }
/// <summary>
/// Arguments passed between scenes.
/// </summary>
public List<string> args { get { return __args==null ? (new List<string>()) : __args; } }
/// <summary>
/// Verbose Level.
/// </summary>
public int verbose;
/// <summary>
/// Fetches the root Model instance.
/// </summary>
public Model model { get { return m_model = Assert<Model>(m_model); } }
private Model m_model;
/// <summary>
/// Fetches the root View instance.
/// </summary>
public View view { get { return m_view = Assert<View>(m_view); } }
private View m_view;
/// <summary>
/// Fetches the root Controller instance.
/// </summary>
public Controller controller { get { return m_controller = Assert<Controller>(m_controller); } }
private Controller m_controller;
/// <summary>
/// Wrapper for the current scene's id.
/// </summary>
public int levelId {
get {
#if UNITY_5_3_OR_NEWER
return SceneManager.GetActiveScene().buildIndex;
#else
return Application.loadedLevel;
#endif
}
}
/// <summary>
/// Wrapper for the current scene's name.
/// </summary>
public string levelName {
get {
#if UNITY_5_3_OR_NEWER
return SceneManager.GetActiveScene().name;
#else
return Application.loadedLevelName;
#endif
}
}
/// <summary>
/// Async data structures.
/// </summary>
private List<UnityEngine.AsyncOperation> m_async_loads { get { return __async_loads == null ? (__async_loads = new List<UnityEngine.AsyncOperation>()) : __async_loads; } }
private List<UnityEngine.AsyncOperation> __async_loads;
private List<string> m_async_args { get { return __async_args == null ? (__async_args = new List<string>()) : __async_args; } }
private List<string> __async_args;
/// <summary>
/// Initialization.
/// </summary>
virtual protected void Start() {
__async_loads = new List<UnityEngine.AsyncOperation>();
__async_args = new List<string>();
if (m_first_scene) { m_first_scene = false; OnLevelWasLoaded(levelId); }
Notify("scene.start", new object[] { levelName, levelId });
}
/// <summary>
/// Capture the level loaded event and notify controllers for 'starting' purposes.
/// </summary>
/// <param name="p_level"></param>
private void OnLevelWasLoaded(int p_level) {
Notify("scene.load", new object[] { levelName, levelId });
}
/// <summary>
/// Notifies all application's controllers informing who's the 'target' and passing some 'data'.
/// </summary>
/// <param name="p_event"></param>
/// <param name="p_target"></param>
/// <param name="p_data"></param>
public void Notify(string p_event, Object p_target, params object[] p_data) {
Log(p_event + " [" + p_target + "]", 6);
Traverse(delegate(Transform it) {
Controller[] list = it.GetComponents<Controller>();
for (int i = 0; i < list.Length; i++) list[i].OnNotification(p_event, p_target, p_data);
return true;
});
}
/// <summary>
/// Notifies all application's controllers informing who's the 'target'.
/// </summary>
/// <param name="p_event"></param>
/// <param name="p_target"></param>
public void Notify(string p_event, Object p_target) { Notify(p_event, p_target,new object[]{}); }
/// <summary>
/// Notifies all application's controllers informing who's the 'target' after 'delay' in seconds and passing some 'data'.
/// </summary>
/// <param name="p_event"></param>
/// <param name="p_target"></param>
/// <param name="p_data"></param>
public void Notify(float p_delay,string p_event, Object p_target,params object[] p_data) {
StartCoroutine(TimedNotify(p_delay,p_event,p_target,p_data));
}
/// <summary>
/// Internal Notify to help timed notifications.
/// </summary>
/// <param name="p_delay"></param>
/// <param name="p_event"></param>
/// <param name="p_target"></param>
/// <param name="p_data"></param>
/// <returns></returns>
private IEnumerator TimedNotify(float p_delay, string p_event, Object p_target,params object[] p_data) {
yield return new WaitForSeconds(p_delay);
Notify(p_event, p_target, p_data);
}
/// <summary>
/// Adds a new scene by name. An async flag can control the load type.
/// </summary>
/// <param name="p_name"></param>
/// <param name="p_async"></param>
/// <param name="p_args"></param>
public void SceneAdd(string p_name, bool p_async, params string[] p_args) {
if (p_async) { StartCoroutine(SceneLoadAsync(p_name, true, p_args)); }
else {
__args = new List<string>(p_args);
#if UNITY_5_3_OR_NEWER
SceneManager.LoadScene(p_name, LoadSceneMode.Additive);
#else
Application.LoadLevelAdditive(p_name);
#endif
}
}
/// <summary>
/// Adds a new scene.
/// </summary>
/// <param name="p_name"></param>
/// <param name="p_args"></param>
public void SceneAdd(string p_name,params string[] p_args) { SceneAdd(p_name, false, p_args); }
/// <summary>
/// Loads a new scene by name. A flag indicating if the load must be async can be informed.
/// </summary>
/// <param name="p_name"></param>
/// <param name="p_async"></param>
/// <param name="p_args"></param>
public void SceneLoad(string p_name,bool p_async,params string[] p_args) {
if (p_async) { StartCoroutine(SceneLoadAsync(p_name,false,p_args)); }
else {
__args = new List<string>(p_args);
#if UNITY_5_3_OR_NEWER
SceneManager.LoadScene(p_name, LoadSceneMode.Single);
#else
Application.LoadLevel(p_name);
#endif
}
}
/// <summary>
/// Loads a new scene by name.
/// </summary>
/// <param name="p_name"></param>
/// <param name="p_args"></param>
public void SceneLoad(string p_name,params string[] p_args) { SceneLoad(p_name, false, p_args); }
/// <summary>
/// Internal method for async load level.
/// </summary>
/// <param name="p_name"></param>
/// <param name="p_args"></param>
/// <returns></returns>
private IEnumerator SceneLoadAsync(string p_name,bool p_additive,params string[] p_args) {
//float p = 0f;
UnityEngine.AsyncOperation async = null;
string ev = "";
if(p_additive) {
ev = "scene.add.progress";
#if UNITY_5_3_OR_NEWER
async = SceneManager.LoadSceneAsync(p_name,LoadSceneMode.Additive);
#else
async = Application.LoadLevelAdditiveAsync(p_name);
#endif
}
else {
ev = "scene.load.progress";
#if UNITY_5_3_OR_NEWER
async = SceneManager.LoadSceneAsync(p_name,LoadSceneMode.Single);
#else
async = Application.LoadLevelAsync(p_name);
#endif
}
m_async_loads.Add(async);
m_async_args.Add(p_name + "~" + ev);
yield return async;
__args = new List<string>(p_args);
}
/// <summary>
/// Update some internal states.
/// </summary>
void Update() {
for(int i=0;i<m_async_loads.Count;i++) {
UnityEngine.AsyncOperation async = m_async_loads[i];
if (async != null) {
string args = m_async_args[i];
string s_name = args.Split('~')[0];
string s_ev = args.Split('~')[1];
if (s_ev != "") Notify(s_ev, new object[] { s_name, async.progress });
if (async.progress >= 1.0) m_async_loads[i] = null;
}
else {
m_async_loads.RemoveAt(i--);
m_async_args.RemoveAt(i--);
}
}
}
}
}
#pragma warning restore 0618
- A Detailed Look at Oculus Utilities for Unity
- about
- argos.vu
- contact us
- DevNotes – Archive – 3-15-17 Back
- Electric Tours Dinosaur Colorado
- Free Form Deformation
- Funding Research
- Gallery_One
- harmonic resonance
- Jim’esque Simulation Details
- PitchDeck
- Plasma Dynamics
- points of interest
- Raw Materials
- Rudolph Steiner
- TetraWaveForm
- Volo Meeting 12-11-2018
- VRARA
- WEBFLOW TEMPLATES
- development videos
- development notes
- argosSphere nav table
- devNotes 3-16-16 hex map seam
- devNotes 3-21-16 cursor & hex addressing
- devNotes 3-22-16 cursor & hex addressing
- devNotes 3-23-16 cursor design
- devNotes 3-24-16 cursor design
- devNotes 3-25-16 paint_track – paintList_track – movement recording
- devNotes 3-26-16 unoShader unlit – unity online conference
- devNotes 3-27-16 path recording – spline continuity and net spawning
- devNotes 3-28-16 networking – NetworkTransform – Player Objects – NetworkBehaviour
- devNotes 3-29-16 networking – Setting up a Multiplayer Project
- devNotes 3-30-16 networking – Parenting netCamera – netCamMove code
- devNotes 3-31-16 networking remote client
- devNotes 4-01-16 networking remote testing
- devNotes 4-02-16 networking netMove states – Cmd from client
- devNotes 4-03-16 networking – front end UI – prepare for testing
- devNotes 4-04-16 minApp – targeting & timed performance – as list
- devNotes 4-05-16 pcg utilities – quad spawning – tween – elastic
- devNotes 4-06-16 elastic slerp – quaternion tweens overshoot
- devNotes 4-07-16 slerpspergsburg unclamped
- devNotes 4-08-16 adb – code for ui netManager – 3rd geometry layer
- devNotes 4-09-16 circle lattice packing
- devNotes 4-10-16 goldberg polyhedra construction and addressing
- devNotes 4-11-2016 ico-sphere projection mapping – audio sample
- devNotes 4-12-16 Spherical Mapping – Audio Xurious
- devNotes 4-13-16 quaternion mesh tile matching
- devNotes 4-14-16 tile matching and scaling – multum in parvo
- devNotes 4-15-16 triangle grading – Voronoi cells and Delaunay triangulation
- devNotes 4-16-16 instancing tethered masses with radial repelling forces
- devNotes 4-17-16 triangle center quality – point in given cell
- devNotes 4-18-16 triangle center quality – projections to/from the uv plane
- devNotes 4-19-16 tcq – unit testing – 2D rotator
- devNotes 4-20-16 tcq – unit testing continued
- devNotes 4-21-16 tcq implementation – hex mapping and indexing
- devNotes 4-22-16 hex generation using subdivision
- devNotes 4-23-16 hex alignment and placement
- devNotes 4-24-16 build hexagons from veronoi positions
- devNotes 4-25-16 voronoi position list and data structure
- devNotes 4-26-16 fibonacci voronoi position list nb direction ordering
- devNotes 4-27-16 fibonacci nodes – triangulation and meshing
- devNotes 4-28-16 ArgosFibonacci.cs – quad cells – indexing and tweening
- devNotes 4-29-16 ArgosFibonacci.cs – iTween Callbacks
- devNotes 4-30-16 ArgosFibonacci.cs – iTween driven quaternion lerp
- devNotes 5-01-16 fibo Begin the Beguine
- devNotes 5-02-16 foriero – sequencer
- devNotes 5-03-16 midi specs, delegates and events
- devNotes 5-04-16 midi events – animations – procrustean
- devNotes 5-05-16 video project 1
- devNotes 5-07-16 icosahedral projection
- devNotes 5-07-16 phasor on icoplane
- devNotes 5-08-16 dotProduct gatherings
- devNotes 5-09-16 events, vizEls and spinerettes
- devNotes 5-10-16 patterns, particle system internals, crossfades
- devNotes 5-11-16 path follow, koreographer & theme
- devNotes 5-12-16 scrubber, event editing and composition
- devNotes 5-13-16 timing, events and tweening
- devNotes 5-14-16 navigation, particles and time tweens
- devNotes 5-15-16 particles, instantiation, fibRider and tweening
- devNotes 5-16-16 timed tweens, visual flow and particle dynamics
- devNotes 5-17-16 particle system positioning, world space and ps threading
- devNotes 5-18-16 detail, precision, focus, rigor in the vigor
- devNotes 5-19-16 three tier workflow – particle system foundry
- devNotes 5-20-16 lines, fills and fibonacci
- devNotes 5-21-16 code review, app design and sound painting
- devNotes 5-22-16 topologies, voronoi baking
- devNotes 5-23-16 sound visualization, particle system instances, pivot rotations
- devNotes 5-24-16 Argos Brush, List performance, subFrame tweens
- devNotes 5-25-2016 GPU instancing, audio echo, list processing
- devNotes 5-26-16 quad pool, object reuse, memory management
- devNotes 5-27-16 sound processing, alignment and generation
- devNotes 5-28-16 sound generation, audio processing, harmonizer
- devNotes 5-29-16 Mic input, processing and recording
- devNotes 5-30-16 onFilterRead, windowing and FFTs
- devNotes 5-31-16 fundamental lock, voice tracking, harmonizing
- devNotes 6-01-16 Vuforia 5.5 base, gearVR and performance evaluation
- devNotes 6-02-16 AR sample, ARM performance and debug
- devNotes 6-03-16 native vuforia app structure, dev UI, look and feel
- devNotes 6-04-16 orientation, navigation, gyro, compass raw vector
- devNotes 6-05-16 android UI, handheld AR, Argos VU
- devNotes 6-06-16 GearVR pipeline, micInput, audio compression
- devNotes 6-07-16 audio latency, GearVR ui and mobile testing
- devNotes 6-08-16 texture writing, echo buffer performance, multi tracking
- devNotes 6-09-16 GearVR UI, Argos Sphere Indexing, AR UI Interactions
- devNotes 6-10-16 CLJ AR/VR composition, refinement, integrity
- devNotes 6-11-16 GearVR interface, parameter adjustment settings file, movement
- devNotes 6-12-16 VR lab, sound and partSys interfaces
- devNotes 6-13-16 echo interface, argos meshDraft levels, vertical processing
- devNotes 6-14-16 echo editor ui, argos mesh draft, phi
- devNotes 6-15-16 Sound Plot, Circular buffer, Echo Processing
- devNotes 6-16-16 pipeline back to vr, movement, sphere cursor
- devNotes 6-17-16 GearVR UI work, user movement and navigation
- devNotes 6-18-16 UI GearVR, devPipeline, radial menus
- devNotes 6-19-16 navigation into sphere, HUD, user experience
- devNotes 6-20-16 modal menu cycling, scroll plate, tap tap tap
- devNotes 6-21-16 json, scriptable objects, trackable movement, timing and placement
- devNotes 6-22-16 cursor swap, tool selection, editor functions
- devNotes 6-23-16 AR-VR transitions, singleton manager, ui modal dialog
- devNotes 6-24-16 OVR cursor canvas interaction – transitions – triggers
- devNotes 6-25-16 ioc – amvcc or application-model-view-controller-component
- devNotes 6-26-16 fsm mvc ui Trygve Reenskaug
- devNotes 6-27-16 mvc structure ui interaction
- devNotes 6-28-16 cursor ui interaction – sphere gaze intersection – cursor state
- devNotes 6-29-16 navigation UI state cursor follow
- devNotes 6/30/16 GearVR testing navigation sphere cursor states
- devNotes 7-01-16 sphere interaction cursor states voronoi
- devNotes 7-02-16 navigation OVR Camera rig movement
- devNotes 7-03-16 ui interaction navigation message processing
- devNotes 7-04-16 accordion 3d button selector – movement – sound follow
- devNotes 7-05-16 utility ui, survey, tools, json
- devNotes 7-06-16 MVC hierarchy, persistent storage, reload preferences
- devNotes 7-07-16 galaxy 7 usb debug – performance – initial tests
- devNotes 7-08-16 adb debug workflow
- dj ar initial
- cursor work
- The EU
- phi five alpha omega
- art forms in nature
- packings
- rendering pipeline and shaders
- manuals
- music
- news
- tango devNotes

