private void RenderObject(LatipiumObject obj, Com.Latipium.Core.Tuple <object, object> data, IObjectRenderer objectR, IColorRenderer colorR) { Com.Latipium.Core.Tuple <float, float, float> position = obj.InvokeFunction <Com.Latipium.Core.Tuple <float, float, float>, Com.Latipium.Core.Tuple <float, float, float> >("Position", null); float[] transform = obj.InvokeFunction <float[], float[]>("Transform", null); if (position != null) { GL.Translate(position.Object1, position.Object2, position.Object3); } if (transform != null) { GL.MultMatrix(transform); } int len = objectR.Start(data.Object1); if (colorR == null) { for (int i = 0; i < len; ++i) { objectR.Vertex(i); } } else { colorR.Start(data.Object2); for (int i = 0; i < len; ++i) { colorR.Color(i); objectR.Vertex(i); } } objectR.End(); }
internal void AddObjects(IEnumerable <LatipiumObject> objects) { foreach (LatipiumObject obj in objects) { LatipiumObject type = obj.InvokeFunction <LatipiumObject>("Type"); if (type != null) { if (!InitializedTypes.Contains(type)) { type.InvokeProcedure <Action <IEnumerable <LatipiumObject> > >("Initialize", UpdatedCallback); } Com.Latipium.Core.Tuple <float[], int[]> data = type.InvokeFunction <Com.Latipium.Core.Tuple <float[], int[]> >("GetPhysicsData"); if (data != null && data.Object1 != null && data.Object2 != null) { List <JVector> points = new List <JVector>(); List <TriangleVertexIndices> tris = new List <TriangleVertexIndices>(); for (int i = 0; i < data.Object1.Length - 2; i += 3) { points.Add(new JVector(data.Object1[i], data.Object1[i + 1], data.Object1[i + 2])); } for (int i = 0; i < data.Object2.Length - 2; i += 3) { tris.Add(new TriangleVertexIndices(data.Object2[i], data.Object2[i + 1], data.Object2[i + 2])); } Octree octree = new Octree(points, tris); Shape shape = new TriangleMeshShape(octree); RigidBody body = new RigidBody(shape); Func <bool> UseGravity = type.GetFunction <bool>("UseGravity"); body.AffectedByGravity = UseGravity == null || UseGravity(); Bodies.Add(obj, body); World.AddBody(body); } } } }
public void Removed(LatipiumObject realm) { Systems.Remove(realm); if (RealmRemoved != null) { RealmRemoved(realm); } }
public void Load(LatipiumObject obj) { Objects[obj.GetType().FullName] = obj; if (ObjectLoaded != null) { ObjectLoaded(obj); } }
public Com.Latipium.Core.Tuple <object, object> GetRenderData(LatipiumObject instance) { return(new Com.Latipium.Core.Tuple <object, object>(new float[] { -1.0f, -1.0f, -1.0f, -1.0f, -1.0f, 1.0f, -1.0f, 1.0f, 1.0f, 1.0f, 1.0f, -1.0f, -1.0f, -1.0f, -1.0f, -1.0f, 1.0f, -1.0f, 1.0f, -1.0f, 1.0f, -1.0f, -1.0f, -1.0f, 1.0f, -1.0f, -1.0f, 1.0f, 1.0f, -1.0f, 1.0f, -1.0f, -1.0f, -1.0f, -1.0f, -1.0f, -1.0f, -1.0f, -1.0f, -1.0f, 1.0f, 1.0f, -1.0f, 1.0f, -1.0f, 1.0f, -1.0f, 1.0f, -1.0f, -1.0f, 1.0f, -1.0f, -1.0f, -1.0f, -1.0f, 1.0f, 1.0f, -1.0f, -1.0f, 1.0f, 1.0f, -1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, -1.0f, -1.0f, 1.0f, 1.0f, -1.0f, 1.0f, -1.0f, -1.0f, 1.0f, 1.0f, 1.0f, 1.0f, -1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, -1.0f, -1.0f, 1.0f, -1.0f, 1.0f, 1.0f, 1.0f, -1.0f, 1.0f, -1.0f, -1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, -1.0f, 1.0f, 1.0f, 1.0f, -1.0f, 1.0f }, new Color[] { Color.FromArgb(255, 0, 0), Color.FromArgb(255, 0, 0), Color.FromArgb(255, 0, 0), Color.FromArgb(190, 63, 0), Color.FromArgb(190, 63, 0), Color.FromArgb(190, 63, 0), Color.FromArgb(127, 127, 0), Color.FromArgb(127, 127, 0), Color.FromArgb(127, 127, 0), Color.FromArgb(63, 190, 0), Color.FromArgb(63, 190, 0), Color.FromArgb(63, 190, 0), Color.FromArgb(0, 255, 0), Color.FromArgb(0, 255, 0), Color.FromArgb(0, 255, 0), Color.FromArgb(0, 190, 63), Color.FromArgb(0, 190, 63), Color.FromArgb(0, 190, 63), Color.FromArgb(0, 127, 127), Color.FromArgb(0, 127, 127), Color.FromArgb(0, 127, 127), Color.FromArgb(63, 190, 0), Color.FromArgb(63, 190, 0), Color.FromArgb(63, 190, 0), Color.FromArgb(0, 0, 255), Color.FromArgb(0, 0, 255), Color.FromArgb(0, 0, 255), Color.FromArgb(63, 0, 190), Color.FromArgb(63, 0, 190), Color.FromArgb(63, 0, 190), Color.FromArgb(127, 0, 127), Color.FromArgb(127, 0, 127), Color.FromArgb(127, 0, 127), Color.FromArgb(190, 0, 63), Color.FromArgb(190, 0, 63), Color.FromArgb(190, 0, 63) })); }
public void Removed(IEnumerable <LatipiumObject> objs, LatipiumObject realm) { Systems[realm].RemoveObjects(objs); if (ObjectRemoved != null) { foreach (LatipiumObject obj in objs) { ObjectRemoved(obj, realm); } } }
internal ObjectImpl(LatipiumObject type, Guid guid) { Type = type; Guid = guid; Position = new Com.Latipium.Core.Tuple <float, float, float>(0, 0, 0); Transform = new float[] { 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1 }; }
public void LoadWorld(LatipiumObject world) { World = world; GetRealms = World.GetFunction <IEnumerable <LatipiumObject> >("GetRealms"); if (GetRealms != null) { foreach (LatipiumObject realm in GetRealms()) { Added(realm); } } }
public LatipiumObject Generate() { if (CreateWorld == null || CreateRealm == null || CreateObject == null) { return(null); } LatipiumObject world = CreateWorld(); LatipiumObject realm = CreateRealm("Com.Latipium.Realms.Default"); world.InvokeProcedure <LatipiumObject>("AddRealm", realm); LatipiumObject cube = CreateObject(GetObject("Com.Latipium.TestingObjects.CubeObject")); realm.InvokeProcedure <LatipiumObject>("AddObject", cube); return(world); }
public void Added(LatipiumObject realm) { PhysicsSystem system = new PhysicsSystem(); IEnumerable <LatipiumObject> objs = realm.InvokeFunction <IEnumerable <LatipiumObject> >("GetObjects"); if (objs != null) { system.AddObjects(objs); } Systems.Add(realm, system); if (RealmAdded != null) { RealmAdded(realm); } }
/// <summary> /// Gets extension data stored with this object. /// </summary> /// <returns>The data.</returns> /// <param name="name">The name of the object.</param> /// <typeparam name="T">The type of data.</typeparam> public T GetData <T>(string name) where T : LatipiumObject { if (Data.ContainsKey(name)) { LatipiumObject data = Data[name]; if (data is T) { return((T)data); } else { return(default(T)); } } else { return(default(T)); } }
public LatipiumObject GetPlayerInstance(string name) { lock ( WorldLock ) { if (Players.ContainsKey(name)) { return(Players[name]); } else if (GetPlayer == null) { return(null); } else { LatipiumObject player = GetPlayer(); LatipiumObject obj = WorldModule.ConstructObject(player); Realms.First().InvokeProcedure <LatipiumObject>("AddObject", obj); //player.InvokeFunction<string, string>("Name", name); //player.InvokeFunction<LatipiumObject, LatipiumObject>("Object", obj); return(Players[name] = obj); } } }
public Com.Latipium.Core.Tuple <IEnumerable <LatipiumObject>, IEnumerable <LatipiumObject> > Update(IEnumerable <LatipiumObject> objs) { if (Handler != null) { LatipiumObject obj = objs.First(o => o == Object && Handler.Object == o); if (obj != null && Position != null && Environment.TickCount > LastFrameTime) { float delta = (((float)Environment.TickCount) - (float)LastFrameTime) / 1000f; LastFrameTime = Environment.TickCount; if (Rotate != null) { float x = Handler.Rotation.Object1; float y = Handler.Rotation.Object2; if (x != 0) { float xs = x * Sensitivity; XRot -= xs; Rotate(xs, 0, -1, 0); Handler.Rotation.Object1 -= x; } if (y != 0) { Rotate(-y * Sensitivity, (float)Math.Cos(XRot), 0, (float)Math.Sin(-XRot)); Handler.Rotation.Object2 -= y; } } Com.Latipium.Core.Tuple <float, float, float> pos = Position(null); delta *= Speed; float sin = (float)Math.Sin(XRot); float nsin = (float)Math.Sin(-XRot); float cos = (float)Math.Cos(XRot); pos.Object1 += Handler.Translation.Object3 * delta * sin + Handler.Translation.Object1 * delta * cos; pos.Object2 += Handler.Translation.Object2 * delta; pos.Object3 += Handler.Translation.Object3 * delta * cos + Handler.Translation.Object1 * delta * nsin; Position(pos); } } return(null); }
public void SetPlayer(LatipiumObject player) { Renderer.Player = player; }
public void LoadWorld(LatipiumObject world) { Renderer.World = world; }
public void Loop() { int update = Environment.TickCount; while (true) { float time = Environment.TickCount - update; update = Environment.TickCount; Dictionary <LatipiumObject, List <LatipiumObject> > objects = new Dictionary <LatipiumObject, List <LatipiumObject> >(); foreach (LatipiumObject realm in GetRealms()) { objects.Clear(); List <LatipiumObject> additions; if (Additions.ContainsKey(realm)) { additions = Additions[realm]; } else { additions = new List <LatipiumObject>(); Additions[realm] = additions; } List <LatipiumObject> removals; if (Removals.ContainsKey(realm)) { removals = Removals[realm]; } else { removals = new List <LatipiumObject>(); Removals[realm] = removals; } foreach (LatipiumObject obj in realm.InvokeFunction <IEnumerable <LatipiumObject> >("GetObjects")) { LatipiumObject type = obj.InvokeFunction <LatipiumObject>("Type"); List <LatipiumObject> list; if (objects.ContainsKey(type)) { list = objects[type]; } else { list = new List <LatipiumObject>(); objects[type] = list; } list.Add(obj); } foreach (LatipiumObject type in objects.Keys) { Com.Latipium.Core.Tuple <IEnumerable <LatipiumObject>, IEnumerable <LatipiumObject> > changes = type.InvokeFunction <IEnumerable <LatipiumObject>, Com.Latipium.Core.Tuple <IEnumerable <LatipiumObject>, IEnumerable <LatipiumObject> > >("PhysicsUpdate", objects[type]); if (changes != null) { lock ( ListLock ) { if (changes.Object1 != null) { additions.AddRange(changes.Object1); } if (changes.Object2 != null) { removals.AddRange(changes.Object2); } } } } Systems[realm].Step(time); } } }
internal WorldBody(Com.Latipium.Core.Tuple <float[], int[]> data, LatipiumObject obj) : base(new TriangleMeshShape(CreateOctree(data))) { obj = Instance; PositionFunc = Instance.GetFunction <Com.Latipium.Core.Tuple <float, float, float>, Com.Latipium.Core.Tuple <float, float, float> >("Position"); TransformFunc = Instance.GetFunction <float[], float[]>("Transform"); }
public void Start() { LatipiumModule auth = ModuleFactory.FindModule("Com.Latipium.Modules.Authentication"); LatipiumModule graphics = ModuleFactory.FindModule("Com.Latipium.Modules.Graphics"); LatipiumModule network = ModuleFactory.FindModule("Com.Latipium.Modules.Network"); LatipiumModule player = ModuleFactory.FindModule("Com.Latipium.Modules.Player"); LatipiumModule world = ModuleFactory.FindModule("Com.Latipium.Modules.World"); if (graphics == null) { Log.Error("Unable to find graphics module"); } else { string name = null; LatipiumObject w = null; if (world != null) { if (auth == null) { name = "Player"; } else { name = auth.InvokeFunction <string>("GetUsername"); } w = world.InvokeFunction <LatipiumObject>("CreateWorld"); } Thread networkThread = null; if (network != null) { Thread parent = Thread.CurrentThread; networkThread = new Thread(() => { network.InvokeProcedure("InitializeClient"); if (world != null) { network.InvokeProcedure <LatipiumObject>("LoadWorld", w); } parent.Interrupt(); try { network.InvokeProcedure("Loop"); } catch (ThreadInterruptedException) { } finally { network.InvokeProcedure("Destroy"); } }); networkThread.Start(); try { // Will be interrupted when the network loads Thread.Sleep(int.MaxValue); } catch (ThreadInterruptedException) { } } LatipiumObject p = null; if (w != null) { p = w.InvokeFunction <string, LatipiumObject>("GetPlayer", name); if (player != null && p != null) { player.InvokeProcedure <LatipiumObject>("HandleFor", p); } } graphics.InvokeProcedure("Initialize"); if (world != null) { graphics.InvokeProcedure <LatipiumObject>("LoadWorld", w); if (p != null) { graphics.InvokeProcedure <LatipiumObject>("SetPlayer", p); } } try { graphics.InvokeProcedure("Loop"); } finally { graphics.InvokeProcedure("Destroy"); if (networkThread != null) { networkThread.Interrupt(); } } } }
public void AddRealm(LatipiumObject realm) { lock ( WorldLock ) { Realms.Add(realm); } }
public void RemoveObject(LatipiumObject obj) { lock ( WorldLock ) { Objects.Remove(obj); } }
private void LoadObject(LatipiumObject obj) { obj.InvokeProcedure <Action <IEnumerable <LatipiumObject> > >("Initialize", (IEnumerable <LatipiumObject> o) => { }); }
public void HandleFor(LatipiumObject obj) { PlayerLoader.Instance.Object = obj; }
public void AddObject(LatipiumObject obj) { lock ( WorldLock ) { Objects.AddLast(obj); } }
public LatipiumObject ConstructObject(LatipiumObject type) { return(new ObjectImpl(type)); }
public void Start() { LatipiumModule auth = ModuleFactory.FindModule("Com.Latipium.Modules.Authentication"); LatipiumModule graphics = ModuleFactory.FindModule("Com.Latipium.Modules.Graphics"); LatipiumModule physics = ModuleFactory.FindModule("Com.Latipium.Modules.Physics"); LatipiumModule player = ModuleFactory.FindModule("Com.Latipium.Modules.Player"); LatipiumModule worldGen = ModuleFactory.FindModule("Com.Latipium.Modules.World.Generator"); LatipiumModule worldSer = ModuleFactory.FindModule("Com.Latipium.Modules.World.Serialization"); if (graphics == null) { Log.Error("Unable to find graphics module"); } else { string name = null; LatipiumObject world = null; if (worldGen != null || worldSer != null) { if (auth == null) { name = "Player"; } else { name = auth.InvokeFunction <string>("GetUsername"); } if (worldSer != null) { world = worldSer.InvokeFunction <LatipiumObject>("Load"); } if (world == null && worldGen != null) { world = worldGen.InvokeFunction <LatipiumObject>("Generate"); } } LatipiumObject p = null; if (world != null) { p = world.InvokeFunction <string, LatipiumObject>("GetPlayer", name); if (player != null && p != null) { player.InvokeProcedure <LatipiumObject>("HandleFor", p); } } Thread physicsThread = null; Thread parent = null; if (physics != null) { physicsThread = new Thread(() => { physics.InvokeProcedure("Initialize"); if (world != null) { physics.InvokeProcedure <LatipiumObject>("LoadWorld", world); } try { physics.InvokeProcedure("Loop"); } catch (ThreadInterruptedException) { } finally { physics.InvokeProcedure("Destroy"); if (parent != null) { parent.Interrupt(); } } }); physicsThread.Start(); } graphics.InvokeProcedure("Initialize"); if (world != null) { graphics.InvokeProcedure <LatipiumObject>("LoadWorld", world); if (p != null) { graphics.InvokeProcedure <LatipiumObject>("SetPlayer", p); } } try { graphics.InvokeProcedure("Loop"); } finally { graphics.InvokeProcedure("Destroy"); if (physicsThread != null) { parent = Thread.CurrentThread; physicsThread.Interrupt(); try { Thread.Sleep(int.MaxValue); } catch (ThreadInterruptedException) { } } if (world != null && worldSer != null) { worldSer.InvokeProcedure <LatipiumObject>("Save", world); } } } }
public LatipiumObject ConstructObject(LatipiumObject type, Guid guid) { return(new ObjectImpl(type, guid)); }
public void Start() { LatipiumModule network = ModuleFactory.FindModule("Com.Latipium.Modules.Network"); LatipiumModule physics = ModuleFactory.FindModule("Com.Latipium.Modules.Physics"); // LatipiumModule player = ModuleFactory.FindModule("Com.Latipium.Modules.Player"); LatipiumModule worldGen = ModuleFactory.FindModule("Com.Latipium.Modules.World.Generator"); LatipiumModule worldSer = ModuleFactory.FindModule("Com.Latipium.Modules.World.Serialization"); if (network == null) { Log.Error("Unable to find network module"); } else { LatipiumObject world = null; if (worldSer != null) { world = worldSer.InvokeFunction <LatipiumObject>("Load"); } if (world == null && worldGen != null) { world = worldGen.InvokeFunction <LatipiumObject>("Generate"); } Thread physicsThread = null; Thread parent = null; if (physics != null) { physicsThread = new Thread(() => { physics.InvokeProcedure("Initialize"); if (world != null) { physics.InvokeProcedure <LatipiumObject>("LoadWorld", world); } try { physics.InvokeProcedure("Loop"); } catch (ThreadInterruptedException) { } finally { physics.InvokeProcedure("Destroy"); if (parent != null) { parent.Interrupt(); } } }); physicsThread.Start(); } network.InvokeProcedure("InitializeServer"); if (world != null) { network.InvokeProcedure <LatipiumObject>("LoadWorld", world); } try { network.InvokeProcedure("Loop"); } finally { network.InvokeProcedure("Destroy"); if (physicsThread != null) { physicsThread.Interrupt(); try { Thread.Sleep(int.MaxValue); } catch (ThreadInterruptedException) { } } if (world != null && worldSer != null) { worldSer.InvokeProcedure <LatipiumObject>("Save", world); } } } }
internal ObjectImpl(LatipiumObject type) : this(type, Guid.NewGuid()) { }