Using bounding box boolean to create a random 'subtraction' effect. Applied to a pretty standard octree scene management system.
What's happening is basically the program is 'cutting' into the objects in the scene and generating new replacement parts (new bounding boxes)
The goal of this test is to just make sure the logic is sound.. not very efficient.
So I worked out what was wrong with the Unity web player and fudged a work around to create a webplayer sample.
You can check out the sample here, you'll need to install Unity webplayer.
I came across this little snippet of code* to find the next power of 2 and found it quite helpful – from what I understand it's also very efficient compared to other methods.
public int NextPowerOfTwo(int inInt)
inInt = ( inInt >> 1 ) | inInt;
inInt = ( inInt >> 2 ) | inInt;
inInt = ( inInt >> 4 ) | inInt;
inInt = ( inInt >> 8 ) | inInt;
inInt = ( inInt >> 16 ) | inInt;
inInt++; // Val is now the next highest power of 2.
Link to original article regarding technique and actually a more detailed explanation of the method – Acius' Snippets.
So here is my version I'm going to make public.
Added + and – for the speed increase and decrease (on the right)
Added frame forward and frame back into the bottom controls (also + and – .. maybe I should change that)
Download the latest zip packages here:
So here we go.. a quick recorded version.
Since Unity doesn't really have an elegant solution to a 'user file open dialog' I've decided to go to a more source file update type method.
So basically there's a file in the directory with the application called 'gameSource.txt' and the app with automatically load and refresh the scene with this map data when the file is changed. So if you have a simulation output the results into this text file the visualizer will automatically load the file and play the new simulation.
Why is this good? Because it means you don't have to restart the visualizer it can stay open the whole time playing while you work away and will update when there's new game data.
So I created a quick planet texture (loosely based on a moon type texture) and added some functionality to make the ships to move towards the planets with a slight shift along the tangent – which basically means that fleets sent out and fleets incoming wont line up on top of each other so you can distinguish between the two.
The real big change is a added functionality to center and scale the camera viewport based on the map size so in theory this visualizer can handle any map of any size and it will stay centered and not clip off the screen.
Right now there seems to be a selective Unity bug that wont let me display instanced objects in the web viewer :'(. I bugged the Unity guys and hopefully they'll release a patch soonish.
So everything is coming along nicely I got the basic play UI controls implemented "play/pause", "go to end" and "go to start" which basically will reset the simulation back to frame 0 and the last frame respectively.
So what's left to do?
Well it's missing the total ship count graph but this is low priority.
It really needs some kind of UI for loading a custom game sequence.
I need to also add system to center the map and camera so that any maps that are larger and smaller get the correct camera focus.
So i cleaned up some of the code and added some aura type objects behind the planets. This really is so I can have a more subtle color on the planet without losing the indication that the planet has been converted.
Seems like some of the auras are doubling up on the blue side – something is causing them to change hue.
Next up I'm going to work on getting some UI controls: "play", "pause", "goto beginning", "goto end"
Added GUI text components for the planets and the fleets. I tried with 3D text but the results are true 1:1 pixel ratio for the text rendering so you get aliasing artifacts.
To get the GUI text in the right position I had to do a double transform. Once to Camera pixel space and then to camera viewport space (basically 0,0 to 1,1 extents representation of the viewport)
Vector3 screenPos = gameCamera.ScreenToViewportPoint(gameCamera.WorldToScreenPoint(pos));
Oh and I whipped up a quick ship model to use rather than the capsule I was using before
So in the time while I waited for GoDaddy to update my wordpress I've managed to get a pretty basic implementation of the visualizer in Unity 3.0.
Right now it splits the game data string into rounds and creates a unique 'planet wars' object per round (List<PlanetWars>) – cloning the planets for each round and updating the owner and number of ships as well as creating the unique fleets for each round.
The 'CreateScene' function takes that array and creates a collection of GameObjects for the planets and fleets as needed.
It's creating and destroying the whole scene (planets, fleets etc) each round which isn't really a problem but pretty inefficient.
I need to add text rendering to show the numbers on the planets and fleets to show ship counts.
Unity 3.0 is pretty straight forward to get something like this up and running, however I am having a problem with Monodevelop on my PC. It doesn't seem to want to debug properly. I mean I can start the debug session and everything it's just if I modify any of the source code Unity looses all responsiveness and stops being able to progress. I think it has something to do with the recompile process because it only happens when I make a change to one of the scripts :'(.