In this section you can check out what I'm currently working in, practically in real time.
If some of this seems cryptic it's because the logs seen here come directly from my personal productivity tool prio, and are really just "notes to self".
Nevertheless, if you are interested in what I'm currently working on, this space will certainly be updated FAR more often than the news section.
19:45:31 dreamler CLOCK: 0.4 days (09:28 hours)
19:38:08 dreamler TASK: group name at center of group in top lod
19:04:43 dreamler TASK: groups as node attribute
14:28:09 dreamler TASK: group naming
10:47:07 dreamler TASK: persistent keytoggles
18:01:53 dreamler CLOCK: 0.4 days (09:16 hours)
18:00:19 dreamler TASK: fix GameController2 background
11:07:23 dreamler TASK: tab support in text area
11:07:08 dreamler TASK: shift enter support in textarea
10:13:36 dreamler TASK: correct offsets when dragging nodes
09:41:37 dreamler TASK: remove edges from gui rects
09:37:19 dreamler TASK: a reasonable text area widget
09:34:04 dreamler TASK: word / line breaking in text area widget
21:59:41 sandblox CLOCK: 0.1 days (01:54 hours)
21:59:38 sandblox TASK: view distance as user option
21:04:37 sandblox TASK: view point light from metablock
21:03:12 sandblox TASK: public deployment
19:34:41 sandblox CLOCK: 01:08 hours
17:50:31 sandblox CLOCK: 0.1 days (02:09 hours)
17:43:37 sandblox TASK: avatar animations
16:40:12 sandblox TASK: avatar blendmesh colors
16:05:30 sandblox LOG
Multi machine multiplayer test; basics look to be working.
14:56:40 sandblox CLOCK: 01:06 hours
14:28:06 sandblox TASK: bullets in multiplayer
14:26:57 sandblox TASK: change metablock pick to be client side authoritative
14:09:21 sandblox TASK: fix bad counts in state
10:44:44 sandblox CLOCK: 00:38 hours
10:40:33 sandblox TASK: prioritize history over realtime data
00:25:09 sandblox CLOCK: 0.2 days (04:21 hours)
00:25:07 sandblox TASK: remove drops from edit gun hits
00:09:41 sandblox TASK: cl -> sv sequence checks
00:09:27 sandblox TASK: cl -> sv session keys
20:29:57 sandblox TASK: drops in multiplayer
20:04:26 sandblox TASK: drops from traversable to pool
19:07:59 sandblox CLOCK: 0.1 days (01:22 hours)
18:58:39 dreamler CLOCK: 0.3 days (08:10 hours)
12:37:00 dreamler TASK: general gui culling
12:36:54 dreamler TASK: line culling
12:01:47 dreamler TASK: texture node culling
18:53:00 dreamler CLOCK: 0.3 days (07:47 hours)
14:08:32 dreamler TASK: arrowheads on correct sides of activity
13:36:55 dreamler TASK: reduce the number of textures, drive colors programmatically
16:57:52 dreamler CLOCK: 0.3 days (06:39 hours)
16:29:59 dreamler TASK: can only connect activity to something else
16:20:58 dreamler TASK: fix arrowheads for activity to activity only
16:16:29 dreamler TASK: node states
15:01:53 dreamler TASK: states with lots of history stats
11:47:44 dreamler TASK: zoom on mouse cursor
10:50:11 dreamler TASK: asset refactoring
10:29:21 dreamler TASK: asset path renaming
18:26:50 dreamler CLOCK: 0.4 days (09:47 hours)
15:28:54 dreamler TASK: better spline vectors
11:49:33 dreamler TASK: rudimentary position validation
11:49:17 dreamler TASK: drag out new nodes from existing nodes
11:48:57 dreamler TASK: create nodes from supernode
23:58:31 sandblox CLOCK: 0.2 days (04:06 hours)
23:57:34 sandblox TASK: multiplayer history
23:38:49 sandblox TASK: implement history ack
19:33:11 sandblox CLOCK: 00:39 hours
19:23:36 sandblox TASK: implement history overflow handling
19:23:08 sandblox TASK: implement history send
18:24:23 sandblox CLOCK: 00:32 hours
18:19:19 sandblox TASK: fix uses of persisted avatar input settings on creation
18:18:57 sandblox TASK: store history events in an additional linear container
15:37:58 sandblox CLOCK: 0.1 days (01:18 hours)
23:34:46 sandblox CLOCK: 0.1 days (01:35 hours)
23:30:55 sandblox LOG
...and the learning experience is constant and at a hellish rate!
Now that IEventTarget has been abolished and events use a very serializable byte buffer, I'm starting to realize that it might not be a good thing at all to actually send these very transient events across the network, for several reasons.
First of all, it is easy to get things mixed up, and parse outgoing events (from client to server) with authoritative methods in the Model, effectively simulating things that should really happen on the remote server. This is the mistake of running that local case at the same time as the remote case.
Even with a splitup of different parse methods for local and remote, similar to different IEventTarget implementations, you still get into the issues of reliability. Some of the legacy IEventTarget calls are meant to load an entire world, and what happens if they get dropped in transit across the network? Also when a client resets the game (disconnect) that is a LOCAL event, as the server is still running.
All of these complexities make event derivation from state (the old idea) much more lucrative. There is already stuff like this going on; I did world information based on state without even thinking about it, generating an "official event" in the network code.
I'll mull over this a bit more, but I'm suspecting that transient events will NOT be sent across the network. The refactoring into a buffer based (vs abstract interface) messaging system isn't all bad though, and I'll likely keep it rather than go back to IEventTarget.
...but don't quote me on that...
21:33:56 sandblox CLOCK: 0.1 days (01:41 hours)
21:31:08 sandblox TASK: extract update commonality in all deployments
20:15:24 sandblox TASK: fix world teardown on disconnect
17:35:13 sandblox CLOCK: 0.1 days (01:40 hours)
17:35:09 sandblox TASK: fix dry fire bug
17:03:26 sandblox LOG
Core multiplayer is now implemented, still need to work on events and history.
17:03:11 sandblox TASK: reenable multiplayer
15:15:59 sandblox LOG
Progress on multiplayer is good, getting close to a working build.
15:15:34 sandblox CLOCK: 00:49 hours
13:59:24 sandblox CLOCK: 00:52 hours
12:29:53 sandblox CLOCK: 00:26 hours
11:19:11 sandblox CLOCK: 00:07 hours
11:03:52 sandblox CLOCK: 0.1 days (01:59 hours)
20:43:51 sandblox CLOCK: 00:52 hours
15:12:55 sandblox CLOCK: 00:08 hours
15:12:16 sandblox TASK: inventory events to new solution
13:56:26 sandblox CLOCK: 00:07 hours
11:39:00 dreamler CLOCK: 0.1 days (02:13 hours)
16:54:55 dreamler CLOCK: 0.4 days (08:37 hours)
11:19:00 dreamler TASK: click and pan
10:30:26 dreamler TASK: adjusted zoom (10 - 100 %), mousewheel support
10:29:46 dreamler TASK: test texture on nodes
08:44:18 dreamler TASK: don't do dns lookup every frame :)
00:35:53 sandblox CLOCK: 0.1 days (01:22 hours)
00:35:40 sandblox LOG
Note to self; never write down a plan that hasn't yet been validated by implementation... :)
The events don't work like I recently logged, they look more like a Ground Control style memory buffer approach. This actually turned out to be the cleanest implementation of all that I have tried, and totally destroys the concept of IEventTarget.
The upside is of course a solution that serializes directly, and the encapsulation of the Model is better.
22:10:16 sandblox CLOCK: 0.1 days (01:24 hours)
20:20:17 sandblox CLOCK: 0.2 days (04:03 hours)
15:59:10 sandblox CLOCK: 00:07 hours
14:30:52 sandblox CLOCK: 00:08 hours
18:32:09 sandblox CLOCK: 0.3 days (07:46 hours)
17:25:20 sandblox LOG
What I expect to do next is to have all Model subsystems that make "re-entrant" IEventTarget calls to simply call the Model directly. This covers the Model / simulation.
For the client there will probably be a proxy with a single method for passing the per-tick input structure. In the local case this will be the Model, and in the remote case (still) a remote proxy.
17:22:23 sandblox LOG
Killing darlings left and right!
My post-GC2 network abstraction architecture has fallen (at least in this project) in favor of the COI-style architecture. The main point was to get rid of all callbacks from the Model to any "interested party", as this is kind of a pain to recreate in the networked case given a purely state based approach across the wire.
What does happen to bridge the gap is that some "event flags" and sequence numbers are introduced in various parts of the Model in order for the visualization to be able to trigger sounds and effects as a result of what would typically (earlier) be an "event callback".
This does get kind of icky in that it basically involves converting what would be a function call into a struct of some kind, but the upside is more isolation between the Model and the View(s).
Things like this are already going on a lot due to the history / event based persistence.
Also, the client side input to the simulation (per user / avatar) has been modified to include "commands"; things that were earlier IEventTarget calls. This is of course mostly in order to serialize better, but in truth it really is cleaner in this case. The stuff that is affected has to do with inventory manipulation, and the history system really requires globally unique and serializable ids on items, so getting away from object references / pointers is a pro here.
17:16:25 sandblox TASK: cleanup input side of IEventTarget
13:16:55 sandblox TASK: fix speedloader, including history events
23:47:24 sandblox CLOCK: 00:29 hours
23:40:53 sandblox TASK: fix item crafting
23:03:22 sandblox CLOCK: 00:15 hours
23:00:58 sandblox TASK: drop item event
22:10:05 sandblox TASK: remove static avatar array?
20:40:33 sandblox CLOCK: 0.1 days (02:10 hours)
17:04:50 sandblox CLOCK: 01:02 hours
14:48:50 sandblox CLOCK: 0.1 days (02:03 hours)
14:44:57 sandblox TASK: split event logs; one per chunk (xyz mapped), one for all Inventories?
10:54:57 sandblox CLOCK: 0.1 days (01:20 hours)
10:33:33 sandblox TASK: recalc emission on material edit
10:18:10 sandblox LOG
Now I'm really off to see the wizard; the explicit persistence system is now removed and deprecated, and everything is at the mercy of the determinism of the event / history system...
10:12:29 sandblox TASK: deprecate dmp
23:58:09 sandblox CLOCK: 0.2 days (03:41 hours)
23:57:59 sandblox LOG
When fixing the storage cubes, which were broken by the new persistence, they simply disappeared. By that I mean that the objects are no longer required, simply an implicit mapping from the world space coordinate of the storage cube to an Inventory object. Strange but true.
On the heels of this some strange bugs appeared, but they were sorted when I realized that some items need to be "cleared" (set to no type) when their ammo / uses are depleted, while others (like guns) are not cleared. This related to the event that used ammo.
Finally an event was added to handle the case when avatars are killed, upon which they drop all their inventory items (a clear of the Inventory object).
With all this in place things are looking solid.
23:54:12 sandblox TASK: fix storage cube persistence
21:35:37 sandblox TASK: fix chunk cache crash
18:32:46 sandblox CLOCK: 0.1 days (03:19 hours)
17:41:32 sandblox TASK: enable items in default inventory
15:57:02 sandblox TASK: remove inventory cheats
15:48:49 sandblox TASK: reenable avatar persistence
12:01:23 sandblox CLOCK: 0.1 days (01:39 hours)
11:57:16 sandblox LOG
Inventory persistence is now completely history based. Still a little more stuff to test, but first I need to remove all the explicitly state changing cheats as they mess with history.
17:16:11 sandblox CLOCK: 00:32 hours
15:14:25 sandblox LOG
Rewriting the way Inventory works, as the access of items is kind of obfuscated right now. The relational model comes back to taunt me yet again...
15:13:34 sandblox CLOCK: 0.1 days (01:40 hours)
18:41:54 dreamler CLOCK: 0.1 days (01:15 hours)
17:25:47 dreamler CLOCK: 0.3 days (07:54 hours)
13:30:25 dreamler TASK: link nodes
12:47:58 dreamler TASK: name node
12:47:56 dreamler TASK: delete node
12:47:54 dreamler TASK: move node
18:00:00 dreamler CLOCK: 0.3 days (06:49 hours)
17:30:18 dreamler TASK: server hostname and port input / persistence
17:29:53 dreamler TASK: refactor to allow for a better login screen
15:19:53 dreamler TASK: create node
15:19:40 dreamler TASK: zlib decompress server downstream
13:49:48 dreamler TASK: zlib compress client upstream
11:13:44 dreamler TASK: spline drawing tests
11:12:57 dreamler TASK: zlib compression test
11:10:28 dreamler CLOCK: 0.1 days (01:44 hours)
09:26:09 dreamler CLOCK: 00:18 hours