<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-4044374934526922505</id><updated>2011-12-01T11:32:30.489-06:00</updated><category term='space'/><category term='popeye'/><category term='cooking'/><category term='furry'/><category term='flash'/><category term='beer'/><category term='vore'/><category term='brewing'/><category term='brawl'/><category term='collisions'/><category term='blender'/><category term='hacking'/><category term='vbo'/><category term='pokemon'/><category term='NAS'/><category term='assembly'/><category term='xcore'/><category term='GCC'/><category term='quadtree'/><category term='anthro'/><category term='mingl'/><category term='opengl'/><category term='python'/><category term='SDL'/><category term='ARF'/><category term='gamecube'/><category term='dragon'/><category term='zombie'/><category term='emo'/><category term='BRF'/><category term='vertex array'/><category term='code'/><category term='Quaternion'/><category term='work'/><category term='mortal kombat'/><category term='mugen'/><category term='blender python'/><category term='screenshots'/><category term='demos'/><category term='final fantasy'/><category term='math'/><category term='xgfx'/><category term='Curetis Siva'/><category term='personal'/><category term='IK'/><category term='core'/><category term='programming'/><category term='graphics'/><category term='ridley'/><category term='violence'/><category term='wii'/><category term='bunny monster'/><category term='dream'/><category term='iRF'/><category term='banter'/><category term='kami'/><category term='algorithm'/><category term='SIMD'/><category term='ghost'/><category term='game'/><category term='webgl'/><category term='vertex program'/><category term='discrete space'/><category term='reconi'/><category term='movie'/><category term='adventure'/><category term='3dfractal'/><category term='iPhone'/><category term='fhdtv'/><category term='FPS'/><category term='data structures'/><category term='Mirror&apos;s Edge'/><category term='shaders'/><category term='rpg'/><category term='godzilla'/><category term='house'/><category term='japan'/><category term='lucid dream'/><category term='GLSL'/><category term='statistics'/><category term='debt'/><category term='model'/><category term='lizard'/><category term='game maker'/><category term='TED'/><category term='nvidia'/><category term='fragment program'/><title type='text'>ImaginaryZ's blog</title><subtitle type='html'>Miscellaneous banter, Useful mathematics, game programming tools and the occasional kink or two.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://imaginaryz.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://imaginaryz.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default?start-index=101&amp;max-results=100'/><author><name>Imaginary Z</name><uri>http://www.blogger.com/profile/05059116260376007206</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_O5BsOfO48b0/R1n4E03veuI/AAAAAAAAAAc/p0Q4WRLzwj0/S220/GargHead.png'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>110</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-4044374934526922505.post-7689390761245986042</id><published>2011-11-10T21:25:00.000-06:00</published><updated>2011-11-10T21:25:15.149-06:00</updated><title type='text'>Audio Synthesis from 2D Wave Simulation for Organic Noise Generation</title><content type='html'>Based on &lt;a href="http://www.falstad.com/ripple/"&gt;http://www.falstad.com/ripple/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;My thought was, since I have a game or three I'm working on that have a interesting menagerie of creatures; I need a way to make the sounds the monster make.&lt;br /&gt;Normally, I find people mixing and splicing sources of sounds together to make monsters, for example, Godzilla's classic roar is simply rubbing a resin-covered leather glove along the loosened strings of a double bass and then slowed down. And a lot of star wars noises are recorded from other things, like cars and animals.&lt;br /&gt;This isn't what I want.&lt;br /&gt;&lt;br /&gt;So, I found this nifty ripple tank, and immediately figured "hey, now I can model a synthetic vocal system"&lt;br /&gt;&lt;br /&gt;After a bit with the code, I'm attempting to work it out into a non-realtime sound generator; basically performing the ripple simulation above with animations savable and editable so you can "render" a sound.&lt;br /&gt;&lt;br /&gt;You would ideally begin by placing "walls" (flesh) around in whatever you think makes sense, usually tubes and baffles, then place some emitters. Place a recording source or a few, and run the simulation. While it is running, you should be able to add/remove walls, which is simulating them moving like a tongue. And you should be able to move the emitters and change their influence, and possibly source data (IE you can record yourself and play it through your system). The output will be greatly distorted and morphed by the complex reflections and interference patterns generated; which is exactly what I want. To get that good monster feel, it'll need different types of emitters and easy wall motion with probably line segments for automated flappings.&lt;br /&gt;&lt;br /&gt;Here's a screenshot of my version in action; it needs a LOT of optimization as it's way too slow for my taste. Also, I don't have everything editable yet, I'd like to use png files to define the walls and simulation sizes; which are easy for anyone to edit. Probably have to stick with a text/dxml file for defining listeners since you can have them use wav files and such.&lt;br /&gt;&lt;br /&gt;Hopefully I can get something like this in a presentable form, after some testing today I'll see what kinda sounds it currently makes.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-jNpVl5VXSDg/TryUdKJNpwI/AAAAAAAAANA/q0J5aSRoS_c/s1600/MonsterWaveTest.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="290" src="http://3.bp.blogspot.com/-jNpVl5VXSDg/TryUdKJNpwI/AAAAAAAAANA/q0J5aSRoS_c/s400/MonsterWaveTest.PNG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;The "X" is the listener, the "+" are emitters. Aqua is walls, red is +, green is -. The waveform is shown in the bottom right (on my machine, it scrolled pretty fast). Simulation size is ~ 320x180 cells. It's important to note this is for entirely synthetic creatures, not accurate modeling of real physiology. For making video games or movies, this is great. Not so much good&amp;nbsp; for modeling how a real animal would sound (could try it I guess, the physics don't change) &lt;br /&gt;&lt;br /&gt;I bet somebody is doing a thesis on this.&lt;br /&gt;&lt;br /&gt;-Z&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4044374934526922505-7689390761245986042?l=imaginaryz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://imaginaryz.blogspot.com/feeds/7689390761245986042/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4044374934526922505&amp;postID=7689390761245986042&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/7689390761245986042'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/7689390761245986042'/><link rel='alternate' type='text/html' href='http://imaginaryz.blogspot.com/2011/11/audio-synthesis-from-2d-wave-simulation.html' title='Audio Synthesis from 2D Wave Simulation for Organic Noise Generation'/><author><name>Imaginary Z</name><uri>http://www.blogger.com/profile/05059116260376007206</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_O5BsOfO48b0/R1n4E03veuI/AAAAAAAAAAc/p0Q4WRLzwj0/S220/GargHead.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-jNpVl5VXSDg/TryUdKJNpwI/AAAAAAAAANA/q0J5aSRoS_c/s72-c/MonsterWaveTest.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4044374934526922505.post-8694093548836036388</id><published>2011-05-22T19:21:00.003-05:00</published><updated>2011-05-22T19:56:02.868-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='3dfractal'/><title type='text'>3D Fractals</title><content type='html'>&lt;a href="http://www.youtube.com/user/xlace"&gt;http://www.youtube.com/user/xlace&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.youtube.com/user/bib993"&gt;http://www.youtube.com/user/bib993&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.fractalforums.com/"&gt;http://www.fractalforums.com/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;iframe allowfullscreen="" frameborder="0" height="349" src="http://www.youtube.com/embed/AgdN5yO39UI" width="560"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;3D fractals are pretty intimidating. If you don't like this kind of thing, smoke some before you watch it.&lt;br /&gt;&lt;br /&gt;Hell, view some in realtime with WebGL: http://fractal.io/&lt;br /&gt;Or make your own: http://www.fractalforums.com/ -&amp;gt; downloads &lt;br /&gt;&lt;br /&gt;I made my own, now to explore/video it:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-TYc20zzSaNs/TdmrXBi00SI/AAAAAAAAAMM/T2ieDlodC0U/s1600/BinaryWorldsForever.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="300" src="http://4.bp.blogspot.com/-TYc20zzSaNs/TdmrXBi00SI/AAAAAAAAAMM/T2ieDlodC0U/s400/BinaryWorldsForever.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Mandelbulb3Dv1697n:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;Mandelbulb3Dv16{&lt;br /&gt;O.....Y/...g2...w....26...EJg46XGin..vJShBjn89.k0M/cLoxG1.gEVm30U7O..3gX6fCIlA.k&lt;br /&gt;................................Cr5ZfPIy602........Y./..................y.2.....&lt;br /&gt;................/M.0/....6Eg1...a4....E2.....YxFZmNi/kfD/..........c./...w1.OaNa&lt;br /&gt;z.UaNadD1E..0..........wz........................................y1...sD...../..&lt;br /&gt;.w1...sDKF9UsFVALu17DWNplc8iyYH2DGggRTej9M9tJY2hcuXQvXRVF4FcyktgZtmSYSfDR/hyWOGR&lt;br /&gt;su1nN6r/023dyeKwHkets6ej......oQ3.....................sD..kz....................&lt;br /&gt;..............................M6S4.4WsN.k8Wb/Uo6S4.sXsN.sFWb/.F7S4..............&lt;br /&gt;.....................wzzz1.U..6.P....M4...EB....W....61....F....8/...I1....UJl22&lt;br /&gt;...U.iVFwxDE./ozPM2Tzz7lz16.mc..zXCc.El18XGQeGyDjvIRhrVAkz1............28.kFrA0.&lt;br /&gt;FWb96aAIVzvh1se7Umvxz0........../6U0.wzzz1................................E.0c..&lt;br /&gt;zzzz.................................2U.8.kzzzD.................................&lt;br /&gt;/6U0.wzzz1...................................2CcN/UvNP6.eeWCNq0.yRii.EJJUk1f..XR&lt;br /&gt;S1.mx3CcN/UvNP6.QsLsUa3.ibhV..bTV1OK.sSq40.ly3CcN/UvNP6.MwLsUa3.ibhV.kqTV1OK.sSq&lt;br /&gt;40.kz3CcN/UvNP6...EsUa3.eeWCNq0.IJ36wk8.wyLsUa3.................................&lt;br /&gt;E....A....E.....I....6....kL/pKMuZaPb7oPs/UQ..........................k/......U.&lt;br /&gt;0..................../........zD...................0./........zDaNaNaNaNKz1.....&lt;br /&gt;..cF.1.......E0E........kz1.....................................................&lt;br /&gt;.....................2.....3....8....woMo34OZFaQjtKG4B3.........................&lt;br /&gt;.....MU/4MU/4..................E........kz1........wz.........zD................&lt;br /&gt;.......................UK/2.......cJ./.......O3E................................&lt;br /&gt;................................/....E/...E.....GZKNh3aPi/ERg74.................&lt;br /&gt;........................................U.2.............................kz1.....&lt;br /&gt;................................................................................&lt;br /&gt;............................................}&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4044374934526922505-8694093548836036388?l=imaginaryz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://imaginaryz.blogspot.com/feeds/8694093548836036388/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4044374934526922505&amp;postID=8694093548836036388&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/8694093548836036388'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/8694093548836036388'/><link rel='alternate' type='text/html' href='http://imaginaryz.blogspot.com/2011/05/3d-fractals.html' title='3D Fractals'/><author><name>Imaginary Z</name><uri>http://www.blogger.com/profile/05059116260376007206</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_O5BsOfO48b0/R1n4E03veuI/AAAAAAAAAAc/p0Q4WRLzwj0/S220/GargHead.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://img.youtube.com/vi/AgdN5yO39UI/default.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4044374934526922505.post-7727259780109511457</id><published>2011-04-27T19:28:00.000-05:00</published><updated>2011-04-27T19:28:39.768-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='webgl'/><category scheme='http://www.blogger.com/atom/ns#' term='blender'/><title type='text'>WebGL - TED Setups</title><content type='html'>&lt;a href="http://www.gocaco.com/webgl/test1/index.html"&gt;Try it now!&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Current test as a local zip:&lt;br /&gt;&lt;a href="http://www.gocaco.com/webgl/test1/Test.zip"&gt;http://www.gocaco.com/webgl/test1/Test.zip&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Current TED exporter:&lt;br /&gt;&lt;a href="http://www.gocaco.com/webgl/igtl_export_ted.py"&gt;http://www.gocaco.com/webgl/igtl_export_ted.py&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Added some bugfixes for animations;&lt;br /&gt;Added the ability to configure "setups" which can assign positions, rotations, animations to objects in a scene.&lt;br /&gt;&lt;br /&gt;Eventually, I'll replace this system with more game-level functionality, as well as update the method data is loaded in favor of "precompiled" models with external texture references. It will take a while to get a Blender 2.57 exporter for this; but I'll keep trying.&lt;br /&gt;&lt;br /&gt;First project I need to try is a robotron clone since it doesn't require advanced collisions.&lt;br /&gt;&lt;br /&gt;Here is an example use (Farina II rough level), you can correct file export errors with a setup for proper viewing/interacting. &lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-_P6K1JMiiDc/Tbiz-Jvo76I/AAAAAAAAAMI/wmb0iC_DMGU/s1600/WebGL_TEDimport8.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="180" src="http://4.bp.blogspot.com/-_P6K1JMiiDc/Tbiz-Jvo76I/AAAAAAAAAMI/wmb0iC_DMGU/s320/WebGL_TEDimport8.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&amp;nbsp;However, it is obvious the terrain shader was not loaded because it isn't exported yet; Nor is the glowing gem in the cage. These are serious problems with the pipeline of data exported from blender, but are fixable. The only question is whether to focus on 2.57b+ or 2.49b-. I'll probably stick with 2.5X.&lt;br /&gt;&lt;br /&gt;-Z&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4044374934526922505-7727259780109511457?l=imaginaryz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://imaginaryz.blogspot.com/feeds/7727259780109511457/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4044374934526922505&amp;postID=7727259780109511457&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/7727259780109511457'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/7727259780109511457'/><link rel='alternate' type='text/html' href='http://imaginaryz.blogspot.com/2011/04/webgl-ted-setups.html' title='WebGL - TED Setups'/><author><name>Imaginary Z</name><uri>http://www.blogger.com/profile/05059116260376007206</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_O5BsOfO48b0/R1n4E03veuI/AAAAAAAAAAc/p0Q4WRLzwj0/S220/GargHead.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-_P6K1JMiiDc/Tbiz-Jvo76I/AAAAAAAAAMI/wmb0iC_DMGU/s72-c/WebGL_TEDimport8.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4044374934526922505.post-6526040537069369293</id><published>2011-04-22T17:52:00.000-05:00</published><updated>2011-04-22T17:52:02.571-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='statistics'/><category scheme='http://www.blogger.com/atom/ns#' term='code'/><category scheme='http://www.blogger.com/atom/ns#' term='algorithm'/><category scheme='http://www.blogger.com/atom/ns#' term='math'/><title type='text'>Least squares fit a sphere to 3D data</title><content type='html'>I didn't find this online anywhere, and I had some data I needed a least squares fit with a sphere for.&lt;br /&gt;&lt;br /&gt;All you have to do is define:&lt;br /&gt;&lt;br /&gt;Error = Sum( |Position[n] - Center|^2 - Radius^2 )&lt;br /&gt;&lt;br /&gt;Then define the squared error:&lt;br /&gt;&lt;br /&gt;Squared Error = Sum( ( |Position[n] - Center|^2 - Radius^2 )^2 )&lt;br /&gt;&lt;br /&gt;And solve the summation using a iterative method (like newtons, below) after pulling out the summation terms. &lt;br /&gt;For example, if you do: Sum( (P.x[n] - Cx)^2 ) You get (after Expand):&lt;br /&gt;Sum( P.x[n]^2 - 2*P.x[n]*Cx + Cx^2 )&lt;br /&gt;And you can then split up the sum:&lt;br /&gt;Sum( P.x[n]^2 ) + Sum( P.x[n] ) * -2*Cx + Cx * Nelements&lt;br /&gt;Note you HAVE to ultimately divide the sums by Nelements&lt;br /&gt;&lt;br /&gt;Note that "Center" is A,B,C (3D) and I use Rsq as Radius^2.&lt;br /&gt;&lt;br /&gt;This method is not fast, but it converges, and the way the code is written it is independent of dataset size, but you do have to compute a number of sums and products before running the algorithm.&lt;br /&gt;&lt;br /&gt;Note this method is used to generate the equations used to compute linear and quadratic fits instantly, given you compute some sums first. I suppose it can be extended to any shape with enough working the mathematics. The next shapes are planes, capsules, maybe torii.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;//&lt;br /&gt;//Least Squares Fit a sphere A,B,C with radius squared Rsq to 3D data&lt;br /&gt;//&lt;br /&gt;//&amp;nbsp;&amp;nbsp;&amp;nbsp; P is a structure that has been computed with the data earlier.&lt;br /&gt;//&amp;nbsp;&amp;nbsp;&amp;nbsp; P.npoints is the number of elements; the length of X,Y,Z are identical.&lt;br /&gt;//&amp;nbsp;&amp;nbsp;&amp;nbsp; P's members are logically named.&lt;br /&gt;//&lt;br /&gt;//&amp;nbsp;&amp;nbsp;&amp;nbsp; X[n] is the x component of point n&lt;br /&gt;//&amp;nbsp;&amp;nbsp;&amp;nbsp; Y[n] is the y component of point n&lt;br /&gt;//&amp;nbsp;&amp;nbsp;&amp;nbsp; Z[n] is the z component of point n&lt;br /&gt;//&lt;br /&gt;//&amp;nbsp;&amp;nbsp;&amp;nbsp; A is the x coordiante of the sphere&lt;br /&gt;//&amp;nbsp;&amp;nbsp;&amp;nbsp; B is the y coordiante of the sphere&lt;br /&gt;//&amp;nbsp;&amp;nbsp;&amp;nbsp; C is the z coordiante of the sphere&lt;br /&gt;//&amp;nbsp;&amp;nbsp;&amp;nbsp; Rsq is the radius squared of the sphere.&lt;br /&gt;//&lt;br /&gt;//This method should converge; maybe 5-100 iterations or more.&lt;br /&gt;//&lt;br /&gt;double Xn = P.Xsum/P.npoints;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; //sum( X[n] )&lt;br /&gt;double Xn2 = P.Xsumsq/P.npoints;&amp;nbsp;&amp;nbsp;&amp;nbsp; //sum( X[n]^2 )&lt;br /&gt;double Xn3 = P.Xsumcube/P.npoints;&amp;nbsp;&amp;nbsp;&amp;nbsp; //sum( X[n]^3 )&lt;br /&gt;double Yn = P.Ysum/P.npoints;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; //sum( Y[n] )&lt;br /&gt;double Yn2 = P.Ysumsq/P.npoints;&amp;nbsp;&amp;nbsp;&amp;nbsp; //sum( Y[n]^2 )&lt;br /&gt;double Yn3 = P.Ysumcube/P.npoints;&amp;nbsp;&amp;nbsp;&amp;nbsp; //sum( Y[n]^3 )&lt;br /&gt;double Zn = P.Zsum/P.npoints;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; //sum( Z[n] )&lt;br /&gt;double Zn2 = P.Zsumsq/P.npoints;&amp;nbsp;&amp;nbsp;&amp;nbsp; //sum( Z[n]^2 )&lt;br /&gt;double Zn3 = P.Zsumcube/P.npoints;&amp;nbsp;&amp;nbsp;&amp;nbsp; //sum( Z[n]^3 )&lt;br /&gt;&lt;br /&gt;double XY = P.XYsum/P.npoints;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; //sum( X[n] * Y[n] )&lt;br /&gt;double XZ = P.XZsum/P.npoints;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; //sum( X[n] * Z[n] )&lt;br /&gt;double YZ = P.YZsum/P.npoints;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; //sum( Y[n] * Z[n] )&lt;br /&gt;double X2Y = P.X2Ysum/P.npoints;&amp;nbsp;&amp;nbsp;&amp;nbsp; //sum( X[n]^2 * Y[n] )&lt;br /&gt;double X2Z = P.X2Zsum/P.npoints;&amp;nbsp;&amp;nbsp;&amp;nbsp; //sum( X[n]^2 * Z[n] )&lt;br /&gt;double Y2X = P.Y2Xsum/P.npoints;&amp;nbsp;&amp;nbsp;&amp;nbsp; //sum( Y[n]^2 * X[n] )&lt;br /&gt;double Y2Z = P.Y2Zsum/P.npoints;&amp;nbsp;&amp;nbsp;&amp;nbsp; //sum( Y[n]^2 * Z[n] )&lt;br /&gt;double Z2X = P.Z2Xsum/P.npoints;&amp;nbsp;&amp;nbsp;&amp;nbsp; //sum( Z[n]^2 * X[n] )&lt;br /&gt;double Z2Y = P.Z2Ysum/P.npoints;&amp;nbsp;&amp;nbsp;&amp;nbsp; //sum( Z[n]^2 * Y[n] )&lt;br /&gt;&lt;br /&gt;//Reduction of multiplications&lt;br /&gt;double F0 = Xn2 + Yn2 + Zn2;&lt;br /&gt;double F1 = 0.5*F0;&lt;br /&gt;double F2 = -8.0*(Xn3 + Y2X + Z2X);&lt;br /&gt;double F3 = -8.0*(X2Y + Yn3 + Z2Y);&lt;br /&gt;double F4 = -8.0*(X2Z + Y2Z + Zn3);&lt;br /&gt;&lt;br /&gt;//Set initial conditions:&lt;br /&gt;A = Xn;&lt;br /&gt;B = Yn;&lt;br /&gt;C = Zn;&lt;br /&gt;&lt;br /&gt;//First iteration computation:&lt;br /&gt;double A2 = A*A;&lt;br /&gt;double B2 = B*B;&lt;br /&gt;double C2 = C*C;&lt;br /&gt;double QS = A2 + B2 + C2;&lt;br /&gt;double QB = - 2*(A*Xn + B*Yn + C*Zn);&lt;br /&gt;&lt;br /&gt;//Set initial conditions:&lt;br /&gt;Rsq = F0 + QB + QS;&lt;br /&gt;&lt;br /&gt;//First iteration computation:&lt;br /&gt;double Q0 = 0.5*(QS - Rsq);&lt;br /&gt;double Q1 = F1 + Q0;&lt;br /&gt;double Q2 = 8*( QS - Rsq + QB + F0 );&lt;br /&gt;double aA,aB,aC,nA,nB,nC,dA,dB,dC;&lt;br /&gt;&lt;br /&gt;//Iterate N times, ignore stop condition.&lt;br /&gt;int n = 0;&lt;br /&gt;while( n != N ){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; n++;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //Compute denominator:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; aA = Q2 + 16*(A2 - 2*A*Xn + Xn2);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; aB = Q2 + 16*(B2 - 2*B*Yn + Yn2);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; aC = Q2 + 16*(C2 - 2*C*Zn + Zn2);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; aA = (aA == 0) ? 1.0 : aA;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; aB = (aB == 0) ? 1.0 : aB;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; aC = (aC == 0) ? 1.0 : aC;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //Compute next iteration&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; nA = A - ((F2 + 16*( B*XY + C*XZ + Xn*(-A2 - Q0) + A*(Xn2 + Q1 - C*Zn - B*Yn) ) )/aA);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; nB = B - ((F3 + 16*( A*XY + C*YZ + Yn*(-B2 - Q0) + B*(Yn2 + Q1 - A*Xn - C*Zn) ) )/aB);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; nC = C - ((F4 + 16*( A*XZ + B*YZ + Zn*(-C2 - Q0) + C*(Zn2 + Q1 - A*Xn - B*Yn) ) )/aC);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //Check for stop condition&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; dA = (nA - A);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; dB = (nB - B);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; dC = (nC - C);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if( (dA*dA + dB*dB + dC*dC) &amp;lt;= Nstop ){ break; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //Compute next iteration's values&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; A = nA;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; B = nB;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; C = nC;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; A2 = A*A;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; B2 = B*B;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; C2 = C*C;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; QS = A2 + B2 + C2;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; QB = - 2*(A*Xn + B*Yn + C*Zn);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Rsq = F0 + QB + QS;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Q0 = 0.5*(QS - Rsq);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Q1 = F1 + Q0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Q2 = 8*( QS - Rsq + QB + F0 );&lt;br /&gt;}&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4044374934526922505-6526040537069369293?l=imaginaryz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://imaginaryz.blogspot.com/feeds/6526040537069369293/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4044374934526922505&amp;postID=6526040537069369293&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/6526040537069369293'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/6526040537069369293'/><link rel='alternate' type='text/html' href='http://imaginaryz.blogspot.com/2011/04/least-squares-fit-sphere-to-3d-data.html' title='Least squares fit a sphere to 3D data'/><author><name>Imaginary Z</name><uri>http://www.blogger.com/profile/05059116260376007206</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_O5BsOfO48b0/R1n4E03veuI/AAAAAAAAAAc/p0Q4WRLzwj0/S220/GargHead.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4044374934526922505.post-4661073140427352295</id><published>2011-04-16T23:42:00.002-05:00</published><updated>2011-04-16T23:52:30.176-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='webgl'/><title type='text'>WebGL - Preview local TED files</title><content type='html'>&lt;a href="http://www.gocaco.com/webgl/test1/index.html"&gt;Try it now!&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Current test as a local zip: &lt;br /&gt;&lt;a href="http://www.gocaco.com/webgl/test1/Test.zip"&gt;http://www.gocaco.com/webgl/test1/Test.zip&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Current TED exporter:&lt;br /&gt;&lt;a href="http://www.gocaco.com/webgl/igtl_export_ted.py"&gt;http://www.gocaco.com/webgl/igtl_export_ted.py&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;If you have any local files, you can now browse for and load them.&lt;br /&gt;You can also drag them over into the 3D area, and it will load them automagically.&lt;br /&gt;&lt;br /&gt;Some interesting notes about this.&lt;br /&gt;&lt;br /&gt;Security wise, I would rather have a notification come up if a javascript script was attempting to "read" any local files. I DO want this to occur, but let me either block ALL of them, or choose as they are requested to be loaded.Firefox understands this, but I cannot find it's setting to make it warn you when a script reads a local file. Apparently the act of dragging and dropping or using the file open dialog is confirmation enough, and that's OK.&lt;br /&gt;&lt;br /&gt;Chrome however, is dumb, and will not read any local files unless you add the additional command like switch "--allow-file-access-from-files" switch to it. DO NOT DO THIS if you are online, only do this while developing or playing locally. Because chrome is kinda insecure like that, might as well not use it until they fix this extremely annoying bug. &lt;a href="http://www.chromium.org/Home"&gt;Get Chromium instead.&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size: xx-small;"&gt;Examples of chrome stupidness: "There is nothing Gmail can do to defend itself from this attack." "In the future, we hope to further restrict the privileges of local web pages." "Ultimately, we'd like to see all the browser vendors converge on a uniform, secure policy for local web pages."&amp;nbsp; Seriously? Are these dumbassess tripping? Give us control of some of those flags, and then configure the flags to make your "security" work. Don't generalize and call that good, that's what mac does and why it is so much fail. Give control to advanced uses, set the defaults for your pseudosecurity model, everyone wins. Like firefox.&lt;/span&gt; &lt;br /&gt;&lt;br /&gt;The option for "Only allow local access with user permission" would be nice, and it could pop up a modal dialogue with timing/input security. Not failproof (did you know you can write code to make fake human input? lol ur h4xed), but it's better than a blanket policy.&lt;br /&gt;&lt;br /&gt;An old BomberFan level, made for BGE. Since it was an old blender, blender materials were ignored in favor of face textures, which is why nothing looks right. &lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-YiIHH5-5Ucc/TapvYIBJbcI/AAAAAAAAAME/jdSqup3vyQM/s1600/WebGL_TEDimport7.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="184" src="http://3.bp.blogspot.com/-YiIHH5-5Ucc/TapvYIBJbcI/AAAAAAAAAME/jdSqup3vyQM/s320/WebGL_TEDimport7.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;-Z&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4044374934526922505-4661073140427352295?l=imaginaryz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://imaginaryz.blogspot.com/feeds/4661073140427352295/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4044374934526922505&amp;postID=4661073140427352295&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/4661073140427352295'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/4661073140427352295'/><link rel='alternate' type='text/html' href='http://imaginaryz.blogspot.com/2011/04/webgl-preview-local-ted-files.html' title='WebGL - Preview local TED files'/><author><name>Imaginary Z</name><uri>http://www.blogger.com/profile/05059116260376007206</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_O5BsOfO48b0/R1n4E03veuI/AAAAAAAAAAc/p0Q4WRLzwj0/S220/GargHead.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-YiIHH5-5Ucc/TapvYIBJbcI/AAAAAAAAAME/jdSqup3vyQM/s72-c/WebGL_TEDimport7.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4044374934526922505.post-2515814833894897050</id><published>2011-04-11T21:53:00.000-05:00</published><updated>2011-04-11T21:53:50.523-05:00</updated><title type='text'>WebGL - I hate chrome</title><content type='html'>Try out webgl: (you should click the "load" button, and see "Blender", a blue sphere, a red pyramid, in a room.)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.gocaco.com/webgl/test1/index.html"&gt;Try it now!&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Current test as a local zip:&amp;nbsp; &lt;br /&gt;&lt;a href="http://www.gocaco.com/webgl/test1/Test.zip"&gt;http://www.gocaco.com/webgl/test1/Test.zip&lt;/a&gt;&lt;br /&gt;Current TED exporter: &lt;br /&gt;&lt;a href="http://www.gocaco.com/webgl/igtl_export_ted.py"&gt;http://www.gocaco.com/webgl/igtl_export_ted.py&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I attempted to test it on Chrome, and after instantly hating chrome, which is severely lacking in features, performance, and stability (as advertised. huh.); It's also missing most all my usual tools that are cleanly implemented in firefox. Chrome is no competition, minus it's nifty threading of scripts. Seems like good ole' google is becoming exactly like microsoft, pointing to the ultimate downfall of all software based empires. It's simply evolutionary that we continually kill off good products with lawsuits, antitrust and other money sucking schemes which hurts everyone because they then have to side with more evil tactics (like online installation, automatic updates, spyware, ads, ect...) just to survive. So long as money is required for software, this will occur.&lt;br /&gt;&lt;br /&gt;Anyways, to get chrome to even work, I had to add these three lines to the command console, which I highly recommend NOT adding the last one, the "--allow-file-access-from-files" because that one should only be true for offline files.&lt;br /&gt;&lt;br /&gt;"--ignore-gpu-blacklist  --enable-webgl --allow-file-access-from-files"&lt;br /&gt;&lt;br /&gt;&amp;nbsp;Interesting note, firefox understands that a local file has a local domain of "./" and can pull things from it. It has no problem. Chrome says this is a cross domain error, when it clearly pulled the file from "./" and then decides it's cross domain because it has a "file://" prefix? No sense there. How about asking me you stupid %@(&amp;amp; browser? And I'll say "get as pure text only." and I'll force a MIME type of text/xml. Then everyone wins right?&lt;br /&gt;&lt;br /&gt;Ugh. whatever. Fuck chrome. Though, I suppose &lt;a href="http://imaginaryz.blogspot.com/2011/03/webgl-yes.html"&gt;getting firefox to use webgl&lt;/a&gt; is hard too.&lt;br /&gt;&lt;br /&gt;-Z&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4044374934526922505-2515814833894897050?l=imaginaryz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://imaginaryz.blogspot.com/feeds/2515814833894897050/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4044374934526922505&amp;postID=2515814833894897050&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/2515814833894897050'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/2515814833894897050'/><link rel='alternate' type='text/html' href='http://imaginaryz.blogspot.com/2011/04/webgl-i-hate-chrome.html' title='WebGL - I hate chrome'/><author><name>Imaginary Z</name><uri>http://www.blogger.com/profile/05059116260376007206</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_O5BsOfO48b0/R1n4E03veuI/AAAAAAAAAAc/p0Q4WRLzwj0/S220/GargHead.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4044374934526922505.post-2088798100433338292</id><published>2011-04-10T20:10:00.002-05:00</published><updated>2011-04-11T13:38:47.903-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='webgl'/><category scheme='http://www.blogger.com/atom/ns#' term='shaders'/><category scheme='http://www.blogger.com/atom/ns#' term='TED'/><category scheme='http://www.blogger.com/atom/ns#' term='GLSL'/><category scheme='http://www.blogger.com/atom/ns#' term='opengl'/><title type='text'>WebGL - TED DXML importer animation test</title><content type='html'>Animations and animation playback added. Posing is better, glitch with animation frame fixed, Objects retain independent armature state, small speedup.&lt;br /&gt;&lt;br /&gt;Current Test:&lt;br /&gt;&lt;a href="http://www.gocaco.com/webgl/test1/index.html"&gt;Test it right now!&lt;/a&gt;&lt;br&gt;&lt;br /&gt;&lt;a href="http://www.gocaco.com/webgl/test1/Test.zip"&gt;http://www.gocaco.com/webgl/test1/Test.zip&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Current Exporter:&lt;br /&gt;&lt;a href="http://www.gocaco.com/webgl/igtl_export_ted.py"&gt;http://www.gocaco.com/webgl/igtl_export_ted.py&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;This pretty much has everything that's in a TED file, which, for your reference, contains:&lt;br /&gt;&lt;br /&gt;Mesh data (coords, texcoords, normals, tangents, matrix palette weights, colors, params)&lt;br /&gt;Textures (including texture data if you want)&lt;br /&gt;Materials (some parameters, illy defined for now.)&lt;br /&gt;Armatures (Includes bones, IK chains, armature splines, lots of data)&lt;br /&gt;Animations (Includes channel blending animations, so channels are seperate and integrated. Includes scripts.)&lt;br /&gt;Scenes (all objects and their properties)&lt;br /&gt;&lt;br /&gt;Though there are still more things, this is the basics to get started cleaning this mess up and making it easier to work with. I don;t need the BGE if I can load this stuff into WebGL. That's what's really nice.&lt;br /&gt;&lt;br /&gt;Although, it has some really painful disadvantages, mainly input problems, no joystick support, bad keyboard input events, no locking the mouse so no FPS possible... and so on.&lt;br /&gt;&lt;br /&gt;Here's 9 marios independently running (bad running animation, I know. took me a minute ok??)&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-WMVsw1O28D0/TaJUUQaEbjI/AAAAAAAAAMA/E7tmw3OQmLo/s1600/WebGL_TEDimport6.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="228" src="http://3.bp.blogspot.com/-WMVsw1O28D0/TaJUUQaEbjI/AAAAAAAAAMA/E7tmw3OQmLo/s320/WebGL_TEDimport6.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;And 25 marios...&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-1LaYGHO-kcY/TaJUUChhDdI/AAAAAAAAAL8/caLQrCSBZ3E/s1600/WebGL_TEDimport6_1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="228" src="http://2.bp.blogspot.com/-1LaYGHO-kcY/TaJUUChhDdI/AAAAAAAAAL8/caLQrCSBZ3E/s320/WebGL_TEDimport6_1.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Most of the speed is CPU &amp;lt;-&amp;gt; GPU delays. Just remember that 1 gpu "talk" takes 6~100's of CPU cycles because of the bus communication. So, this is a "absolute worse case" naive way to do this, and I still get 15 FPS with 100k fully shaded armatured polygons. As a side note, an average frame of Oblivion as ~200k polygons, but most all of them were static (75% static to 25% dynamic).&lt;br /&gt;&lt;br /&gt;-Z&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4044374934526922505-2088798100433338292?l=imaginaryz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://imaginaryz.blogspot.com/feeds/2088798100433338292/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4044374934526922505&amp;postID=2088798100433338292&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/2088798100433338292'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/2088798100433338292'/><link rel='alternate' type='text/html' href='http://imaginaryz.blogspot.com/2011/04/webgl-ted-dxml-importer-animation-test.html' title='WebGL - TED DXML importer animation test'/><author><name>Imaginary Z</name><uri>http://www.blogger.com/profile/05059116260376007206</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_O5BsOfO48b0/R1n4E03veuI/AAAAAAAAAAc/p0Q4WRLzwj0/S220/GargHead.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-WMVsw1O28D0/TaJUUQaEbjI/AAAAAAAAAMA/E7tmw3OQmLo/s72-c/WebGL_TEDimport6.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4044374934526922505.post-4235989579601256696</id><published>2011-04-08T23:11:00.001-05:00</published><updated>2011-04-09T00:09:03.209-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='webgl'/><title type='text'>WebGL - TED DXML importer with armatures; animations needed</title><content type='html'>Yet another update. Now you can mess with the bones of whatever you imported, albeit unoptimized and rather slow, in comparison to the identical C++ program.&lt;br /&gt;&lt;br /&gt;Current Test:&lt;br /&gt;&lt;a href="http://www.gocaco.com/webgl/test1/Test.zip"&gt;http://www.gocaco.com/webgl/test1/Test.zip&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Current Exporter:&lt;br /&gt;&lt;a href="http://www.gocaco.com/webgl/igtl_export_ted.py"&gt;http://www.gocaco.com/webgl/igtl_export_ted.py&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Next up is probably cleaning or testing animations. It is obvious that speed optimization is needed badly, but the math does not really change much; Javascript seems to be missing access to SSE type data. As well as mouse input not based on pixels, and joysticks, and a audio API, ect...&lt;br /&gt;&lt;br /&gt;In a less complete sense, I modified the matrix conversion function to be smaller; though it's not computationally faster. The object with matrix animation/ armature animation is as follows:&lt;br /&gt;&lt;br /&gt;Parent Armature Space Matrix * Default From Parent Matrix * Current Local Transform = Current Armature Space Matrix&lt;br /&gt;&lt;br /&gt;Parent Armature Space Matrix =&amp;gt; The transform of the parent, as calculated with current animation data.&lt;br /&gt;Default From Parent Matrix =&amp;gt; Upon loading an armature, calculate this by Parent^-1 * Current. This represents the initial rotational and positional offset from the initial bone positions to eachother, which allows your animation local data to be relative to that starting point.&lt;br /&gt;Current Local Transform =&amp;gt; The offsets, like position, rotation, scale. Depending on how you want to apply scale this can be tricky.&lt;br /&gt;Current Armature Space Matrix =&amp;gt; The final transformed position; send t his to the 'convertforshader' algorithm.&lt;br /&gt;&lt;br /&gt;And, in effect, animating is only changing the set of local deformations over time, and possibly adjusting them with things like IK or mouselooks. And all that is best done with SSE operators.&lt;br /&gt;&lt;br /&gt;I bent up this &lt;a href="http://metroid.wikia.com/wiki/Ghalmanian"&gt;Chameleon Boss from Metroid: Other M&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-pGnIiRr-nmw/TZ_pdj2EgII/AAAAAAAAAL4/EXZ4JLP39gk/s1600/WebGL_TEDimport5_1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="239" src="http://2.bp.blogspot.com/-pGnIiRr-nmw/TZ_pdj2EgII/AAAAAAAAAL4/EXZ4JLP39gk/s320/WebGL_TEDimport5_1.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;-Z&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4044374934526922505-4235989579601256696?l=imaginaryz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://imaginaryz.blogspot.com/feeds/4235989579601256696/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4044374934526922505&amp;postID=4235989579601256696&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/4235989579601256696'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/4235989579601256696'/><link rel='alternate' type='text/html' href='http://imaginaryz.blogspot.com/2011/04/webgl-ted-dxml-importer-with-armatures.html' title='WebGL - TED DXML importer with armatures; animations needed'/><author><name>Imaginary Z</name><uri>http://www.blogger.com/profile/05059116260376007206</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_O5BsOfO48b0/R1n4E03veuI/AAAAAAAAAAc/p0Q4WRLzwj0/S220/GargHead.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-pGnIiRr-nmw/TZ_pdj2EgII/AAAAAAAAAL4/EXZ4JLP39gk/s72-c/WebGL_TEDimport5_1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4044374934526922505.post-3717515845042729799</id><published>2011-04-07T23:32:00.002-05:00</published><updated>2011-04-07T23:41:26.542-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='webgl'/><category scheme='http://www.blogger.com/atom/ns#' term='shaders'/><category scheme='http://www.blogger.com/atom/ns#' term='GLSL'/><title type='text'>WebGL - TED DXML importer bones work; needs animations</title><content type='html'>I got the bones working using some prior work from xcore/mingl.&lt;br /&gt;Unfortunately, it's difficult to show this without a logically consistent animation; However, if you play with the matrix values you can see it works perfectly.&lt;br /&gt;&lt;br /&gt;Current Test:&lt;br /&gt;&lt;a href="http://www.gocaco.com/webgl/test1/Test.zip"&gt;http://www.gocaco.com/webgl/test1/Test.zip&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Current Exporter:&lt;br /&gt;&lt;a href="http://www.gocaco.com/webgl/igtl_export_ted.py"&gt;http://www.gocaco.com/webgl/igtl_export_ted.py&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;You probably have wondered how skinning works; Skinning is a procedure where static mesh data is deformed by adjusting the position, rotation, and scale of a transformation matrix. Usually these transform matrices are 4x4 matrices, but 3x4 work just as well.&lt;br /&gt;To achieve a less blocky look, you can apply two or more different matrices to the same vertex; which results in a blending of the motion, controlling the weight of each blend is an art in and of itself. It can take many hours of time to get weights that work for a particular task, elbows and other sharply bending joints being key offenders.&lt;br /&gt;&lt;br /&gt;Here is the current unoptimized method I use for matrix palette skinning:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;br /&gt;//This procedure works for any input matrix, and converts it for shader use.&lt;br /&gt;var stupid = mat4.create(); //Replace stupid with your armature-space bone matrix.&lt;br /&gt;&lt;br /&gt;//Normally, stupid has translate * scale and rotation applied, and scale is applied last.&lt;br /&gt;//You can pass in any matrix you like, just be aware how your modeling program transforms.&lt;br /&gt;&lt;br /&gt;//Create some space&lt;br /&gt;sseB = new Float32Array(16);&lt;br /&gt;sseM = new Float32Array(16);&lt;br /&gt;resM = new Float32Array(16);&lt;br /&gt;&lt;br /&gt;//Local armaturespace matrix transposed:&lt;br /&gt;sseB[0] = stupid[0];&lt;br /&gt;sseB[1] = stupid[4];&lt;br /&gt;sseB[2] = stupid[8];&lt;br /&gt;sseB[3] = stupid[1];&lt;br /&gt;sseB[4] = stupid[5];&lt;br /&gt;sseB[5] = stupid[9];&lt;br /&gt;sseB[6] = stupid[2];&lt;br /&gt;sseB[7] = stupid[6];&lt;br /&gt;sseB[8] = stupid[10];&lt;br /&gt;&lt;br /&gt;//Original armaturespace matrix transposed:&lt;br /&gt;sseM[0] = BAOrigMatrix[0];&lt;br /&gt;sseM[1] = BAOrigMatrix[3];&lt;br /&gt;sseM[2] = BAOrigMatrix[6];&lt;br /&gt;sseM[3] = BAOrigMatrix[1];&lt;br /&gt;sseM[4] = BAOrigMatrix[4];&lt;br /&gt;sseM[5] = BAOrigMatrix[7];&lt;br /&gt;sseM[6] = BAOrigMatrix[2];&lt;br /&gt;sseM[7] = BAOrigMatrix[5];&lt;br /&gt;sseM[8] = BAOrigMatrix[8];&lt;br /&gt;&lt;br /&gt;//Multiplication; Transpose result //012 345 678 =&amp;gt; 036 147 258&lt;br /&gt;resM[0] = sseB[0]*sseM[0] + sseB[1]*sseM[1] + sseB[2]*sseM[2];&lt;br /&gt;resM[3] = sseB[0]*sseM[3] + sseB[1]*sseM[4] + sseB[2]*sseM[5];&lt;br /&gt;resM[6] = sseB[0]*sseM[6] + sseB[1]*sseM[7] + sseB[2]*sseM[8];&lt;br /&gt;&lt;br /&gt;resM[1] = sseB[3]*sseM[0] + sseB[4]*sseM[1] + sseB[5]*sseM[2];&lt;br /&gt;resM[4] = sseB[3]*sseM[3] + sseB[4]*sseM[4] + sseB[5]*sseM[5];&lt;br /&gt;resM[7] = sseB[3]*sseM[6] + sseB[4]*sseM[7] + sseB[5]*sseM[8];&lt;br /&gt;&lt;br /&gt;resM[2] = sseB[6]*sseM[0] + sseB[7]*sseM[1] + sseB[8]*sseM[2];&lt;br /&gt;resM[5] = sseB[6]*sseM[3] + sseB[7]*sseM[4] + sseB[8]*sseM[5];&lt;br /&gt;resM[8] = sseB[6]*sseM[6] + sseB[7]*sseM[7] + sseB[8]*sseM[8];&lt;br /&gt;&lt;br /&gt;//Load and transpose it, then multiply by inverse original position&lt;br /&gt;resM[12] = stupid[12] - (resM[0]*BAOrigPosition[0] + resM[3]*BAOrigPosition[1] + resM[6]*BAOrigPosition[2]);&lt;br /&gt;resM[13] = stupid[13] - (resM[1]*BAOrigPosition[0] + resM[4]*BAOrigPosition[1] + resM[7]*BAOrigPosition[2]);&lt;br /&gt;resM[14] = stupid[14] - (resM[2]*BAOrigPosition[0] + resM[5]*BAOrigPosition[1] + resM[8]*BAOrigPosition[2]);&lt;br /&gt;&lt;br /&gt;//Replace myPaletteIndex with the bone index (for the matrix palette) you want to upload to.&lt;br /&gt;//Remember that armature bones are mapped to the matrix palette, which is often small (28 max bones).&lt;br /&gt;var locpos = 3*myPaletteIndex;&lt;br /&gt;&lt;br /&gt;//Get the location of your uniforms&lt;br /&gt;var uploc0 = myshader.pMatrixPaletteUniforms[ locpos ];&lt;br /&gt;var uploc1 = myshader.pMatrixPaletteUniforms[ locpos + 1 ];&lt;br /&gt;var uploc2 = myshader.pMatrixPaletteUniforms[ locpos + 2 ];&lt;br /&gt;&lt;br /&gt;//Upload your converted matrix vec4's:&lt;br /&gt;gl.uniform4fv( uploc0, [resM[0], resM[3], resM[6], resM[12]] );&lt;br /&gt;gl.uniform4fv( uploc1, [resM[1], resM[4], resM[7], resM[13]] );&lt;br /&gt;gl.uniform4fv( uploc2, [resM[2], resM[5], resM[8], resM[14]] );&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;...in your shader, you can now:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;//Input vertex position (model space/armature space initial undeformed)&lt;br /&gt;inpos = vec4( vattribPosition.xyz, 1.0 );&lt;br /&gt;&lt;br /&gt;if( vattribWeights.x &amp;gt; 0.0 ){&lt;br /&gt;//Use index cumulation (because we cannot upload integers); ie: &lt;br /&gt;//&lt;br /&gt;// w0,w1,w2 =&amp;gt; (w0 + 64*w1 + 64*64*w2); floats have perfect 23 bit accuracy for ints.&lt;br /&gt;//&lt;br /&gt;int idex0 = 3*int(mod( vattribWeightIndex.z, 64.0 ));&lt;br /&gt;//Matrix (used?)&lt;br /&gt;rescur.x = vattribWeights.x * dot( inpos, MatrixPalette[ idex0 ] );&lt;br /&gt;rescur.y = vattribWeights.x * dot( inpos, MatrixPalette[ idex0 + 1 ] );&lt;br /&gt;rescur.z = vattribWeights.x * dot( inpos, MatrixPalette[ idex0 + 2 ] );&lt;br /&gt;poscur = rescur;&lt;br /&gt;&lt;br /&gt;if( vattribWeights.y &amp;gt; 0.0 ){&lt;br /&gt;&lt;br /&gt;int idex1 = 3*int(mod( vattribWeightIndex.z/64.0, 64.0 ));&lt;br /&gt;rescur.x = vattribWeights.y * dot( inpos, MatrixPalette[idex1] );&lt;br /&gt;rescur.y = vattribWeights.y * dot( inpos, MatrixPalette[idex1 + 1] );&lt;br /&gt;rescur.z = vattribWeights.y * dot( inpos, MatrixPalette[idex1 + 2] );&lt;br /&gt;poscur += rescur;&lt;br /&gt;&lt;br /&gt;if( vattribWeights.z &amp;gt; 0.0 ){&lt;br /&gt;&lt;br /&gt;int idex2 = 3*int(mod( vattribWeightIndex.z/(4096.0), 64.0 ));&lt;br /&gt;rescur.x = vattribWeights.z * dot( inpos, MatrixPalette[idex2] );&lt;br /&gt;rescur.y = vattribWeights.z * dot( inpos, MatrixPalette[idex2 + 1] );&lt;br /&gt;rescur.z = vattribWeights.z * dot( inpos, MatrixPalette[idex2 + 2] );&lt;br /&gt;poscur += rescur;&lt;br /&gt;&lt;br /&gt;...ect&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//Apply object transform to final position:&lt;br /&gt;gl_Position = uPMatrix * uMVMatrix * vec4(poscur.xyz, 1.0);&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Here's a picture of &lt;a href="http://en.wikipedia.org/wiki/Tomb_Raider:_Anniversary"&gt;Lara&lt;/a&gt;, imported.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-DWtRq6N0zOQ/TZ6PakDIXuI/AAAAAAAAALw/MgBurodKMOo/s1600/WebGL_TEDimport4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="241" src="http://2.bp.blogspot.com/-DWtRq6N0zOQ/TZ6PakDIXuI/AAAAAAAAALw/MgBurodKMOo/s320/WebGL_TEDimport4.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Here's the same &lt;a href="http://monsterhunter.wikia.com/wiki/Gigginox"&gt;Gigginox&lt;/a&gt; from before, with slight wobble applied via matrix palette. Note this is the exact same file, I am just changing the import into javascript. TED files contain a lot of information.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-2jGq8clEAC8/TZ6Rj9DM2fI/AAAAAAAAAL0/_EcDDIPKKNU/s1600/WebGL_TEDimport4_1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="241" src="http://3.bp.blogspot.com/-2jGq8clEAC8/TZ6Rj9DM2fI/AAAAAAAAAL0/_EcDDIPKKNU/s320/WebGL_TEDimport4_1.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Animation data is next.&lt;br /&gt;&lt;br /&gt;-Z&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4044374934526922505-3717515845042729799?l=imaginaryz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://imaginaryz.blogspot.com/feeds/3717515845042729799/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4044374934526922505&amp;postID=3717515845042729799&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/3717515845042729799'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/3717515845042729799'/><link rel='alternate' type='text/html' href='http://imaginaryz.blogspot.com/2011/04/webgl-ted-dxml-importer-bones-work.html' title='WebGL - TED DXML importer bones work; needs animations'/><author><name>Imaginary Z</name><uri>http://www.blogger.com/profile/05059116260376007206</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_O5BsOfO48b0/R1n4E03veuI/AAAAAAAAAAc/p0Q4WRLzwj0/S220/GargHead.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-DWtRq6N0zOQ/TZ6PakDIXuI/AAAAAAAAALw/MgBurodKMOo/s72-c/WebGL_TEDimport4.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4044374934526922505.post-5692664139442155175</id><published>2011-04-07T18:32:00.000-05:00</published><updated>2011-04-07T18:32:19.665-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='webgl'/><title type='text'>WebGL - TED DXML importer preliminary bones</title><content type='html'>Importer reads armature data and assigns armatures to meshes.&lt;br /&gt;&lt;br /&gt;Next step is fixing the matrix palette shader, and the way armature instances are updated so that the animations will play properly.&lt;br /&gt;&lt;br /&gt;Lucky for me I've already done all the hard work in other C/C++ programs, so it's just a port really.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-6kpa7yg_k_Y/TZ5JJxUiK8I/AAAAAAAAALs/G7nuB8e1ecU/s1600/WebGL_TEDimport3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://3.bp.blogspot.com/-6kpa7yg_k_Y/TZ5JJxUiK8I/AAAAAAAAALs/G7nuB8e1ecU/s320/WebGL_TEDimport3.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Just as a note, it is fairly annoying to both apply animations, save the global game transform, then before drawing convert each global transform into shader ready data by a set of matrix multiplications (read matrix palette skinning articles). But it does work, and it'll have to do until I find better solutions.&lt;br /&gt;&lt;br /&gt;Need animations...&lt;br /&gt;&lt;br /&gt;-Z&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4044374934526922505-5692664139442155175?l=imaginaryz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://imaginaryz.blogspot.com/feeds/5692664139442155175/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4044374934526922505&amp;postID=5692664139442155175&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/5692664139442155175'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/5692664139442155175'/><link rel='alternate' type='text/html' href='http://imaginaryz.blogspot.com/2011/04/webgl-ted-dxml-importer-preliminary.html' title='WebGL - TED DXML importer preliminary bones'/><author><name>Imaginary Z</name><uri>http://www.blogger.com/profile/05059116260376007206</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_O5BsOfO48b0/R1n4E03veuI/AAAAAAAAAAc/p0Q4WRLzwj0/S220/GargHead.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-6kpa7yg_k_Y/TZ5JJxUiK8I/AAAAAAAAALs/G7nuB8e1ecU/s72-c/WebGL_TEDimport3.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4044374934526922505.post-5493201313139032597</id><published>2011-04-06T18:11:00.001-05:00</published><updated>2011-04-06T18:11:52.837-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='webgl'/><category scheme='http://www.blogger.com/atom/ns#' term='code'/><title type='text'>WebGL - Convert chars to float</title><content type='html'>&amp;nbsp;All info is derived from:&lt;br /&gt;&lt;a href="http://www.khronos.org/registry/typedarray/specs/latest/"&gt;http://www.khronos.org/registry/typedarray/specs/latest/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The basic problem, is you create a vertex buffer object (VBO) and write vertex data into it, such as vertex position, texture coordinates, normals, and weight and weight index values.&lt;br /&gt;In case you have never used a "matrix palette" the basic idea is:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Construct a VBO with space for your weights and weight indices (4-8 floats)&lt;/li&gt;&lt;li&gt; Convert your weight values into floats, store in your array,&lt;/li&gt;&lt;li&gt;For the index values, convert to uint8 values, which refers to the shader' current matrix palette&lt;/li&gt;&lt;ul&gt;&lt;li&gt;This is defined as an array of uniform matrices; usually less than 28 matrices long&lt;/li&gt;&lt;li&gt;all GPU bone animation routines do this internally, ultimately.&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Then, before you draw a group in your polygon, load the palette with the matrices needed.&lt;/li&gt;&lt;li&gt;In the shader, simply multiply with your input vertex to compute the output vertex, and multiply each stage with the weight required.&lt;/li&gt;&lt;/ul&gt;It doesn't take a of lot of inspection to see multiple problems. For one, you are limited by the number of weights applied to a vertex, and you need multiple shaders for each count, such as matrixshd1, matrixshd2, and so on. You also have to load the uniforms in for each group that changes the matrix palette. Also, depending on your shading pipeline, you have to multiply and convert the matrices before sending to the GPU.&lt;br /&gt;&lt;br /&gt;All those problems aside, and you suddenly realize that in javascript, there IS no way to convert bytes into a float. In C, this was typecast trickery.&lt;br /&gt;&lt;br /&gt;Here is (one way) convert arbitrary bytes into a float for your VBO data:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;function utilUCharToFloat( inarray ){&lt;br /&gt;&lt;br /&gt;//Step 1: Create a un-editable array buffer (in bytes) of size 4&lt;br /&gt;&lt;br /&gt;var n = new ArrayBuffer(4);&lt;br /&gt;&lt;br /&gt;//Step 2: Create a "view" of that buffer as a Uint8 view. &lt;br /&gt;//This allows you to write into it as bytes.&lt;br /&gt;//We choose a 0 offset, and a 4 length for explicitness&lt;br /&gt;&lt;br /&gt;var vb = new Uint8Array( n, 0, 4 )&lt;br /&gt;&lt;br /&gt;//Write into it with your bytes&lt;br /&gt;&lt;br /&gt;vb[0] = inarray[0];&lt;br /&gt;vb[1] = inarray[1];&lt;br /&gt;vb[2] = inarray[2];&lt;br /&gt;vb[3] = inarray[3];&lt;br /&gt;&lt;br /&gt;//Create a new view as a float.&lt;br /&gt;//This view uses the same data as the vb view, but is read/written to like a float.&lt;br /&gt;&lt;br /&gt;vf = new Float32Array( n, 0, 1 );&lt;br /&gt;&lt;br /&gt;//The first element, a 32 bit float (8*4 = 32) is returned,&lt;br /&gt;&lt;br /&gt;return vf[0];&lt;br /&gt;}&lt;/blockquote&gt;&lt;br /&gt;You can do the exact opposite and convert bytes to float using the same logic.&lt;br /&gt;&lt;br /&gt;Hope this helps, it's critical to being able to use matrix palette weighting.&lt;br /&gt;&lt;br /&gt;-Z&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4044374934526922505-5493201313139032597?l=imaginaryz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://imaginaryz.blogspot.com/feeds/5493201313139032597/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4044374934526922505&amp;postID=5493201313139032597&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/5493201313139032597'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/5493201313139032597'/><link rel='alternate' type='text/html' href='http://imaginaryz.blogspot.com/2011/04/webgl-convert-chars-to-float.html' title='WebGL - Convert chars to float'/><author><name>Imaginary Z</name><uri>http://www.blogger.com/profile/05059116260376007206</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_O5BsOfO48b0/R1n4E03veuI/AAAAAAAAAAc/p0Q4WRLzwj0/S220/GargHead.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4044374934526922505.post-8437731305083317806</id><published>2011-04-05T19:38:00.000-05:00</published><updated>2011-04-05T19:38:17.702-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='webgl'/><category scheme='http://www.blogger.com/atom/ns#' term='blender python'/><title type='text'>WebGL - TED DXML importer again</title><content type='html'>The test file: (Run locally)&lt;br /&gt;&lt;a href="http://www.gocaco.com/webgl/test1/Archive.zip"&gt;http://www.gocaco.com/webgl/test1/Archive.zip&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The exporter for blender (Export your own model to test)&lt;br /&gt;&lt;a href="http://www.gocaco.com/webgl/igtl_export_ted.py"&gt;http://www.gocaco.com/webgl/igtl_export_ted.py&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Instructions:&lt;br /&gt;&lt;ul&gt;&lt;li&gt; Make a new folder somewhere.&lt;/li&gt;&lt;li&gt;Unzip Archive.zip into it. There will be a .html and a.js file.&lt;/li&gt;&lt;li&gt;Copy the igtl_export_tex.py into your Blender/scripts directory. (check infopanel for location) &lt;/li&gt;&lt;li&gt;Open Blender (2.49b?) and open a model.&lt;/li&gt;&lt;li&gt;In blender, File-&amp;gt;Export-&amp;gt;IGTL TED (.dxml)&lt;/li&gt;&lt;li&gt;Change your options, do NOT use JSON mode.&lt;/li&gt;&lt;li&gt; Copy your exported file to the new folder.&lt;/li&gt;&lt;li&gt;Run the index.html in your browser (doubleclick it)&lt;/li&gt;&lt;li&gt;Type in the name of your file in the bottom and click load.&lt;/li&gt;&lt;li&gt;Now you should be able to use left drag, right drag and left+right drag to view around.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Now I have added in scene loading so it can load in lists of objects, all of which can move/translate/scale.&lt;br /&gt;&lt;br /&gt;Also multi-texture is working, but no shaders are coded yet that use it. That'll be after animations, since animations are done in the shader. This is why the TED exporter is valuable, it automatically splits up your mesh into groups by material, seams, and matrix palette seams.&lt;br /&gt;&lt;br /&gt;Here's a random scene I made. Don't make any comments about old school games, yes I know what "Dungeons of Drax" is. If the shaders were working it would look better.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-bqP4esW4zFs/TZu1pFc_MMI/AAAAAAAAALo/6Ps6ZQ65enc/s1600/WebGL_TEDimport2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="235" src="http://2.bp.blogspot.com/-bqP4esW4zFs/TZu1pFc_MMI/AAAAAAAAALo/6Ps6ZQ65enc/s320/WebGL_TEDimport2.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Animations next...&lt;br /&gt;-Z&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4044374934526922505-8437731305083317806?l=imaginaryz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://imaginaryz.blogspot.com/feeds/8437731305083317806/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4044374934526922505&amp;postID=8437731305083317806&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/8437731305083317806'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/8437731305083317806'/><link rel='alternate' type='text/html' href='http://imaginaryz.blogspot.com/2011/04/webgl-ted-dxml-importer-again.html' title='WebGL - TED DXML importer again'/><author><name>Imaginary Z</name><uri>http://www.blogger.com/profile/05059116260376007206</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_O5BsOfO48b0/R1n4E03veuI/AAAAAAAAAAc/p0Q4WRLzwj0/S220/GargHead.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-bqP4esW4zFs/TZu1pFc_MMI/AAAAAAAAALo/6Ps6ZQ65enc/s72-c/WebGL_TEDimport2.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4044374934526922505.post-6210619594697191674</id><published>2011-04-04T23:42:00.000-05:00</published><updated>2011-04-04T23:42:49.803-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='webgl'/><category scheme='http://www.blogger.com/atom/ns#' term='blender python'/><title type='text'>WebGL - TED DXML importer</title><content type='html'>So I redid some javascript; Now I have a stronger preliminary system for loading data from TED files. It's scary fast, and impressively so. (The GL part anyways)&lt;br /&gt;&lt;br /&gt;So, make sure you export ONLY data in the TED format, not the JSON format. Use  the TED format because it's a lot easier to read and understand, and it's not much less efficient than a JSON file (Maybe 1% tops).&lt;br /&gt;&lt;br /&gt;You must export your own test model for now, from blender. &lt;a href="http://www.gocaco.com/webgl/test1/Archive.zip"&gt;Download the source here to try it on your local machine&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;TED Exporter (test 2.49b, not yet 2.5* compatible):&lt;br /&gt;&lt;a href="http://www.gocaco.com/webgl/igtl_export_ted.py"&gt;http://www.gocaco.com/webgl/igtl_export_ted.py&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Download the python file, put it in your blender scripts directory (blender/.blender/scripts for me) or add it on to your 2.5 (not tested, API not stable)&lt;br /&gt;&lt;br /&gt;Then open any file you want, and select some objects, then File-&amp;gt;Export TED.&lt;br /&gt;You may want to poke through the python a little to read something about what it does.&lt;br /&gt;Save your exported ted file (All ted files are UTF-8 ASCII only, so always human readable) and place it wherever  you extracted the source index.html.&lt;br /&gt;&lt;br /&gt;Then, just enter in the name of the file and click load, nothing nothing breaks.&lt;br /&gt;&lt;br /&gt;You should be able to fly around a (currently non-objected) world with left mouse and right mouse drags, left+right mouse is zoom, left is rotate, right is pan.&lt;br /&gt;&lt;br /&gt;I do not yet have the scene objects loaded, nor do I have the animations active. That's next. But this is progress, I can now load data into the webgl, that includes models, textures, and animations.&lt;br /&gt;&lt;br /&gt;Here's &lt;a href="http://monsterhunter.wikia.com/wiki/Gigginox"&gt;Gigginox &lt;/a&gt;from Monster Hunter 3. Not doing much. &lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-fLTTmShj1VY/TZqdjhhfGEI/AAAAAAAAALk/AnzWrRUc4T4/s1600/WebGL_TEDimport1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="244" src="http://3.bp.blogspot.com/-fLTTmShj1VY/TZqdjhhfGEI/AAAAAAAAALk/AnzWrRUc4T4/s320/WebGL_TEDimport1.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;-Z&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4044374934526922505-6210619594697191674?l=imaginaryz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://imaginaryz.blogspot.com/feeds/6210619594697191674/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4044374934526922505&amp;postID=6210619594697191674&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/6210619594697191674'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/6210619594697191674'/><link rel='alternate' type='text/html' href='http://imaginaryz.blogspot.com/2011/04/webgl-ted-dxml-importer.html' title='WebGL - TED DXML importer'/><author><name>Imaginary Z</name><uri>http://www.blogger.com/profile/05059116260376007206</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_O5BsOfO48b0/R1n4E03veuI/AAAAAAAAAAc/p0Q4WRLzwj0/S220/GargHead.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-fLTTmShj1VY/TZqdjhhfGEI/AAAAAAAAALk/AnzWrRUc4T4/s72-c/WebGL_TEDimport1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4044374934526922505.post-2266918184399027759</id><published>2011-04-02T18:22:00.003-05:00</published><updated>2011-04-03T13:47:45.268-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='webgl'/><category scheme='http://www.blogger.com/atom/ns#' term='blender python'/><title type='text'>WebGL - Blender Exporter to JSON format</title><content type='html'>EDIT (2010-04-03): JSON is a bad format. I'm remove support for it in favor of the XML already in place. XML parsers read DXML easily, so the original TED files remain as is. Reason: JSON cannot handle multiple nodes with the same name. Crippling.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Since I already have a very heavy exporter built for blender, and it just so happens to be in the DXML format, I can directly convert it to a &lt;a href="http://www.json.org/"&gt;JSON &lt;/a&gt;with almost no loss of information.&lt;br /&gt;&lt;br /&gt;So, if you are frustrated with not having a prebuilt &lt;a href="http://www.blender.org/"&gt;Blender&lt;/a&gt; -&amp;gt; &lt;a href="http://www.json.org/"&gt;JSON &lt;/a&gt;exporter, use mine (or copy + improve on it).&lt;br /&gt;&lt;br /&gt;The download link is always on the right hand side of my blog, or here since this post is about the exporter:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.gocaco.com/temp/igtl_export_ted.py"&gt;http://www.gocaco.com/temp/igtl_export_ted.py&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;You might wonder "why do I want yet another stupid format". GOOD QUESTION.&lt;br /&gt;The "TED" file is designed to mimic hardware formats. &lt;br /&gt;It exports:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Optimized mesh data (automatically splits along UV seams, and material seams, and matrix palette splits. Exports vertex, texcoord, normal, tangent, weight, weightindex, maybe colors)&lt;/li&gt;&lt;li&gt;Material information (As much as possible for now, needs improvement)&lt;/li&gt;&lt;li&gt;Armature data (all of it, including IK chains)&lt;/li&gt;&lt;li&gt;Animation data (All actions that fit an armature)&lt;/li&gt;&lt;li&gt;Frame actions (You can make text files with scripts that can act as data for animations)&lt;/li&gt;&lt;li&gt;Textures (Can be converted to text and put in the file)&lt;/li&gt;&lt;li&gt;Scenes (Converted exactly as shown)&lt;/li&gt;&lt;li&gt;Objects (including game properties! And links to data.)&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;So, it's also all fairly logical. You will have to play with it to get used to it, especially for you novice's out there. Reading through the exporter (find the "const_DTD_ted" declaration) and looking at what the data is should help. Try exporting a regular TED file first, and open it with any text editor. DXML files are regular, very restrictive XML files to promote consistency and easy of reading. It should be immediately obvious how to read them in.&lt;br /&gt;&lt;br /&gt;More importantly, for you beginners, the data exporter from the TED exporter is everything you find normally in any commercial game out there. This includes X360, PS3, Wii games, as I have tested and proven myself.&lt;br /&gt;It does NOT export some advanced features, because blender does not have those features yet. Bother &lt;a href="http://www.blender.org/"&gt;blender.org&lt;/a&gt; about that if you want more functionality with muscle/keyframe animation.&lt;br /&gt;&lt;br /&gt;If you do end up using this, enjoy. Please drop some credit somewhere; there are no restrictions or guarantees to this script. It's 100% free as in free beer.&lt;br /&gt;&lt;br /&gt;A early preliminary test:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-wZE95oFoE9U/TZevWGwQAnI/AAAAAAAAALg/BrWEdfLZhGQ/s1600/BowserInYourBrowser1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="297" src="http://1.bp.blogspot.com/-wZE95oFoE9U/TZevWGwQAnI/AAAAAAAAALg/BrWEdfLZhGQ/s320/BowserInYourBrowser1.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;I will add a animated test soon.&lt;br /&gt;&lt;br /&gt;-Z&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4044374934526922505-2266918184399027759?l=imaginaryz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://imaginaryz.blogspot.com/feeds/2266918184399027759/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4044374934526922505&amp;postID=2266918184399027759&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/2266918184399027759'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/2266918184399027759'/><link rel='alternate' type='text/html' href='http://imaginaryz.blogspot.com/2011/04/webgl-blender-exporter-to-json-format.html' title='WebGL - Blender Exporter to JSON format'/><author><name>Imaginary Z</name><uri>http://www.blogger.com/profile/05059116260376007206</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_O5BsOfO48b0/R1n4E03veuI/AAAAAAAAAAc/p0Q4WRLzwj0/S220/GargHead.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-wZE95oFoE9U/TZevWGwQAnI/AAAAAAAAALg/BrWEdfLZhGQ/s72-c/BowserInYourBrowser1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4044374934526922505.post-139749208693691525</id><published>2011-03-29T16:58:00.002-05:00</published><updated>2011-04-02T18:06:20.859-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='webgl'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='opengl'/><title type='text'>WebGL - YES!</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="" style="clear: both; text-align: left;"&gt;First, go here to update your Firefox (or use Chrome):&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.mozilla.com/en-US/firefox/all.html"&gt;http://www.mozilla.com/en-US/firefox/all.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;In firefox 4.0, you have to enable this feature manually,&lt;br /&gt;&lt;br /&gt;First type in "about:config" in the address bar,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Don't let it scare you, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Sort the items by name,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Find the "webgl.force_enabled" and double click that to make it true.&lt;/div&gt;&lt;div class="" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-CH0dNfluJEA/TZJUqSj118I/AAAAAAAAALc/FJ099dPvfac/s1600/UseWebGL.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://1.bp.blogspot.com/-CH0dNfluJEA/TZJUqSj118I/AAAAAAAAALc/FJ099dPvfac/s400/UseWebGL.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Now, go find some sweet OpenGL ES 2.0 type demos.&lt;br /&gt;&lt;br /&gt;!!! ACHTUNG !!!&lt;br /&gt;&lt;br /&gt;--&amp;gt; Make absolutely sure you have the NoScript AddOn (http://noscript.net/) for firefox first. This will allow you to STOP content from automatically loading, just in case you are like me and are trigger happy.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.khronos.org/webgl/wiki/Demo_Repository%20"&gt;http://www.khronos.org/webgl/wiki/Demo_Repository &lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.chromeexperiments.com/webgl"&gt;http://www.chromeexperiments.com/webgl&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This is great because it eliminates the need for stupid plugins like Unity, Flash, Shockwave, Java, ect...&lt;br /&gt;Now you can use the ECMA script (Javascript) built into the browser to make full powered 3D games, which now are compliant to any browsers that use them!&lt;br /&gt;&lt;br /&gt;This is serious cool. I'm totally making something in this.&lt;br /&gt;&lt;br /&gt;-Z&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4044374934526922505-139749208693691525?l=imaginaryz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://imaginaryz.blogspot.com/feeds/139749208693691525/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4044374934526922505&amp;postID=139749208693691525&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/139749208693691525'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/139749208693691525'/><link rel='alternate' type='text/html' href='http://imaginaryz.blogspot.com/2011/03/webgl-yes.html' title='WebGL - YES!'/><author><name>Imaginary Z</name><uri>http://www.blogger.com/profile/05059116260376007206</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_O5BsOfO48b0/R1n4E03veuI/AAAAAAAAAAc/p0Q4WRLzwj0/S220/GargHead.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-CH0dNfluJEA/TZJUqSj118I/AAAAAAAAALc/FJ099dPvfac/s72-c/UseWebGL.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4044374934526922505.post-4919105167636971281</id><published>2011-02-12T21:36:00.002-06:00</published><updated>2011-02-12T21:36:57.481-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='NAS'/><category scheme='http://www.blogger.com/atom/ns#' term='cooking'/><title type='text'>Synology DS 1511+ - More fun</title><content type='html'>So far, everything has worked like a champ. The Media server is seen by the PS3, and although the PS3 sucks bawls when it comes to format compatibility, when it CAN play something, it does seamlessly.&lt;br /&gt;&lt;br /&gt;We ran a blue ray movie off the Synology, to see how fast it could throughput. The router isn't fast enough to even begin to test, I'll have to get a switch and some better networking equipment before I can.&lt;br /&gt;&lt;br /&gt;So, to compensate, we watched a blue ray movie WHILE uploading a blu ray, and had two sources pulling and 1 uploading.&lt;br /&gt;&lt;br /&gt;No chokes or anything. A consistent, router limited 10 MB/s.&lt;br /&gt;&lt;br /&gt;So that was great.&lt;br /&gt;&lt;br /&gt;However, if you setup this unit for FTP, make sure to follow synology's instructions and use filezilla, otherwise you'll get frustrated with other shitty FTP programs.&lt;br /&gt;&lt;br /&gt;I still like it so far. It's fast, efficient, very quiet, it's amazingly silent for what it's doing, though the clicking is inevitable in any system.&lt;br /&gt;&lt;br /&gt;The temperatures are about 98 98 100 100 99 Fahrenheit in the unit itself under blue ray playing mode. So that's really decent. Ambient room temp is 70 Fahrenheit.&lt;br /&gt;&lt;br /&gt;HOWEVER&lt;br /&gt;&lt;br /&gt;I encountered one problem, but not with the synology DS1511+. The problem is, VLC.&lt;br /&gt;&lt;br /&gt;VLC does not seem to support UPnP/DLNA browsing/playing! What the hell!&lt;br /&gt;I googled this, and found either they do not have enabled, since it seems there are builds with it, or it is not working for just windows.&lt;br /&gt;I was able to download XBMC (oh god I hate it) and it worked fine with the synology, no problems, minus I absolutely hate that media player. VLC spoils you, really!&lt;br /&gt;&lt;br /&gt;For example, when watching the dark knight on blue ray, we randomly skipped about and sped up/slowed down the playback and added filters. Still good, though seeking took a moment, naturally. But no longer than I would have expected.&lt;br /&gt;&lt;br /&gt;Windows XP Pro seems to SEE the UPNP server, but I don;t have any programs that can browse / pull data off it. &lt;br /&gt;&lt;br /&gt;This is a crippling problem, and I want VLC to stream from the NAS.&lt;br /&gt;&lt;br /&gt;In unrelated news,&lt;br /&gt;&lt;br /&gt;I made the candied citrus peel recipe from the "Desserts By Pierre Herme" awesome cookbook I have; And, OH MY GOD they are amazing. I don;t know what I did wrong, if anything, but caramel + orange + candied is absolutely something else. It's incredibly tasty, and super addicting. Once they all dry, I'll coat them in some crappy ass commercial dark chocolate like Hershey's special dark or something. Maybe.&lt;br /&gt;&lt;br /&gt;I'm definitely making these things more often. And I'll quantify the recipe so I can replicate it.&lt;br /&gt;&lt;br /&gt;-Z&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4044374934526922505-4919105167636971281?l=imaginaryz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://imaginaryz.blogspot.com/feeds/4919105167636971281/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4044374934526922505&amp;postID=4919105167636971281&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/4919105167636971281'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/4919105167636971281'/><link rel='alternate' type='text/html' href='http://imaginaryz.blogspot.com/2011/02/synology-ds-1511-more-fun.html' title='Synology DS 1511+ - More fun'/><author><name>Imaginary Z</name><uri>http://www.blogger.com/profile/05059116260376007206</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_O5BsOfO48b0/R1n4E03veuI/AAAAAAAAAAc/p0Q4WRLzwj0/S220/GargHead.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4044374934526922505.post-2489276514597778702</id><published>2011-02-09T16:02:00.000-06:00</published><updated>2011-02-09T16:02:38.553-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='NAS'/><title type='text'>Synology DS 1511+ - Playing around</title><content type='html'>So, 10TB of a RAID 6 resulted in 5.44 TB of usable space; and it only took about 7 hours to parity check, maybe 1 to build! If you think about it.&lt;br /&gt;&lt;br /&gt;10TB / 8hr =&amp;gt; 364 MBps&lt;br /&gt;&lt;br /&gt;Which, my poor ass router can't go that fast.&lt;br /&gt;&lt;br /&gt;So the thing is fast. I started formatting and toying with settings and stuff, uploading movies and music to test it's integrity.&lt;br /&gt;&lt;br /&gt;Pending results from the UPnP test with some PS3's.&lt;br /&gt;&lt;br /&gt;Remove the DNS so the box is intranet only, which is awesome.&lt;br /&gt;&lt;br /&gt;Here's what it looks like in action, using Synology's DSM web interface:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_O5BsOfO48b0/TVMOiPxLUMI/AAAAAAAAALY/DWIdngit3Vs/s1600/SynologyInterface.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="287" src="http://1.bp.blogspot.com/_O5BsOfO48b0/TVMOiPxLUMI/AAAAAAAAALY/DWIdngit3Vs/s400/SynologyInterface.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;I'm a little hesitant to enable the transcoding on it, but we'll test it out while it's still fresh. &lt;br /&gt;&lt;br /&gt;Great job so far guys, this is the best tech product I've ever used. Props Synology!&lt;br /&gt;&lt;br /&gt;-Z&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4044374934526922505-2489276514597778702?l=imaginaryz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://imaginaryz.blogspot.com/feeds/2489276514597778702/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4044374934526922505&amp;postID=2489276514597778702&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/2489276514597778702'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/2489276514597778702'/><link rel='alternate' type='text/html' href='http://imaginaryz.blogspot.com/2011/02/synology-ds-1511-playing-around.html' title='Synology DS 1511+ - Playing around'/><author><name>Imaginary Z</name><uri>http://www.blogger.com/profile/05059116260376007206</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_O5BsOfO48b0/R1n4E03veuI/AAAAAAAAAAc/p0Q4WRLzwj0/S220/GargHead.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_O5BsOfO48b0/TVMOiPxLUMI/AAAAAAAAALY/DWIdngit3Vs/s72-c/SynologyInterface.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4044374934526922505.post-8110933740812672631</id><published>2011-02-07T17:46:00.000-06:00</published><updated>2011-02-07T17:46:55.080-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='NAS'/><title type='text'>Synology DS 1511+ - Initial Setup</title><content type='html'>So, the unit arrived this afternoon.&lt;br /&gt;&lt;br /&gt;after a greedy session of package unwrapping, I uncovered the DS1511+ itself.&lt;br /&gt;&lt;br /&gt;It looks a lot better than the picture.&lt;br /&gt;&lt;br /&gt;Everything is exactly as stated. I had no problems opening the packaging, the instructions were all in a .pdf, easy to follow, the drive sleds were a little flimsy feeling, you have to really be gentle with them.&lt;br /&gt;&lt;br /&gt;Basically, you unlock the bay, push in the bay, and it pops out making it easy to slide out. Then, you screw in the hard drive (rubber grommets don't fit for noise abatement, need that fix.) And slide the sled back in, and push the clip back down.&lt;br /&gt;&lt;br /&gt;It took me a few tries on the first drive to get it push back enough before it would click back, slightly frustrating, but&amp;nbsp; it only happened the first time and was user error.&lt;br /&gt;&lt;br /&gt;With all the drives in place, I carted the unit into the NAS Room, and setup the UPS for the unit.&lt;br /&gt;The UPS is manditory for any kind of storage operation, since if the power fluctuates, you need a battery backup to keep the unit running until it can shut down and suspend proporly.&lt;br /&gt;&lt;br /&gt;I plugged it all in, and installed the Disk Manager software.&lt;br /&gt;&lt;br /&gt;Now this part is a little hairy, but my systems have auto-everything disabled. So, I manually allows the autorun, and a little splash window popped up, and you click a big install button. Wait a minute, then you detect your NAS.&lt;br /&gt;&lt;br /&gt;Initially, nothing. I check the ethernet cable, and I guess it had wiggled out. So be careful with those ethernet cables, make sure you have a good connection physically.&lt;br /&gt;&lt;br /&gt;After that, it blinked on, and I logged in.&lt;br /&gt;&lt;br /&gt;From there, it got easy. The Linux OS they use is really damn clean. It works through a web browser nicely, I had 0 trouble using it. Was like home.&lt;br /&gt;&lt;br /&gt;More interestingly, is that using a OS like that in a web browser (aside from being really stupid imo) was insanely easy to do. Kinda like using a strong VNC/RDP connection.&lt;br /&gt;&lt;br /&gt;So, I clicked arround, made some user accounts, setup&amp;nbsp; the RAID6 array, and let it go ahead and check everybody for errors.&lt;br /&gt;&lt;br /&gt;So, it should be done tonight.&lt;br /&gt;&lt;br /&gt;I'm impressed with this product. Using their software online as a testbed was a good way to test it, and getting the unit in a flawless configuration was a really nice bonus as well.&lt;br /&gt;&lt;br /&gt;The next test will be to load it with data, and yank out a drive to see how it rebuilds.&lt;br /&gt;&lt;br /&gt;BUT, I probably don't need to do that. It seems perfectly fine to me, I'd rather make sure the UPnP stuff works for the PS3's and the Mac in the house, so I can stream stuff to em.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;SUMMARY PROS:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Easy Setup Physically&lt;/li&gt;&lt;li&gt;Amazingly easy software setup&lt;/li&gt;&lt;li&gt;Works so far&lt;/li&gt;&lt;li&gt;Unusually quiet&lt;/li&gt;&lt;li&gt;Able to add DX510 units to expand the unit's capacity greatly (26 TB theoretical! 16 TB probably max due to FS problems) &lt;/li&gt;&lt;/ul&gt;&amp;nbsp;SUMMARY CONS:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Drive bays a little flimsy&lt;/li&gt;&lt;li&gt;No anti-noise grommets for hard drives, nor is there room to add any&lt;/li&gt;&lt;li&gt;Uses a web interface (However, it has a VGA port and USB ports, I bet you can run it with no web interface. Not yet tested.)&lt;/li&gt;&lt;li&gt;Filesystem limitations come into play unless you smartly divide the drive out. Which is really hard to do, initially.&lt;/li&gt;&lt;/ul&gt;SATISFACTION: Yes &lt;br /&gt;&lt;br /&gt;Until next update!&lt;br /&gt;&lt;br /&gt;-Z&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4044374934526922505-8110933740812672631?l=imaginaryz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://imaginaryz.blogspot.com/feeds/8110933740812672631/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4044374934526922505&amp;postID=8110933740812672631&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/8110933740812672631'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/8110933740812672631'/><link rel='alternate' type='text/html' href='http://imaginaryz.blogspot.com/2011/02/synology-ds-1511-initial-setup.html' title='Synology DS 1511+ - Initial Setup'/><author><name>Imaginary Z</name><uri>http://www.blogger.com/profile/05059116260376007206</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_O5BsOfO48b0/R1n4E03veuI/AAAAAAAAAAc/p0Q4WRLzwj0/S220/GargHead.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4044374934526922505.post-2666542180338250544</id><published>2011-01-31T17:19:00.000-06:00</published><updated>2011-01-31T17:19:03.392-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='NAS'/><title type='text'>Synology DS 1511+</title><content type='html'>&lt;a href="http://www.synology.com/us/products/DS1511+/index.php"&gt;&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.synology.com/us/products/DS1511+/photos/002.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://www.synology.com/us/products/DS1511+/photos/002.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;So I purchased this baby, it should be here in a week. Maybe more since our atmospheric conditions are trending to the less than favorable end of the spectrum. Loaded with 2 TB drives, I'll configure it as a RAID 6 or equivalent level of protection NAS.&lt;br /&gt;This represents the first serious move I have ever made in the attempt to clean up and organize the vast amount of data I have acquired. Having a HD video camera sucked all the little magnetic pikmin out of my drive platters so fast you'd think it was some sort of monster movie. But, since I have about 3.7 TB of data and almost a literal million files, I figured I needed some way to back up this garbage; the important data only amounts to about 400 GB or so (models, music I made, data, programming) and the critical data still fits on a CD (core code, finances).&lt;br /&gt;&lt;br /&gt;So, package wise, this NAS seems to be one of the top products out there. When I get the unit setup, I'll do a full review on it. So far it looks great, and very promising in the software end.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;in the meantime, I've been attempting to fix a blender problem, which has been exceedingly difficult for no good reason. (I implemented the fix myself in C/C++ in an hour or two, and got it to work fine) I've been fighting it for over a week, and I'm still not anywhere close to done. Well, that's a lie, but it's not perfect yet.&lt;br /&gt;The script, for those of you who use blender, lets you edit an armature, and it then corrects&amp;nbsp; your animations after you finish editing. That way, you can model, tweak your armature, make a animation to test, and not lose all that work in the process. You will still lose some, in some cases, since moving bones cannot be corrected; but rotating them or changing their roll can.&lt;br /&gt;I know, it sounds simple right? The problem is the data is stored in local keyframes, as you know:&lt;br /&gt;Parent Matrix * Armature Default Matrix * Pose Matrix = Final Matrix&lt;br /&gt;And you simply solve for Pose Matrix:&lt;br /&gt;Pose Matrix = Armature Default Matrix ^ -1 * Parent Matrix^-1 * Desired Final Matrix&lt;br /&gt;So that applying the pose gets you the desired final matrix.&lt;br /&gt;For whatever weird reason (mostly blenders shitty internal representations of rotations &amp;amp; poorly constructed math utilities, I'm sure many people suffered this) it doesn't. I'll figgure it out eventually. I seem to have rotations working, but not positions since positions apparently come from a different space transform or some silly thing.&lt;br /&gt;&lt;br /&gt;Platforming game was going fine, as usual, artist hit RL problems, so I don't know what I'll be doing with it yet.&lt;br /&gt;&lt;br /&gt;Played with Unity some. Using Unity makes the Blender Game Engine look good. And that is seriously saying something. And that something is that unity sucks*. But, what do you expect for free? It suffers from the same problems all game engines have. Oh well, it's still fun to mess around in. Did everyone just forget BGE had a webplugin too? Or did Unity just steal their source? Who knows.&lt;br /&gt;&lt;br /&gt;Also, work is hard, and we're upgrading what I'm doing again. Fun stuff.&lt;br /&gt;&lt;br /&gt;Peace out folks!&lt;br /&gt;&lt;br /&gt;-Z&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4044374934526922505-2666542180338250544?l=imaginaryz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://imaginaryz.blogspot.com/feeds/2666542180338250544/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4044374934526922505&amp;postID=2666542180338250544&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/2666542180338250544'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/2666542180338250544'/><link rel='alternate' type='text/html' href='http://imaginaryz.blogspot.com/2011/01/synology-ds-1511.html' title='Synology DS 1511+'/><author><name>Imaginary Z</name><uri>http://www.blogger.com/profile/05059116260376007206</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_O5BsOfO48b0/R1n4E03veuI/AAAAAAAAAAc/p0Q4WRLzwj0/S220/GargHead.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4044374934526922505.post-8709879049640769014</id><published>2010-12-19T13:13:00.000-06:00</published><updated>2010-12-19T13:13:07.986-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='flash'/><title type='text'>2D Platforming Game</title><content type='html'>Well, I had a dream one day, December 1st or something, where I was instructed how to make a platforming game.&lt;br /&gt;I woke up, coded it, and it worked.&lt;br /&gt;DAMN simple too.&lt;br /&gt;&lt;br /&gt;Given a list of AABB's in space, and Actors which contain AABB's for motion against the level,&lt;br /&gt;Simply calculate the current bounds and previous bounds (stored)&lt;br /&gt;then detect any EDGE crossings based on the difference from the previous/current bounds for edges;&lt;br /&gt;Then take the minimum edges found, and move the character out from those edges, with some epsilon (in flash, 0.1 works)&lt;br /&gt;&lt;br /&gt;To fire a laser in the game, use a space hash (Make a uniform grid of blocks that store references to the objects) and use a specialized edge traversal algorithm, that moves to the next best slope cell, and check everything in that cell until the laser is exhausted or hits something. Handle the case if it changes a major cell, and check the next two to avoid errors.&lt;br /&gt;&lt;br /&gt;Both these ideas work PERFECTLY, and thus any 2D platforming game (without ramps so far) is easily made.&lt;br /&gt;&lt;br /&gt;Once I clean up the engine, I'll post it so people can make their own high-powered 2D platformers.&lt;br /&gt;&lt;br /&gt;-Z&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4044374934526922505-8709879049640769014?l=imaginaryz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://imaginaryz.blogspot.com/feeds/8709879049640769014/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4044374934526922505&amp;postID=8709879049640769014&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/8709879049640769014'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/8709879049640769014'/><link rel='alternate' type='text/html' href='http://imaginaryz.blogspot.com/2010/12/2d-platforming-game.html' title='2D Platforming Game'/><author><name>Imaginary Z</name><uri>http://www.blogger.com/profile/05059116260376007206</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_O5BsOfO48b0/R1n4E03veuI/AAAAAAAAAAc/p0Q4WRLzwj0/S220/GargHead.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4044374934526922505.post-7227590168643244502</id><published>2010-11-16T00:00:00.001-06:00</published><updated>2010-11-16T00:12:06.210-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='dragon'/><category scheme='http://www.blogger.com/atom/ns#' term='game'/><category scheme='http://www.blogger.com/atom/ns#' term='blender'/><title type='text'>Blue Dragon - XBox 360</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_O5BsOfO48b0/TOIc3vJZKFI/AAAAAAAAALM/gU4JXjbKlmY/s1600/Plog_0009_BlueDragonRip2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="273" src="http://1.bp.blogspot.com/_O5BsOfO48b0/TOIc3vJZKFI/AAAAAAAAALM/gU4JXjbKlmY/s400/Plog_0009_BlueDragonRip2.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Well, that was fun. Learned a few things too.&lt;br /&gt;&lt;br /&gt;1. Mesh data stored in the XBox 360 is identical to all other formats that you expect in a high end graphics application; Specifically, large VA/IA arrays and a nicely formed VAO with a geometry shader system for handling matrix weighting/radial basis. No surprises.&lt;br /&gt;&lt;br /&gt;2. Textures are still DXT1-5 style blocking, but arranged differently in memory. Uncompressed normal maps.&lt;br /&gt;&lt;br /&gt;3. Meshes seemed to average ~10k polygons, and have ~170 bones apiece. Level of complexity requires on-GPU processing; may have special hardware for this, like OpenGL 3.0 or DX 11.&lt;br /&gt;&lt;br /&gt;I like the style for this game. Internally, it's fun and NPR; high enough resolution to some really cool animations. It was hard to find a lot of information about it though.&lt;br /&gt;&lt;br /&gt;Also, I found out my older ripping technology had a bug; and now all of my models are 100% spot on with weights, which means it's identical to the in game data for just about everything else I have. Which is really neat, now I can learn a whole lot about how Monster Hunter 3 animated their creatures so well, and how poorly some other games did the same thing &lt;br /&gt;&lt;br /&gt;It's like having the coolest action figure collection ever!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;-Z&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4044374934526922505-7227590168643244502?l=imaginaryz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://imaginaryz.blogspot.com/feeds/7227590168643244502/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4044374934526922505&amp;postID=7227590168643244502&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/7227590168643244502'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/7227590168643244502'/><link rel='alternate' type='text/html' href='http://imaginaryz.blogspot.com/2010/11/blue-dragon-xbox-360.html' title='Blue Dragon - XBox 360'/><author><name>Imaginary Z</name><uri>http://www.blogger.com/profile/05059116260376007206</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_O5BsOfO48b0/R1n4E03veuI/AAAAAAAAAAc/p0Q4WRLzwj0/S220/GargHead.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_O5BsOfO48b0/TOIc3vJZKFI/AAAAAAAAALM/gU4JXjbKlmY/s72-c/Plog_0009_BlueDragonRip2.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4044374934526922505.post-6870628238799922744</id><published>2010-10-20T21:55:00.000-05:00</published><updated>2010-10-20T21:55:05.647-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='code'/><category scheme='http://www.blogger.com/atom/ns#' term='game'/><category scheme='http://www.blogger.com/atom/ns#' term='blender'/><title type='text'>Zoning</title><content type='html'>It has been a long time since I posted.&lt;br /&gt;&lt;br /&gt;I've become far more proficient at modeling in blender.&lt;br /&gt;&lt;br /&gt;Also, I've improved the DXML format to the point where it writes C/C++ code automatically, and is far more stable, fast and simple. In fact, DXML seems to be my new "does everything" format, because unlike XML or other bullshit standards, it's lexically simple and forces you to write better file formats. Which, it turns out, are directly C-struct translatable. Also,  it has less possibility of confusion or errors due to it's very strict nature; and as a result, makes you far more intelligent. &lt;br /&gt;The downside is slightly larger files, but when you are dealing with a text file, you want it to be comprehensible, not efficient. DXML files are built for comprehension and logical structure. They're perfect!&lt;br /&gt;&lt;br /&gt;Also, the TED format has been getting a lot of attention and improving, I've added scripting to animations, so now attack animations can contain code (lua) so that punch animation can mean something.&lt;br /&gt;&lt;br /&gt;Also, I embedded Lua into my programs, now I can script (safely, mind you) so extensibility is fast simple and external; allows for a lot of flexibility, and as all you truly experience programmers know, a script is only as powerful as the core that drives it. In this case, core handles a lot of things normal engines like Unity, Blender, Torque, and many others do NOT handle. No surprise; you're supposed to extend those engines in C/C++ code anyways. Most of them are also not built for magnitude/scaling either.&lt;br /&gt;&lt;br /&gt;So, with all these improvements, the focus has been on scene management; ted files provide a vast array of graphical and animation data; they also now provide zoning information, which is used to reduce collision requirements and provide an effective scene graph that can be non-spatial (a critical requirement for adventure clone!)&lt;br /&gt;&lt;br /&gt;Here's a rough idea of what "zones" and "zplanes" mean, in terms of blender; In text, a zone is a axis aligned bounding box (AABB) that contains a list of objects that intersect it, and a list of other zones that intersect it. A Zplane contains a reference to two Zones, and a position and matrix, used for culling.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_O5BsOfO48b0/TL-qp-AnpcI/AAAAAAAAALI/-1ofEXiDRkw/s1600/Zoning.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="180" src="http://3.bp.blogspot.com/_O5BsOfO48b0/TL-qp-AnpcI/AAAAAAAAALI/-1ofEXiDRkw/s320/Zoning.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Until next update! Maybe we'll get a video of some in-game action.&lt;br /&gt;&lt;br /&gt;-Z&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4044374934526922505-6870628238799922744?l=imaginaryz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://imaginaryz.blogspot.com/feeds/6870628238799922744/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4044374934526922505&amp;postID=6870628238799922744&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/6870628238799922744'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/6870628238799922744'/><link rel='alternate' type='text/html' href='http://imaginaryz.blogspot.com/2010/10/zoning.html' title='Zoning'/><author><name>Imaginary Z</name><uri>http://www.blogger.com/profile/05059116260376007206</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_O5BsOfO48b0/R1n4E03veuI/AAAAAAAAAAc/p0Q4WRLzwj0/S220/GargHead.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_O5BsOfO48b0/TL-qp-AnpcI/AAAAAAAAALI/-1ofEXiDRkw/s72-c/Zoning.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4044374934526922505.post-5842744195717273143</id><published>2010-07-24T10:06:00.005-05:00</published><updated>2010-07-24T10:21:41.436-05:00</updated><title type='text'>Game Physics - We got balls</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;b&gt;Summary:&lt;/b&gt;  Game physics works per frame, and is discretely accurate. Normal  physics engines simulate real physical principals, and do integrate.  Design is what keeps your game from  having errors, not the engine integrating better / more accurately.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Game Physcis. The long debated quitnessential problem with most all games. Do you take an existing physics engine and force it to work the way you want? Or do you roll your own collision system for perfect accuracy at the cost of far greater development time?&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Obviously, I chose to roll my own since I've never seen a "game" physics engine. I've seen bullet, novodex, Aegia PhysX, ODE, tokamak, Newton, ect... and they all attempt to be "physics" engines, not game physics engines.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;What is the difference between a physics engine and a game physics engine?&lt;/div&gt;&lt;ul&gt;&lt;li&gt; 1. Game physics do not model reality; they model fixed frame impulse systems; IE they are not time based.&lt;/li&gt;&lt;li&gt;2. Game physics generally have multiple levels of physical objects, static objects are handled vastly differently than dynamic objects, and objects that have one way interactions are handled differently still.&lt;/li&gt;&lt;li&gt;3. Game physics trades accuracy for quantity &amp;amp; speed. Also, their accuracy has no real physical model to use, other than the most basic physical principles (ray reflection, momentum, mass) &lt;/li&gt;&lt;/ul&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;So, the worst part about rolling your own (maybe 500~ lines of code if you're good) is the geometry. The nastiest part about any collision engine is simply generating all the 'trivial' geometry intersection and distance functions you will need. I've consulted more than 3 PhD mathematicians on this subject, and none of them were able to solve these "trivial" problems. And these guys are seriously brilliant professors! So don't arrogantly think that these are ever trivial questions to ask; they only appear trivial because the solution seems so logically simple. Much like, if you asked &lt;a href="http://mathworld.wolfram.com/EllipticIntegraloftheSecondKind.html"&gt;what the arc length is on an ellipse&lt;/a&gt;. Seems innocent enough at first, go research it.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Also, game physics use special models of collision, specifically the ray-bounce-slide model, so you character will slither along corridors and walls with great clarity and smoothness, and essentially have perfectly inelastic collisions with just about everything. Lots of optimizations present themselves for broad phase testing, especially when you break up the static / dynamic environments.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;So for my purposes, I made a simple little game physics engine that lets me run objects like I would expect them, it's discrete time stepping, fully consistent, but it does allow something I have always hated, which is possible penetrations. I'll have to think more to figure out how to integrate that type of dynamic into a system like this, but the truth is, if you have dynamic/dynamic object collisions, there are very few ways to solve them (&lt;a href="http://scienceworld.wolfram.com/physics/RestrictedThree-BodyProblem.html"&gt;refer to the classic 3 body problem&lt;/a&gt;, and enjoy your porkchop with cyclic coordinate descent.) So, stepping your dynamics works against dynamic objects, but you can make much more accurate collision assessments against the level. But wait! if you set your steps and velocities right, guess what? You can just completely ignore that problem all together.&amp;nbsp;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;b&gt;Game physics doesn't rely on correct simulation. It relies on correct DESIGN.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Your levels, collision areas, rooms, whatever; If they are designed right, you can make it so they can't mess up on the even inaccurate stepped integrations. So, it's never been a question of 'physics engine', it's only been a question of how smart you really are when it comes to designing the actual game. This would be called 'cheating'.&lt;br /&gt;&lt;br /&gt;The difference here, is all of this is a beautiful, easy to plug into anything C/C++ class relying on the core components I have made. &lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Here's some balls moving around in the physical simulation. Note the time in the upper left (milliseconds / FPS) and the quantities of object in the upper right. &lt;span style="font-size: xx-small;"&gt;The broadphase method used is taking a bounding sphere for each object, then calculating the best axis based on the minimum position along x,y,z axes (O(N)) using the in-line variance sum ( 3*O(N) ), then taking that axis, and making a vector with all the minimum positions and pointer back to the object, sorting (O( log2(N)*N )), then running along that sorted interval list, and testing all unique overlapping interval pairs (O( N * m ), m is far less than N). This methods worst case is N^2, as in all broadphase systems, and it's best case is O( log2(N)*N ) because of the sorting. It performs very well and has no physical size restrictions, and it can use AABB's instead of spheres for greater reduction to m.&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_O5BsOfO48b0/TEr-AYuXwiI/AAAAAAAAAKw/YB2LZLcNd88/s1600/SomeBalls2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="233" src="http://1.bp.blogspot.com/_O5BsOfO48b0/TEr-AYuXwiI/AAAAAAAAAKw/YB2LZLcNd88/s400/SomeBalls2.png" width="400" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_O5BsOfO48b0/TEsE143Y8xI/AAAAAAAAAK4/mRjAD85f7KY/s1600/SomeBalls.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="233" src="http://1.bp.blogspot.com/_O5BsOfO48b0/TEsE143Y8xI/AAAAAAAAAK4/mRjAD85f7KY/s400/SomeBalls.png" width="400" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4044374934526922505-5842744195717273143?l=imaginaryz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://imaginaryz.blogspot.com/feeds/5842744195717273143/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4044374934526922505&amp;postID=5842744195717273143&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/5842744195717273143'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/5842744195717273143'/><link rel='alternate' type='text/html' href='http://imaginaryz.blogspot.com/2010/07/game-physics-we-got-balls.html' title='Game Physics - We got balls'/><author><name>Imaginary Z</name><uri>http://www.blogger.com/profile/05059116260376007206</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_O5BsOfO48b0/R1n4E03veuI/AAAAAAAAAAc/p0Q4WRLzwj0/S220/GargHead.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_O5BsOfO48b0/TEr-AYuXwiI/AAAAAAAAAKw/YB2LZLcNd88/s72-c/SomeBalls2.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4044374934526922505.post-8195073625603944593</id><published>2010-07-02T17:52:00.000-05:00</published><updated>2010-07-02T17:52:23.236-05:00</updated><title type='text'>Data &amp; Geordi - Shuttle Rave YTP</title><content type='html'>&amp;nbsp;IN CASE YOU DIDN'T NOTICE:&lt;br /&gt;&lt;br /&gt;&lt;object height="385" width="480"&gt;&lt;param name="movie" value="http://www.youtube.com/v/wB3rZ0GTSrU&amp;amp;hl=en_US&amp;amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/wB3rZ0GTSrU&amp;amp;hl=en_US&amp;amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;This is actually my first Vegas Project ever. So it's not that great.&lt;br /&gt;&lt;br /&gt;(WILL  FIX TOMORROW; Apparently codec was broken...)&lt;br /&gt;&lt;br /&gt;A preview of  things to come. Some (very bad) Editing, this is still 100% raw   footage.&lt;br /&gt;&lt;br /&gt;Star Trek : The Next Generation Season 3 Episode 08 - "  The Price"&lt;br /&gt;&lt;br /&gt;Music: &lt;a dir="ltr" href="http://www.youtube.com/watch?v=Nl4opbNt8_E" rel="nofollow" target="_blank" title="http://www.youtube.com/watch?v=Nl4opbNt8_E"&gt;http://www.youtube.com/watch?v=Nl4opbNt8_E&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4044374934526922505-8195073625603944593?l=imaginaryz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://imaginaryz.blogspot.com/feeds/8195073625603944593/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4044374934526922505&amp;postID=8195073625603944593&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/8195073625603944593'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/8195073625603944593'/><link rel='alternate' type='text/html' href='http://imaginaryz.blogspot.com/2010/07/data-geordi-shuttle-rave-ytp.html' title='Data &amp; Geordi - Shuttle Rave YTP'/><author><name>Imaginary Z</name><uri>http://www.blogger.com/profile/05059116260376007206</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_O5BsOfO48b0/R1n4E03veuI/AAAAAAAAAAc/p0Q4WRLzwj0/S220/GargHead.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4044374934526922505.post-7898377186113560971</id><published>2010-06-12T11:46:00.000-05:00</published><updated>2010-06-12T11:46:13.381-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='dragon'/><category scheme='http://www.blogger.com/atom/ns#' term='dream'/><title type='text'>Dream - Flying n' Dragons n Stuff'</title><content type='html'>Dream 2010-06-12&lt;br /&gt;&lt;br /&gt;There was some buildup; apparently something like a generic medieval fantasy plot; some random magical overlord type creature was taking over the generic kingdom and enveloping it in generic darkness and distributing generic dark villains over the generic lands. Generically.&lt;br /&gt;Well, me, mike, reed and zach were armored up to fight these things (These cool black-obsidian armor suits with colored light beams), and went about doing so. Running around the countryside, slaying doom-like demons and monsters with powerful weapons; well eventually we got into a castle, and ran through it mario galaxy style, eventually finding the end boss and kicking his ass easily. As a reward, it dropped this strange silver hang-glider looking apparatus; which, allowed you to glide-fly. &lt;br /&gt;So, you don the thing, and it spreads out like a pair of batwings/batman style. At that point, if you get a good running start, you generate enough lift (somehow) to go airborne, then you hand glide to gather height and momentum. I believe it had some sort of futuristic scram-jet on the back of the unit, because you were propelled quite fast, fast enough you would actually fly (airspeed) even in real life.&lt;br /&gt;Since I happened to be the plane guy, I tried it first. It was amazing.&lt;br /&gt;No dream about generic flying could beat this; I could run, jump and take off into the air, gliding with minimal effort, flapping my wings if necessary for a quick change in course. It was like being a bird, you could soar over landscapes, dive down through rings and even shoot your enemies down while flying. With practice you could gain altitude in any condition as well, so there were no gliding limitations.&lt;br /&gt;Well, we had to go onto level two, so I was designated "dragon-man" because I could fly + shoot plasma via plasma rifle. Level two was much harder, and required some tricky aerial switch throwing, IE dropping bridges and the like to allow the companions time to maneuver over. At this point, things got difficult, and we were forced to split up, I solo, and the other three as a strike force on the ground. I flew on ahead, taking out defenses and barriers from above, fighting some of the larger sky-predators as well. The ground team pressed down into the caverns to destroy the generators powering the evil machines that created force fields and creatures.&lt;br /&gt;Eventually, I got bored of being a human with a flying suit, so I typed in a cheat code and just became a dragon instead. A big red cartoony looking one, was pretty strange. (Kinda, I have a model I made of the exact creature) Technically, no abilities changed, except that shooting plasma/fire was much more powerful and much faster, although I had a shot-cap, so I couldn't fire more than 8 fireballs at a time, like old arcade games.&lt;br /&gt;Being the dragon, I could maneuver in the air way easier, and hover if I needed to, plus gain a free attack bonus on everything I did, and intimidation for lesser enemies. After assaulting the tower, I flew down into the caverns to rejoin my team; turned out they were doing just fine even without flying ability, so when I met up with them they kinda freaked a little, but figured out it was me pretty quickly. (cue mustache gesture)&lt;br /&gt;Then, we tag teamed moving up this complex twisted tower, full of odd gravity puzzles like super mario galaxy, moving blocks, fighting vastly upgraded iron knuckles, hitting switches, fending off mobs, solving puzzles... It had just about everything you like to do in video games, but a flexibility in approach that was unmatched by any. You could kill all the enemies, use the environment to your advantage, negotiate, threaten, or even just slip by unnoticed. There was no set "objective" to complete except the main one, although every decision had consequences. Eventually, after winding up this long tower, we came to an impasse; The only way to go was up, and I couldn't carry anyone thanks to load restrictions (wasn't THAT great of a dragon).&lt;br /&gt;So I grabbed an extra gun, and went upward to fight the boss myself. Turns out, it was some generic lich demon that had no real purpose in taking over the world. I'm sure it explained some crap to me, but I just shot at it instead of wasting time talking. It ran around like the end boss (The Campaigner I think) in the N64 Turok game; Was very hard to hit. Eventually he went down, but then morphed into this giant darkness form; And began the generic projectile-pause-claw swipe-pause-vortex loop of attacking. However I was privy to physical knowledge, it never was able to even hit me in that form, and eventually gave up on it and morphed into it's TRUE form, which was some weird looking alien-dinosaur skeleton with rotted flesh dripping off it (think Odin Sphere's King Gallon). That made the fight hard, since I had trouble determining the weak spot without an obvious bright red heart to pummel. Eventually I gave up because plasma and fire was useless, and just physically tackled the thing and tore it's head off; instantly killing it but making me lose dragon powers and flight wing just like mario when he collides with an enemy.&lt;br /&gt;So there I was, atop the tower splattered with rotted blood, rifle scattered on the ground, darkness turning to light again, and no friends nearby (they can;t get up the tower, lol). I just looked off into the distance wishing I could fly again, because that was freakin awesome.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I was *about* to re-don the flight suit, but then, horror of horrors:&lt;br /&gt;&lt;br /&gt;The cat woke me up. I took every measure to prevent this from happening. But it still meowed and woke me up anyways. &lt;br /&gt;&lt;br /&gt;$@#^*(#$&amp;amp; Data.&lt;br /&gt;&lt;br /&gt;-Z&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4044374934526922505-7898377186113560971?l=imaginaryz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://imaginaryz.blogspot.com/feeds/7898377186113560971/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4044374934526922505&amp;postID=7898377186113560971&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/7898377186113560971'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/7898377186113560971'/><link rel='alternate' type='text/html' href='http://imaginaryz.blogspot.com/2010/06/dream-flying-n-dragons-n-stuff.html' title='Dream - Flying n&apos; Dragons n Stuff&apos;'/><author><name>Imaginary Z</name><uri>http://www.blogger.com/profile/05059116260376007206</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_O5BsOfO48b0/R1n4E03veuI/AAAAAAAAAAc/p0Q4WRLzwj0/S220/GargHead.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4044374934526922505.post-4680398809376674091</id><published>2010-06-11T16:43:00.000-05:00</published><updated>2010-06-11T16:43:59.256-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='xgfx'/><category scheme='http://www.blogger.com/atom/ns#' term='ghost'/><category scheme='http://www.blogger.com/atom/ns#' term='core'/><category scheme='http://www.blogger.com/atom/ns#' term='code'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='xcore'/><category scheme='http://www.blogger.com/atom/ns#' term='opengl'/><category scheme='http://www.blogger.com/atom/ns#' term='mingl'/><category scheme='http://www.blogger.com/atom/ns#' term='blender'/><title type='text'>GHOST, Mingl, XCore, Core, XGFX</title><content type='html'>Continually working on improving all the above components;&lt;br /&gt;&lt;br /&gt;Here is a quick overview of what all this garbage is:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;ghost &lt;/b&gt;- Lets you make programs for X11,  Windows, Mac&lt;br /&gt;&lt;b&gt;mingl &lt;/b&gt;- Draws stuff in hardware lingo&lt;br /&gt;&lt;b&gt;core &lt;/b&gt;-  Does everything you don't want to write yourself&lt;br /&gt;&lt;b&gt;xcore &lt;/b&gt;- Does  things you should be doing anyways&lt;br /&gt;&lt;b&gt;xgfx &lt;/b&gt;- Makes everything look  pretty + move around&lt;br /&gt;&lt;br /&gt;In more details:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;GHOST&lt;/b&gt; - Made primarily by the Blender.org guys; this is their generic host operating system toolkit; In other words, this is the code that allows you to receive low level input events and a OpenGL context; And the ability to create windows and draw to them/receive messages from them. I've heavily modified it to include some more game-friendly features, timing looks, multithreading and some specialized input event abstractions, joysticks support and other goodies. It's at least as good as SDL, and in many ways, far superior. Hard to find something better than code that has been attacked by many people.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Mingl&lt;/b&gt; - "Minimum Graphics Library"; essentially a wrapper around OpenGL; but, it's designed to specifically mimic OpenGL 3.0 specifications, and does an insanely good job of managing more annoying aspects of OpenGL programming; It makes writing graphical routines trivial, where you may spend hours trying to orient yourself in 3D space using any other toolkit (that includes you, blender. F*** your armature space conventions!). However, it's also interface abstracted just like GHOST, so it can use OpenGL, DirectX, software... it doesn't care. But it is primarily designed to expose low level hardware techniques to force you to write more efficient graphics code; and does a ton of things internally (like managing VBO/IBO/RC, states, transformations, ect...). It is still missing FBO operations, but those are trivial if you have a GL 2.0 + system (just need to sit down and do this)&lt;br /&gt;&lt;br /&gt;&lt;b&gt;XCore&lt;/b&gt; -&amp;nbsp; Operating system and hacking level tools. A quite extensive library I made of tools I use frequently, such as texture conversions from DXT to / from anything, mathematical algorithms, VA/IA generation algorithms, numerical methods, statistics, even some unique IK algorithms and other tools. IT also contains agressive memory management and a slew of commonly used structures.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Core&lt;/b&gt; - The heart of everything; Based on the std C++ library; core contains separate components that should not rely on any one other component, like vec3 vec4, matrix3x3, matrix4x4, index_array, geo, and a lot of other commonly used, but often not needed tools. Chances are if you need any one of these tools, you need all of them.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;XGFX&lt;/b&gt; - My rendering system built ontop of using mingl as the renderer interface. IS still under construction for the resource abstraction and management of massive resources.&lt;br /&gt;&lt;br /&gt;No good screenshots; Just the city level again after implementing multithreaded loading + mingl improvements.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_O5BsOfO48b0/TBKt2S-o8aI/AAAAAAAAAKg/hXipDu9R6SU/s1600/thecity.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="233" src="http://2.bp.blogspot.com/_O5BsOfO48b0/TBKt2S-o8aI/AAAAAAAAAKg/hXipDu9R6SU/s400/thecity.PNG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4044374934526922505-4680398809376674091?l=imaginaryz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://imaginaryz.blogspot.com/feeds/4680398809376674091/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4044374934526922505&amp;postID=4680398809376674091&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/4680398809376674091'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/4680398809376674091'/><link rel='alternate' type='text/html' href='http://imaginaryz.blogspot.com/2010/06/ghost-mingl-xcore-core-xgfx.html' title='GHOST, Mingl, XCore, Core, XGFX'/><author><name>Imaginary Z</name><uri>http://www.blogger.com/profile/05059116260376007206</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_O5BsOfO48b0/R1n4E03veuI/AAAAAAAAAAc/p0Q4WRLzwj0/S220/GargHead.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_O5BsOfO48b0/TBKt2S-o8aI/AAAAAAAAAKg/hXipDu9R6SU/s72-c/thecity.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4044374934526922505.post-2915167737187511155</id><published>2010-06-04T19:05:00.000-05:00</published><updated>2010-06-04T19:05:54.414-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='xgfx'/><category scheme='http://www.blogger.com/atom/ns#' term='code'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='xcore'/><category scheme='http://www.blogger.com/atom/ns#' term='opengl'/><category scheme='http://www.blogger.com/atom/ns#' term='mingl'/><category scheme='http://www.blogger.com/atom/ns#' term='blender'/><title type='text'>TED Exporting + Mingl</title><content type='html'>"Walk the Walk"&lt;br /&gt;&lt;br /&gt;I talk a lot of smack about things that I do. It's really nice when I visit artists that I can actually pop open their files and show them how to export them so I can load them in game.&lt;br /&gt;&lt;br /&gt;It's much easier to convince people you aren't just blowing smoke when you can show them what you are doing in real time. Hard to dispute that kind of presentation.&lt;br /&gt;&lt;br /&gt;So, more improvements on the TED file's; the exporter is more robust, and I'm in the process of verifying the data output is correct. So far this seems to be true, I've seen textures, models, scenes, and just about everything in the file working perfectly, especially animations. It's wonderful to just be able to load in a file directly exported from blender, and import it, then see your work immediately and accurately duplicated in a realtime game.&lt;br /&gt;&lt;br /&gt;So here are some example shots; the next long haul is building the xgfx resource management system so I can maintain a logical coherence for all of these vastly different resources + files. Resources are essentially reference counted, but are not cleared until flagged to do so. Instance objects exist physically, so once they terminate they just dump all data. Plenty of re-use optimizations, tons of weird paradigms like "resource-source-instance" ideas with meshes; But this will be demonstrated eventually.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_O5BsOfO48b0/TAmTpr5m6sI/AAAAAAAAAKY/TK09aQhlviQ/s1600/TEDFiles2_animated.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="225" src="http://4.bp.blogspot.com/_O5BsOfO48b0/TAmTpr5m6sI/AAAAAAAAAKY/TK09aQhlviQ/s400/TEDFiles2_animated.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;In order from top left clockwise;&lt;br /&gt;&lt;br /&gt;Rayne from BloodRayne on PC with a static keyframe applied,&lt;br /&gt;two of my custom levels,&lt;br /&gt;Charizard from Super Smash Brothers Brawl on Wii with standard_wobble applied and hacked texture&lt;br /&gt;another custom level,&lt;br /&gt;The first boss from Dragon Blade on Wii, with wobble, note the material colors are showing now; easily removed.&lt;br /&gt;Bowser Trophy from Super Smash Brothers Brawl on Wii&lt;br /&gt;Rayquaza Boss from Super Smash Brothers Brawl on Wii with wobble.&lt;br /&gt;&lt;br /&gt;Looks like I need a damn artist.&lt;br /&gt;&lt;br /&gt;-Z&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4044374934526922505-2915167737187511155?l=imaginaryz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://imaginaryz.blogspot.com/feeds/2915167737187511155/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4044374934526922505&amp;postID=2915167737187511155&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/2915167737187511155'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/2915167737187511155'/><link rel='alternate' type='text/html' href='http://imaginaryz.blogspot.com/2010/06/ted-exporting-mingl.html' title='TED Exporting + Mingl'/><author><name>Imaginary Z</name><uri>http://www.blogger.com/profile/05059116260376007206</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_O5BsOfO48b0/R1n4E03veuI/AAAAAAAAAAc/p0Q4WRLzwj0/S220/GargHead.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_O5BsOfO48b0/TAmTpr5m6sI/AAAAAAAAAKY/TK09aQhlviQ/s72-c/TEDFiles2_animated.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4044374934526922505.post-767428777011909273</id><published>2010-05-31T00:09:00.002-05:00</published><updated>2010-05-31T00:10:43.411-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='dragon'/><category scheme='http://www.blogger.com/atom/ns#' term='code'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Fencing - Problem Solved</title><content type='html'>4 days of brain bashing of a very complex error to track it down and slay it.&lt;br /&gt;&lt;br /&gt;At first, the program would crash if run outside of debug mode.&lt;br /&gt;&lt;br /&gt;"Okay, so it must be a memory overrun, and I'm writing past the end of the array, because the debugger puts padding for detection against clobbering memory"; which looks like this:&lt;br /&gt;&lt;br /&gt;uchar myarray[ 10 ];&lt;br /&gt;myarray[ 10 ] = 60; //WHOA, myarray holds 10 ELEMENTS, so position 10 is the 11th element.&lt;br /&gt;&lt;br /&gt;Often called a fence, I couldn't find it. What was weirder, std::string was throwing errors. std::map was having kittens. and ntdll seemed to vomit all over the floor at this party from hell.&lt;br /&gt;&lt;br /&gt;As I burrowed into the code, seething rage ignited; was I being burned by out of date compilers? Was my code wrong? What had I done? What had THEY done wrong?&lt;br /&gt;&lt;br /&gt;This project had it all, nested complex templates, deep inheritance heirarchies, large blocks of data and nasty C algorithms. Luckly, most of my (good) code has __debug_regression defined, so I was able to quickly rule out very large segments of code against error with a single look back at passed test dates.&lt;br /&gt;&lt;br /&gt;But my mind was going, Dave.&lt;br /&gt;&lt;br /&gt;I ignored the fact that if my code worked in debugging, then only the heap allocation method would cause 0xc0000005 errors thanks to ntdll 's nice memory bounding protection (mainly protects it from 0xBAADFOOD but yeah)&lt;br /&gt;&lt;br /&gt;So, I eventually upgraded my compiler, my debugger, brought in the help of my custom designed memory heap manager (igtl_MMHeapSystem; I love you, I LOVE YOU! OH GOD YOU'RE SO SEXY MMMMM*codepronz*) and tracked down the offending bug. Hours of poking and prodding landed me with a really surprisingly simple conclusion.&lt;br /&gt;&lt;br /&gt;I was off by one.&lt;br /&gt;&lt;br /&gt;I'd been accused of being off kilter, off base, and not even on this world, but one? Off by one causes these insanely weird errors? Why did the debugger not detect the stack corruption? Why did the heap manager skip telling me I was writing one integer past my array? Why did absolutely none of the tools find this till I made my own?&lt;br /&gt;&lt;br /&gt;Here's why:&lt;br /&gt;&lt;br /&gt;When my array was writing past the end of it's detection, it wrote (coincidentally) over the bad food word. But, in the running of the program, that error PROPOGATED until some time later, when the error detection actually scanned memory; because no one in their right mind scans every single memory allocation (super slowness). By the time a scan actually occured, it was too late and bizzaro values had multiplied. But only in a small well contained region. That is, inside of a system dll I don;t have debug points in. Ironically, since the error affected nothing else in MY code, it really screwed up ntdll, and cause it to throw weird errors all over the place.. So, my code was just missing a +1, but the stack was being blow to pieces thanks to trying to protect itself.&lt;br /&gt;&lt;br /&gt;Moral of the story?&lt;br /&gt;&lt;br /&gt;Make sure to take a nice drink if you run into a hard problem. Usually, it's just something stupid. I use High Gravity Steel Reserve.&lt;br /&gt;&lt;br /&gt;-Z&lt;br /&gt;&lt;br /&gt;Here's some preliminary results with a nifty 3 instruction toon shader I made: (&amp;lt;3 Mecha Dragon)&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_O5BsOfO48b0/TANEepF_HDI/AAAAAAAAAKQ/CZ6ZW8_f2yY/s1600/ProblemsSolved.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="225" src="http://3.bp.blogspot.com/_O5BsOfO48b0/TANEepF_HDI/AAAAAAAAAKQ/CZ6ZW8_f2yY/s400/ProblemsSolved.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4044374934526922505-767428777011909273?l=imaginaryz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://imaginaryz.blogspot.com/feeds/767428777011909273/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4044374934526922505&amp;postID=767428777011909273&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/767428777011909273'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/767428777011909273'/><link rel='alternate' type='text/html' href='http://imaginaryz.blogspot.com/2010/05/fencing-problem-solved.html' title='Fencing - Problem Solved'/><author><name>Imaginary Z</name><uri>http://www.blogger.com/profile/05059116260376007206</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_O5BsOfO48b0/R1n4E03veuI/AAAAAAAAAAc/p0Q4WRLzwj0/S220/GargHead.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_O5BsOfO48b0/TANEepF_HDI/AAAAAAAAAKQ/CZ6ZW8_f2yY/s72-c/ProblemsSolved.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4044374934526922505.post-2353896187485352854</id><published>2010-05-28T19:41:00.001-05:00</published><updated>2010-05-28T19:43:25.501-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='dragon'/><category scheme='http://www.blogger.com/atom/ns#' term='code'/><category scheme='http://www.blogger.com/atom/ns#' term='mingl'/><category scheme='http://www.blogger.com/atom/ns#' term='assembly'/><title type='text'>CURSES!</title><content type='html'>I've been fighting some errors for a while now with my importer code;&lt;br /&gt;&lt;br /&gt;Eventually (2 days of brain bashing) I figured this out:&lt;br /&gt;&lt;br /&gt;0xC0000005 errors are normal; But they're a good hint into memory over-walking.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Turns out, you can;t do this anymore (used to be able to; I'll figure out the fix):&lt;br /&gt;&lt;br /&gt;struct myvec{ float x,y,z; } //Nicely packed struct takes up 12 byts, 3 floats in order.&lt;br /&gt;&lt;br /&gt;float myfloats[9] = { 0, 0, 0, 10, 15, 10, -5, -10, 0 };&amp;nbsp; //Nicely packed float coordinates.&lt;br /&gt;&lt;br /&gt;myvec somevecs[3]; //Make some vectors&lt;br /&gt;&lt;br /&gt;memcpy( &amp;amp;somevecs[0].x,&amp;nbsp; &amp;amp;myfloats[0], sizeof(float) * 9 );&amp;nbsp; //Copy them in!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Before you scream at this; Note that this works perfectly lots of times. Apparently, there are some rare cases you can cause this to break and GDB is helpless in figuring out you just walked passed the save/writable zone in an array. It's really hard to get this kind of thing detected, especially when using pointer casts.&lt;br /&gt;&lt;br /&gt;Basically, if you run into a situation in which you find yourself doing this; Please stop and redesign your code so you do not have to do this. Unfortunately, there is no "fast" solution without redesigning some kickass wrappers and C-style code; but if you OOP this, you run into massive overhead and ultra slowdown from all these specialized copy operations; So, what can you do.&lt;br /&gt;&lt;br /&gt;In my testing, caching blocks of floats seems to work best, then just forcing your user to slowly copy them into their structures. Although, I don't do that, because I redesign my structure to WORK with a float * internally so this can be as fast as possible and still lexically coherent.&lt;br /&gt;&lt;br /&gt;What a $(#@^&amp;amp; problem.&lt;br /&gt;&lt;br /&gt;-Z&lt;br /&gt;&lt;br /&gt;Here's a picture. .TED files contain a lot of information; Once I clean up this stupid problem I'll post more goodies. By the way, these are models from the PC game "&lt;a href="http://www.i-dragon.com/"&gt;I of the Dragon&lt;/a&gt;" because I don;t want to show my models until they look somewhat decent. Obviously, again, I'll never use these; They're only good test sets to play with.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_O5BsOfO48b0/TABikGQHR2I/AAAAAAAAAKI/aVpyTq4awe4/s1600/MinglCrapTEDDammit.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_O5BsOfO48b0/TABikGQHR2I/AAAAAAAAAKI/aVpyTq4awe4/s320/MinglCrapTEDDammit.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4044374934526922505-2353896187485352854?l=imaginaryz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://imaginaryz.blogspot.com/feeds/2353896187485352854/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4044374934526922505&amp;postID=2353896187485352854&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/2353896187485352854'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/2353896187485352854'/><link rel='alternate' type='text/html' href='http://imaginaryz.blogspot.com/2010/05/curses.html' title='CURSES!'/><author><name>Imaginary Z</name><uri>http://www.blogger.com/profile/05059116260376007206</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_O5BsOfO48b0/R1n4E03veuI/AAAAAAAAAAc/p0Q4WRLzwj0/S220/GargHead.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_O5BsOfO48b0/TABikGQHR2I/AAAAAAAAAKI/aVpyTq4awe4/s72-c/MinglCrapTEDDammit.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4044374934526922505.post-2539782763152701624</id><published>2010-05-14T18:17:00.001-05:00</published><updated>2010-05-14T18:30:33.358-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='data structures'/><category scheme='http://www.blogger.com/atom/ns#' term='dragon'/><category scheme='http://www.blogger.com/atom/ns#' term='blender python'/><category scheme='http://www.blogger.com/atom/ns#' term='opengl'/><category scheme='http://www.blogger.com/atom/ns#' term='mingl'/><category scheme='http://www.blogger.com/atom/ns#' term='blender'/><title type='text'>TED file format; Restricted XML</title><content type='html'>Ever notice how awful XML documents are?&lt;br /&gt;&lt;br /&gt;Well, I upgraded my model exporter from blender to 2.49b; so now, instead of the annoying variety of formats I used to use (obm, arf, brf arf2.0, brf3.0, grf, iRF) I decided to spec out a more logical, easier to understand but far more byte/size inefficient DXML format.&lt;br /&gt;&lt;br /&gt;I call it "TED" (Text Extracted Data).&lt;br /&gt;&lt;br /&gt;The goal of TED files is to export the maximum usable, useful information out of Blender 2.49b+.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;This includes Meshes, Armatures, Animations, Objects, Materials, Textures, and some scripting and logic elements. Meshes should contain enough data to be GLSL renderable (IE normals, tangents, uv layers, parameters).&lt;/li&gt;&lt;li&gt;TED files must also conform to a very strict file standard, so there will be NO allowed coordinate systems other than the &lt;a href="http://en.wikipedia.org/wiki/Right-hand_rule"&gt;default universal correct system&lt;/a&gt; (RHR, +X forward, +Y left, +Z up; This is universal for ALL transforms. Matrices also have a standard definition of Xx Xy Xz Yx Yy Yz Zx Zy Zz where X is the forward axis, Y is the left axis, Z is the up axis. Quaternions follow these definitions as well.)&amp;nbsp;&lt;/li&gt;&lt;li&gt;TED files must be easy to read in; Though they are not (byte) efficient, they should contain "hints" for a loader so it may allocate elements beforehand; for example declaring the number of elements in an array before reading it in. You might notice .TED files can be &lt;/li&gt;&lt;li&gt;TED files must maintain a logical and render-system friendly data model; And must encapsulate all data elements; No element can have differing types of data; ergo a tag can store an array of strings, an array of ints, an array of floats, or other tags ONLY.&lt;/li&gt;&lt;/ul&gt;Why TED files? Because my old exporters did not generate shader code or export tangent vectors. Also, the old exporters somewhat obsfuscated the data, and did not present it in a correct hardware manner; There are fixed graphical paradigms in working with 3D polygonal data; TED files will adhere to them strictly and yet maintain enough data to be edit-friendly.&lt;br /&gt;&lt;br /&gt;What TED files should NOT be used for:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Final game data (you should convert to your own or local host format)&lt;/li&gt;&lt;li&gt;Final Level descriptions (TED files do not provide hashing or optimizations or portals of scenes)&lt;/li&gt;&lt;li&gt;Replacing something you already understand (unless it has something you need; just make a converter to convert TED to whatever) &lt;/li&gt;&lt;/ul&gt;TED files could possibly be placed in direct competition with other formats, such as "&lt;a href="http://www.ogre3d.org/wiki/index.php/Main_Page"&gt;OGRE XML&lt;/a&gt;", "&lt;a href="https://collada.org/mediawiki/index.php/COLLADA_-_Digital_Asset_and_FX_Exchange_Schema"&gt;COLLADA&lt;/a&gt;", "&lt;a href="http://www.martinreddy.net/gfx/3d/OBJ.spec"&gt;Alias Wavefront .obj&lt;/a&gt;", "&lt;a href="http://local.wasp.uwa.edu.au/%7Epbourke/dataformats/directx/"&gt;Direct X 8.0 .x&lt;/a&gt;" and other such lexical, human readable formats. None of those formats contained all of data I wanted to use, therefore I made .TED files. It would be a trivial exercise to convert FROM TED files to those formats, but the other way around is much more difficult due to those other formats inefficiencies and shortfalls in dealing with hardware level data. Yes, I've used all those formats before, and yes I have used and loaded .3ds, .mshp, .md2 .md5 and many many others. So no, the format you are thinking of also sucks.&lt;br /&gt;&lt;br /&gt;I have not made the exporter for 2.5.2 yet because I have been burned many times by blender changing specifications mid-stream on me. Luckily, the ted exporter is written to avoid this as much as possible; but when more alpha versions come out I will snap one in easily. Until then, 2.49b it is.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;If I could show you a .TED file I would; but HTML can't understand &amp;lt; &amp;gt; signs.&lt;br /&gt;&lt;br /&gt;Have a dragon instead (All credit goes to &lt;a href="http://www.gamespot.com/wii/action/dragonbladewrathoffire/"&gt;DragonBlade from the Wii&lt;/a&gt;; Obviously I'll never use this model, it just happens to be the first example I picked) &lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_O5BsOfO48b0/S-3Y3-gzcNI/AAAAAAAAAKA/pP5oE0qDbws/s1600/TEDConverterData.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="225" src="http://2.bp.blogspot.com/_O5BsOfO48b0/S-3Y3-gzcNI/AAAAAAAAAKA/pP5oE0qDbws/s400/TEDConverterData.png" width="400" /&gt;&lt;/a&gt;&lt;br /&gt;Blender on the left, mingl without GLSL on the right (in-game)&lt;br /&gt;&lt;br /&gt;-Z&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4044374934526922505-2539782763152701624?l=imaginaryz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://imaginaryz.blogspot.com/feeds/2539782763152701624/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4044374934526922505&amp;postID=2539782763152701624&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/2539782763152701624'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/2539782763152701624'/><link rel='alternate' type='text/html' href='http://imaginaryz.blogspot.com/2010/05/ted-file-format-restricted-xml.html' title='TED file format; Restricted XML'/><author><name>Imaginary Z</name><uri>http://www.blogger.com/profile/05059116260376007206</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_O5BsOfO48b0/R1n4E03veuI/AAAAAAAAAAc/p0Q4WRLzwj0/S220/GargHead.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_O5BsOfO48b0/S-3Y3-gzcNI/AAAAAAAAAKA/pP5oE0qDbws/s72-c/TEDConverterData.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4044374934526922505.post-43812583813262714</id><published>2010-04-12T16:42:00.000-05:00</published><updated>2010-04-12T16:42:09.057-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='dream'/><title type='text'>Nathan + Dinosaurs = WTF?</title><content type='html'>Dream 2010-04-12&lt;br /&gt;&lt;br /&gt;Summary:&lt;br /&gt;&lt;br /&gt;Mal works for a space mine, enters a dimensional portal, meets creatures that seem to have come from &lt;a href="http://en.wikipedia.org/wiki/Dinosaurs_%28TV_series%29"&gt;"Dinosaurs"&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Details:&lt;br /&gt;&lt;br /&gt;Mostly fuzzy; But I remember this &lt;a href="http://en.wikipedia.org/wiki/Asteroid_mining"&gt;space mine&lt;/a&gt; working on some sort of larger extrasolar object in some small star system; It was a rather rich deposit of extremely rare and non-natural elements (that's right, this SOB had &lt;a href="http://en.wikipedia.org/wiki/Periodic_table"&gt;naturally occurring elements&lt;/a&gt; heavier than uranium!) so, they were mining it for fuel. Well, &lt;a href="http://en.wikipedia.org/wiki/Nathan_Fillion"&gt;Nathan Fillion &lt;/a&gt;apparently was the star of this episode (Damn you, &lt;a href="http://doctorhorrible.net/"&gt;Captain Hammer&lt;/a&gt;!) and after losing his wife and kids in some sort of car-accident; he continued working his mining job. Well, someone discovered an anomaly, some sort of portal, and after some testing they decided to send a human in without telling any outsiders. Being a space mine, you go to the place to work, and don't return for quite some time, so this was easy to keep secret, always a lot of illicit practices in these sorts of "prying eye" isolated situations.&lt;br /&gt;The backdrops looked like any stereotypical deep earth mine, large steel girders lining large elevator shafts, domed, reinforced ceilings and plenty of weird looking mine equipment (I've been in a few myself, so if you've never been in a mine, look it up!). Well, the anomaly was just some sort of large blurred region of space, and, well they voted Mal up to jump in, since he had nothing to lose. Would certainly end his pain or make him a hero, so why not? He obviously didn't feel that way, but, eventually consented and in a rather Mal-like way, just ran into the damn thing with no warning.&lt;br /&gt;Well, upon entering the other side, it was a direct seamless transition to this darker world, there was breathable air, survivable pressure (~1.2 atm, similar to being under 2m of water on earth), and reasonable temperature (~87 F). Well, comically, the portal was above ground, and lands our hero in a are filled with &lt;a href="http://en.wikipedia.org/wiki/Cycad"&gt;cycad like&lt;/a&gt; trees. Naturally, he was now screwed as he could not get back up to the portal, and wanders around. Eventually, he finds he is near an ocean, and can see civilization by the hallmark of regular geometric shapes being constructed near the sea shore. Upon investigating, he finds all of the structures heavily damaged by some sort of raging sea current, and promptly leaves after finding some really disturbing skeletal parts; Not human, but some sort of alien/dinosaur like parts.&lt;br /&gt;The sky in this are was black, grey at the edges, but seemed to emit light ambiently, as if there was light coming from the sky, but it was only visible in reflections off the earth. There were no stars visible, the sea was also black, must be some odd light-absorbing pigments in the world chemistry; &lt;br /&gt;Well, this part gets a little fuzzy, but somehow Mal runs into this teenage dinosaur, and they become allies, and he introduces him to their world, and becomes some sort of science project, blah blah generic plot basically. Mal almost gets into a fight with a small gang of dinosaurs, but being Mal smart talks them out of it, gaining respect from the gang. I remember something about deeply rooted political messages, environmental concerns, societal oddities about sex and crudeness; Was a really interesting situation;&lt;br /&gt;But! His friend helps him get back to the portal, so he can return home, which the mining company didn't expect, but he brought back a few artifacts to prove he was gone, and destroys access to the portal (to save his friends in the other world). &lt;br /&gt;&lt;br /&gt;So yeah, the social parts were hazy at best; not 100% sure what actually happened, though it would be trivial for any Firefly fan to fill in the gaps with some terrible fanfic writing.&lt;br /&gt;&lt;br /&gt;-Z&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4044374934526922505-43812583813262714?l=imaginaryz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://imaginaryz.blogspot.com/feeds/43812583813262714/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4044374934526922505&amp;postID=43812583813262714&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/43812583813262714'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/43812583813262714'/><link rel='alternate' type='text/html' href='http://imaginaryz.blogspot.com/2010/04/nathan-dinosaurs-wtf.html' title='Nathan + Dinosaurs = WTF?'/><author><name>Imaginary Z</name><uri>http://www.blogger.com/profile/05059116260376007206</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_O5BsOfO48b0/R1n4E03veuI/AAAAAAAAAAc/p0Q4WRLzwj0/S220/GargHead.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4044374934526922505.post-3940671309470253593</id><published>2010-04-01T17:07:00.001-05:00</published><updated>2010-04-01T17:07:48.925-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='dream'/><title type='text'>Dream: Splinter Silent Snake Solid Hill Cell</title><content type='html'>Dream: 2010-04-01&lt;br /&gt;&lt;br /&gt;Summary:&lt;br /&gt;&lt;br /&gt;Recurring dream mixing metal gear and splinter cell and silent hill&lt;br /&gt;&lt;br /&gt;Details:&lt;br /&gt;&lt;br /&gt;This is a recurring dream; as such, the majority of events are similar to all the previous reincarnations of the dream, with only minor changes. I'd say it's very graphic, and horrible. (how often do you get to disembowel things anyways?) Definitely nightmare quality.&lt;br /&gt;&lt;br /&gt;So, the dream usually starts out, you take the movie-role of this gray haired, grizzled marine in his 60's; Getting a debrief from president Kennedy about a mission to stop a Russian bioweapon from being released. Your main character looks a lot like a regular chisel jawed blond haired blue eyed German marine, constant fatigues, side bowie knife, a poker face that could break glass, and plenty of gnarled features indicating a slew of victories. Always looks angry though, the beret slightly off kilter, as if asking any young punk with enough balls to mention that was the wrong angle, just to start a fight.&lt;br /&gt;Kennedy gave you a top secret clearance, and this dark green folder with information on this russian woman (naturally in a black latex suit with dark red hair and goth-style accenture; d-cup) who is in charge of the train shipment of the materials needed to create the bioweapon.&lt;br /&gt;You repeatedly ask for more information on the bioweapon, as it is obvious no marine can withstand that kind of weaponry, a bit like trying to punch a landmine. No information is given, apparently this whole thing is hush-hush since it would severely escalate tensions.&lt;br /&gt;Switch scenes to a large cargo plane, four engines and a regular "Red Cross" drop mission of aid, with you secretly stowed on board; jumping off for a night skydrop to land deep in a pine forest, silently, and with plenty of guns and ammo to take out a small militia.&lt;br /&gt;At this point I'll describe the scenery to get an idea of the feelings invoked, since text leaves a lot of detail out. It's about 0320 (sun relative time), damp is forming on all the leaves, you can feel the earth cooling; but it was mid-summer, so the respite from burning heat is welcome. At night, you can hear trucks in the distance, men barking commands, the train had stopped here, secretly, the moon was not out, so darkness was impressive, seeing farther than 20 or more feet was impossible, what lay in the unknown was a mystery; it was likely there were infra-red autoturrets posted around the site, more than likely landmines or classic beartraps laid to thwart and unprepared soldier; classic tripwires and claymores a traditional favorite. All of the trees were dark and tall, traditional pines, the forest floor was mostly cleared; unsure why. There was a rich smell of damp in the air, mostly the dew pervading. Knowing this mission was essentially suicide, as you were ordered to stop this train and shipment at all costs didn't help your mentality; smoking would simply trip an alarm and get you shot early.&lt;br /&gt;Moving cautiously, using all of your available skill to avoid the assumed traps; luckily there were none. There were only 6 guards, and only off duty ones. The train may contain secrets, but would it be better to follow the train to it's destination and discover where the base was, using your e-rad to signal your location? &lt;br /&gt;Apparently, you decide to sneak onto the train, and quickly find out that is impossible; as the train is a unusual design, it looks out of place, a futuristic, slightly blue steel color; No visible doors or windows, it had the feel of an airstream trailer, but quite a few of them connected.&lt;br /&gt;Somehow there is a gap in memory, and it's 1240, afternoon sun glaring down producing a high 90's heat. You had found the camp, and damaged the rail tracks so the train could not make it's shipment, and radioed the position, all without being seen, detected, or killing/alerting anyone. Now you wanted blood; you could see your female target having a cigarette with an AK-47 slung across her back; she was still wearing the ridiculous black leather getup, lol fanservice I guess. Anyways, you strafe one of the smaller buildings, to get a look inside and see if you can start causing some havok; well, inside of this "small" building is a solid black cat; it approaches you, it's rather friendly. Inside the building is a darker red metal decor, lots of white plastic spherical containers and hoses connecting them, leading to a side chamber. This was no building, it was a gas chamber to test the bioweapon.&lt;br /&gt;Immediately you move to sneak out, but the door slams shut and the alarms and lights go off; gas of a light yellow color begins to come from some of the hoses. You whip out your mask and use the cat to determine what the gas would do; holding it with a knife to it's neck so you wouldn't make it suffer too much. The cat seems annoyed, but entirely unaffected by the gas. IT wasn't an irritant, or mutagen, or anything obvious; You put the cat down, the room now hazy with this thick gas; it doesn't stick to you skin either. Time splits, since this is a dream, and you become two instances in time, one of them NOT having entered the chamber, and sneaking to a larger building, the other entering the secondary chamber ,where there were larger plastic cylinders and spheres with other colored chemicals. In that reality, the cat follows and a door from nowhere slams shut like a guillotine; and a greenish gas pours out, immediately burning the skin like fire; the poor cat's eyes begin to melt and it begins hacking up blood, so you mercifully cut it's head off; then quickly gut the can and use it's hide to protect other regions on your body while you wait for the gas to time out. The green gas left unusual burns on the skin, but otherwise seemed to just be a extremely toxic agent. Well, in that reality, turns out the gas penetrates clothing, and while you are basically chemically burned alive, searing agonizing pain; trying to break the door down or stop the system or just escape, you cant, and get to suffer the agony of death, and fail your mission.&lt;br /&gt;Now imagine for a moment, YOU were that person. And also assume that you could not tell it wasn't a dream (lucid). You're trapped in a sold metal box, nothing but dangerous storage vats of chemicals in the corners and ceiling, tubing piping a agent capable of melting your epidermis, And the door is magnetically sealed, and at least a centimeter thick. Unhinged and sliding into the other side about a half a foot too. Basically, you are dying a horrible death, and there is nothing you can do about it. Isn't that lovely?&lt;br /&gt;Now, since this dream had that parallelism moment, let's continue with the dude who DIDN'T poke into the wrong building.&lt;br /&gt;Upon sneaking into this larger facility, which was very poorly lit, only small red lights here and there, dimly illuminating what looked like a power facility, larger generators and tanks, narrow walkways and halls, a more concrete underground feeling. Eventually, you run into a larger section of hallway, some 20x20 ft, and see two guards talking, but one of them is beating the hell out of the other, which isn't even fighting back. Then, this sick thing happens, and the winning guard pulls out this jar and jams it into the other guys gut; Cue class gut-worm scene; this small, 8 inch long alien parasite of some kind tears the victim open, and begins threading itself through and consuming all of the poor bastards innards. Being undetected at this point, and pretty sure of victory, you run in and kill the other guard,kicking his body away and go to kill the other in another mercy kill, just like that cat (that in this reality, you did NOT kill but it is silently following you). But when you turn, the worm had grown at a unprecedented rate, you could see it moving around under the skin, blood and scraps leaking fluids as the guard just stares off, trying to scream without lungs in a agonized expression; seeming to be saying something important, but then the work gets to his brain, and pokes out an eye, blood gushing out and littering the face with brain bits. You ignore the posse, this is getting too weird, and you take a service elevator down a floor; The elevator had red lights, and was large, build for moving trucks it looked like. So much for being unannounced, but luckily, down here there was nothing but a few mech-armors and not many guards; This place held missile components for delivering the bio weapon. Solid snaking your way around, you simply murder guard after guard, leaving only the mechs to take out. Nothing you had could even get close to stopping them, so you continue onto the next room, which was a very large bi-level room with many smaller rooms, kind of like the stack/library in goldeneye. Well, it was still dimly lit in red, and in the middle of this giant empty room was some sort of weird reactor with seats in it ala borg style. You get noticed, and it becomes a intense firefight, you using a traditional revolver in favor of automatic weapons, since you didn't spray and pray, you killed. Eventually, whats her face walks in (leather chick) and talks to you in russian; sadly I can't understand it; nor do I have any way to reproduce it. &lt;br /&gt;Well, turns out she is an alien queen, and had given the russians the keys to making this mutagen that would allow her to generate parasites across the world, and consume our race like we do mcdonalds hamburgers.&lt;br /&gt;Like hell any US marine would let that shit happen, buuuuut we're not talking about an analyst here. Jumping down to take out the queen, you're electrocuted by the floor grid; A simple trap meant to take out aggressive morons. Lucky for you, as you lay there incapacitated on the floor, you see the black cat walk in, parasite sticking out of it's mouth, guiding it. The alien queen comes over and drops a worm on you, and it tears your guts out so you can feel how horrible the pain of death is before it damages your brain past the point of cognizance. &lt;br /&gt;But, like a US Marine, you totally fucked her over. You didn't shoot her, because you unpinned a few grenades first. BLAM!&lt;br /&gt;You eliminated the queen and the machine, saved your country.&lt;br /&gt;The end. Or is it?&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;What makes me chuckle, is modern games are way more graphical than this in terms of content, but in terms of immersion? Hardly. You'd have to look at some older games to really get a good creepout or scare; simply because the composition for immersion is a very delicate balance and very hard/expensive to get right.&lt;br /&gt;I hope some game house recognizes this and cranks out a decently silent-hill style game.&lt;br /&gt;&lt;br /&gt;-Z&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4044374934526922505-3940671309470253593?l=imaginaryz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://imaginaryz.blogspot.com/feeds/3940671309470253593/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4044374934526922505&amp;postID=3940671309470253593&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/3940671309470253593'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/3940671309470253593'/><link rel='alternate' type='text/html' href='http://imaginaryz.blogspot.com/2010/04/dream-splinter-silent-snake-solid-hill.html' title='Dream: Splinter Silent Snake Solid Hill Cell'/><author><name>Imaginary Z</name><uri>http://www.blogger.com/profile/05059116260376007206</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_O5BsOfO48b0/R1n4E03veuI/AAAAAAAAAAc/p0Q4WRLzwj0/S220/GargHead.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4044374934526922505.post-110826183039974573</id><published>2010-03-30T16:13:00.001-05:00</published><updated>2010-03-30T16:26:24.290-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='kami'/><category scheme='http://www.blogger.com/atom/ns#' term='dream'/><title type='text'>Dream - Really? FF13 dreams already?</title><content type='html'>Dream: 2010-03-30&lt;br /&gt;&lt;br /&gt;Summary:&lt;br /&gt;&lt;br /&gt;While working out at a new gym, it turned into some sort of FF13 game.&lt;br /&gt;&lt;br /&gt;Details:&lt;br /&gt;&lt;br /&gt;Apparently I started at the gym; well, it wasn't an ordinary gym, it seemed to have a very tall ceiling like one of those large superwalmart buildings, and plenty of mercury bulb lighting, keeping the entire indoor place lit well. It was also confusing, because equipment was next to kiosks that were selling workout equipment; apparently, you just grabbed what you needed and paid when you left; they had all sorts of machines and freeweights; it was a pretty cool little place. I started out on some 35 freeweights to warm up, and ran into Jennifer; apparently she was running the place, so we chatted for a while, then Mike D. showed up so we started running around the track, but he got distracted because one of his old buds was on a barlift machine; so he stopped running to chat, and I continued lapping. I grabbed some weights with triggers on them, and continued running, apparently these weights were inertial increaser's; they had gyroscopes so they could alter the resistance to change in direction, which was a weird feeling. After a few more laps, I walked over to the heavier machines to cool down, since nobody was over there, so I thought. I ran into an old friend, Randy M., so we talked for a bit, he seemed to be doing well.&lt;br /&gt;Well, I also ran into Caleb, and he talked about his new job and some other nonsense, and I was about to continue running, when on the end of one of the later laps, out of nowhere Kami appeared; Not the &lt;a href="http://mariecannabis.deviantart.com/art/Blue-mists-28224046"&gt;lung-style kami&lt;/a&gt;, but the &lt;a href="http://fyuvix.deviantart.com/art/Commish-Kami-in-Detail-66107485"&gt;new anthroid-chubby version&lt;/a&gt;. I laughed, and went to have a conversation, but as anticipated, the dragon noshed on the nearest redshirt (nobody I knew) then attempted to take me out. Luckily, he was in a &lt;a href="http://en.wikipedia.org/wiki/Physics"&gt;rule-restricted area&lt;/a&gt;, so I could easily dodge his attack. Then everyone started screaming, and these really strange alien creatures began to enter the gym; Things then turned into final fantasy 13 style; I was the leader, of a special class "Assist" though they abbreviated it "ARC" instead of, well. Kami joined my party as a "Power" class, which was also special, denoted "VOR". &lt;br /&gt;Well, we ran into our first encounter, attempting to wipe out the invaders to save the people at the gym (mind you, everything is in full HD at this point, every whisker, blade of fur, gnarled expression and clothing was maximum detail and behaved graphically like any commercial movie). The creatures were apparently 3 legged insect like aliens, of a drab brown color holding some sort of purple-raygun weapon, with beady black eyes and tentacles for mouths. In fact, the looked something like a mutated &lt;a href="http://en.wikipedia.org/wiki/Vortigaunt"&gt;vortigaunt&lt;/a&gt; + &lt;a href="http://noctalis.com/gallery.cgi?dis/bloodrayne/gallery2=27"&gt;maraisreq&lt;/a&gt; monster; I wasn't sure why but they also had on weak armor like leather or something. In either case, when we entered the battle, the music naturally went from "06 - The turn storm of road canyon.mp3" (Choro Q HG 1) to "Blinded By Light" (FF13 battle music). I was acting mostly like &lt;a href="http://www.youtube.com/watch?v=nG_Z0rd7eK0"&gt;Snow&lt;/a&gt;, I had no weapons so I ran over and beat the hell out of it since Assist class has instant preemptive no matter what. Kami just kinda sat up, apparently starting the battle in a sleeping position, and fidgeted his paws together; The alien fired a beam, a nice shiny purple effect, I dodged quickly. On the next turn, Kami used "Water Blast"; a very high level water magic attack, and being an Assist I augmented with "Spark", so that the combined damage was water + electrical, and did a large factor more than it would have alone. The bug was vanquished, we got points, and moved on.&lt;br /&gt;&lt;br /&gt;Then my alarm went off before I could continue playing the game *sadface*&lt;br /&gt;&lt;br /&gt;Was kinda nice to team up with RPG characters that don't completely suck. A tad unfair, but who's counting?&lt;br /&gt;&lt;br /&gt;-Z&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4044374934526922505-110826183039974573?l=imaginaryz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://imaginaryz.blogspot.com/feeds/110826183039974573/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4044374934526922505&amp;postID=110826183039974573&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/110826183039974573'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/110826183039974573'/><link rel='alternate' type='text/html' href='http://imaginaryz.blogspot.com/2010/03/dream-really-ff13-dreams-already.html' title='Dream - Really? FF13 dreams already?'/><author><name>Imaginary Z</name><uri>http://www.blogger.com/profile/05059116260376007206</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_O5BsOfO48b0/R1n4E03veuI/AAAAAAAAAAc/p0Q4WRLzwj0/S220/GargHead.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4044374934526922505.post-7516094456873516981</id><published>2010-03-06T09:10:00.002-06:00</published><updated>2010-03-06T09:11:39.093-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='game'/><category scheme='http://www.blogger.com/atom/ns#' term='dream'/><title type='text'>Dream - Terahertz Sono-wave gaming machine</title><content type='html'>Summary:&lt;br /&gt;&lt;br /&gt;Goathouse, me, and some of my other friends were at some drunk party, it seemed like we were in Canada and the bars were really slow, so it was about 5:30 am, and we drove to this gaming place that had been raved about (~2030, but we're still in our 20's). This huge gaming place has a large TeraHertz gaming server that linked you into the game with both mouse, keyboard, and a brain-link (looked like a plastic necklace) to allow the game to read your input before you actually make it. It didn't "put you in the game" but it was as close as is physically possible (you were still sitting down staring at a screen (4k screen))&lt;br /&gt;&lt;br /&gt;Details:&lt;br /&gt;&lt;br /&gt;I don't remember much about the party, except brien, john, jay, zach, kelly, adam, and probably everyone else were drinking a lot, I had too much already so I was on the floor (as usual); Somehow our drunken mobility decided we should play games since the only two chicks present were dumb. We had all heard about this new "synthesis" gaming experience, and somehow we all drove there.&lt;br /&gt;When we got there, it was this big decorated building in white, with lots of industrial pipe decor, something right out of universal studios or something. After going though a regular queuing line (not many people there at 5:30am) we entered, and inside was a large guest room and a initiator room, full of computers (from a yet-nonexistent company; they were *nix though). Inside there were the two guys responsible for training people to use the machines, some regular fat unix looking dude (beard, scraggly, glasses) and a more normal dude. (no chicks in the VR business, save for Nisha, which was the goth-type; she worked in the server room. cute!) Well, we all took our places, and they talked to us about safety, how the device worked, and what the hardware was; meanwhile Supreme Commander 3 or something played on our monitors, showing us what possibility the games interface had. We were all given a necklace that laced over the shoulders like a seatbelt, so it could monitor our heart and safely disconnect us if things go too intense. There was also this V-shaped plastic thing that we wore on our necks, that connected to the VR interface fort (some sort of SATA looking connection). This device was responsible for reading our brain waves; and giving the game the appropriate data stream.&lt;br /&gt;So, after getting lectured about problems we might encounter, and how to shut off the device (apparently, some people can't handle being "in" the game) we were moved into the next room once the previous group was finished.&lt;br /&gt;The next room was all black, save for the soft glow of many high resolution computer monitors (4096x4096 displays, at least 25 inches wide). Each computer station was put behind a plexiglass wall, which contained the tera-server, running inside a bath of liquid nitrogen. the thing was the size of a van, and goth chick was constantly checking it every 15 minutes (in a suit :( ). The room had a tall ceiling too, was cool as well. Well, we each sat down, had 15 seconds to connect to the game then WHAM&lt;br /&gt;&lt;br /&gt;IT started off as Unreal Tournament Tera-Edition; And we were all running around in a familiar setting blasting eachother with familiar weapons. It looked great, all the monitors were 3D, and the gameplay was fluid as always. However, what was happening was the brain reader was calibrating; by using a known experience, it can use that as the heuristic to generate the 'next best' scenario, and get used to your mind. Eventually, I no longer needed to use the keyboard or mouse to control my character, but had hands ready just in case. The unreal part was fine, but I ran away from the fight, wondering just what kind of virtual world this was. Apparently, just around the corner for unreal world was medieval world; a place full of Dragon-Age type shit; swords, magic, magicians, plague, dragons. All the generic stuff. The seamless transition was really something else, I just ran in there, fully armed in unreal tournament gear, and began running around the town shooting down guards. Eventually the game adapted, and it took away my gear (Unfair Use Justification Award) so I was now a peasant trying to stop a feudal government. Along the way, one of the AI people helped me out, and don't get me wrong, the AI was as real as another person in this game. IT could talk, interact, think and do all by itself. Gone are t he days of state based AI, now we have true organic processors that act alive (in a scarily realistic way). So, we and this other peasant start sneaking around, picking off guards using our knowledge of tactic; The AI player copied me and learned really fast; We eventually snuck our way into the armory, and found a treasure vault. Meanwhile, some other unreal players ran by outside, just continuing to fight eachother ignoring they were messing up medieval world. So, after stealing lots of money (the game felt real now, you know how that works when you get "into" a game) we tried to escape, but the guards were on us. WE could run faster though, and escaped outside and got to the top of the buildings quickly. The guards were real hesitant to follow us (soled shoes suck on mud roofs); so clambering onto the roofs we could see for miles; the entire kingdom of medieval world; the border of Jurassic world across a small river, the b order to jungle world up north, the "dead sea" (the admins told us the world did not wrap; it terminated and anyone going into or above the dead sea would be eaten ala Spore.) And the unreal world, with projectiles constantly going AWOL like fireworks. There was only one dragon in the air, but it didn't seem interested in what we were doing. So, after jumping around from roof to roof (the medieval buildings were 50+ ft tall, and made of very thick mud and concrete, supposedly a game design decision) I found that there was a giant golden cannon hidden atop a tower that we could get to, so after clambering around (I found a diamond, +5000 points) I aladdin'd my way down to the ground, still running from guards, pushing people away. The guards stopped taking interest in me, as my AI friend had got upitsnacthed by that flying lizard. They were busy, so I ran over to the cannon, and once I managed to get to the top via lots of hardcore mario platforming, I got a LEVEL SELECT. Which, I could preview any area I wanted, to see what there was in this unbelievably huge world to explore.&lt;br /&gt;From memory, There was Unreal world, Jurassic World, Medieval World, Jungle World, Ice world, Air world (high skyscrapers &amp;amp; scaffolds), Slug world, Fusion world, Food world, Random world, Dark world, and quite a few others. Each world had it's own creatures, people, and AI's to interact with. The game was essentially 0-consequence real life; Everything could be interacted with, and it would change somewhat as you would expect. If you "died", you could respawn or chillax for a bit. The game kept track of your lives, score, and modified each by each region as needed, so it was unfair that I found that diamond (putting me ~4600 points over the top unreal player), but that's why it was there. Exploring was always a reward, but it wasn't always immediately obvious HOW you would be rewarded. Fights were as realistic as the zone employed; it could be RL fighting (as in medieval world) or game fighting (unreal world) or even turn based MMO style. Everyone that was local lan was playing in the same server, if we'd have cooperated it coulda been amazing.&lt;br /&gt;&lt;br /&gt;Then, before I could select a new world, our time was up. Shaking myself to consciousness, apparently me and Zach were the only two really affected by the system, so we had to sit in a waiting room for an extra 5 minutes while we recuperated. (the machine can raise your brain temperature; so this is somewhat dangerous to do, especially if you get into it) WE talked about what we did, Zach went up north and conquered an entire north pole civilization using necromancer powers; murdering stupid elves and christmasy things. Sounded like fun! After a while one of the employees came by and offered us jobs, because we were able to actually interface with the system and do things most people couldn't. We declined for the moment, and the dream ended because some noises coming from the living room woke me up.&lt;br /&gt;&lt;br /&gt;If a picture is worth 1000 words, and this game was running at 240FPS, for 15 minutes, then how many words would I need to describe what I just lived through? (hint: 60*15*240*1000) Unfortunately, I'm not into wasting my time describing the emotional and graphical details of the dreams; You'll just have to know that whatever it was is more vivid and amazing than anything you're used too. You'd have to travel to world to even get close to experiencing these kinds of wonders. And trust me, as anyone who has "been there" knows; Pictures, movies and games can't even get close. Being there is really something else.&lt;br /&gt;&lt;br /&gt;-Z&lt;br /&gt;&lt;br /&gt;P.S. There was some cool fanservice in the game I didn't mention. ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4044374934526922505-7516094456873516981?l=imaginaryz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://imaginaryz.blogspot.com/feeds/7516094456873516981/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4044374934526922505&amp;postID=7516094456873516981&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/7516094456873516981'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/7516094456873516981'/><link rel='alternate' type='text/html' href='http://imaginaryz.blogspot.com/2010/03/dream-terahertz-sono-wave-gaming.html' title='Dream - Terahertz Sono-wave gaming machine'/><author><name>Imaginary Z</name><uri>http://www.blogger.com/profile/05059116260376007206</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_O5BsOfO48b0/R1n4E03veuI/AAAAAAAAAAc/p0Q4WRLzwj0/S220/GargHead.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4044374934526922505.post-6097658796072194156</id><published>2010-01-31T11:41:00.000-06:00</published><updated>2010-01-31T11:41:37.457-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='final fantasy'/><category scheme='http://www.blogger.com/atom/ns#' term='game'/><category scheme='http://www.blogger.com/atom/ns#' term='dream'/><title type='text'>Dream; Final Fantasty 6 - 2</title><content type='html'>Summary:&lt;br /&gt;&lt;br /&gt;A high res remix of FF6 with a improved battle system, extended more in depth plot, and a lot of additional new features.&lt;br /&gt;&lt;br /&gt;Details:&lt;br /&gt;&lt;br /&gt;So, I put in my game blu-ray disc, to see what all the buzz was about with this final fantasy 3/6 TWO controversy; Having enjoyed the hell out of the first FF6, I was really skeptical about the remix. To my surprise, it both exceeded my expectations and blew my mind with awesomeness.&lt;br /&gt;A lot of it is really fuzzy in memory, but Kevka was a lot mroe seriously evil in this one, and the plot was changed to match up with the more recent final fantasy's; The idea of 'magic' being used to dominate and ultimately destroy the world was still there, and espers were still there, but holy shit they are scary as hell in high res. Also,&amp;nbsp; the espers are a lot more interactive, not merely quest items; They do actually converse, follow you around and make suggestions depending on how you treat them. Naturally once you kill an esper, it only exists as a spirit, so they cannot do anything until you summon them, which always costs 1 HP + some amount of MP. The battle system was vastly improved, implementing a mixture of both real time fighting and strategic turn based trickery; Also all done in glorious 3D. You had the option to command classically, where actions were mere dice rolls, or you could switch to Star Ocean mode, and stop-time fight all at once, OR you could keep the 'Neo' mode, where it was classical turn based, but each action had *you* play it out, so if you said 'Sabin -&amp;gt; Pummel' then you have to run in with Sabin, and mash buttons or do some sort of mini-game. Sometimes, basic attacks are just running and aiming correctly; which means doing so gives you far more options to have critical attacks, since WHERE you hit an enemy determines that, but only in Neo mode (IE using a sword against the neck = critical hit)&lt;br /&gt;The graphics were photo-realistic photon ray traced HDR Spherical Harmonics ambient occlusion self shadowing ect. goodness. It was amazingly pretty to look at, all of the objects had absurd levels of detail, when you put it in star ocean mode and paused, you could move around the battlefield to look at all the detail of the characters and monsters, seeing every little scar, emotion, item, scrap of clothing, was crazy! Kinda like the first time you discovered link wore earrings in Ocarina of Time.&lt;br /&gt;So, now we have a excellent combat system, an amazing visual presentation, and the traditional orchestral music but this time with less music; Most of the game takes place in an 'ambient' environment, only when you do something that requires a beat, or a induced emotion is there a musical score. This adds greatly to the emotional and immersive impact of the game; For example, walking through a town sounds like a town, but stopping at a shop to do mundane purchasing pops up the lively 'shop' music, and it all blended acoustically together, forming a seamless transition. Lots of the environment was interactive, pots, crates, bushes could be examined or broken; Obviously sometimes with consequences; Most of the time you wouldn't really find anything either; Exploring was well emphasized, there were still invisible walls, but they were there only to help you, and eventually dissapear if you push on them long enough. Though, trying to walk off a cliff, your character stops youl, not a wall. They don't want to jump in lava, spikes, acid, death.&lt;br /&gt;The controls meshed well with a PS3 remote. Was very intuitive for an RPG.&lt;br /&gt;So the plot! Because that's what was so awesome about FF6, is how you got drawn into the world by the story. This is where I'll likely make mistakes; because I didn;t even get past the first part of the game, since I only played it for about 6 hours.&lt;br /&gt;I remember being 'Setzer' in a team with Edgar, Cloud (wtF? musta been gau), Celes, Terra, and Relm (who is an adult this time around, if I could draw you a picture of her she'd get instant cult fame), and we were walking around some town, stocking up before attempting to infiltrated on of the larger magitek ships that had been docked in port. The world was torn, there were multiple powers fighting for supreme control of the magitek and espers, and there was of course the resistance that aimed to stop them from killing the planet/espers. That's what you do, and the first part was just going from town to town, fighting monsters (another note, monsters are very dynamic in Neo mode; They have a lot of specialized attacks and depending on the monster, you can indirectly tame/lure them depending. IE, I would have Setzer try and bait them with food, then Cloud critical them when they got close. Earning me a 'Evil' ranking most of the time, but hey, times are tough. I'm sure the game will cause that to backfire on me later, for being evil to so many of a specific enemy I'll probably run into a much larger one that kicks my ass)&lt;br /&gt;So, eventually, after a lot of fighting and killing magitek guards, we found a drawbridge, and had to solve a physics puzzle with an open ended solution. WE srewed it up, so we had to find a boat and cross the moat; didn;t work, we ended up swimming into the sewer pipes of the ship (if it HAD worked, we would have saved a lot of time &amp;amp; got some cool items)&lt;br /&gt;So now we're in the bowels of this really large, iron rusty colored monster, it was insanely large, larger than the superbowl; it had lots of smoothed out high tech looking cooridors, and the platforms above this sluice, which Terra figured out was 'cooling' their magitek reactor, which contained an esper, we eventually got cloud to ninja us a guard so we could take their weapons; The room we were in was about 35 ft tall, the bottom half had a hemispherical cutout that was full of hte sluice we were hiding in, and was really dark. The top half had cutout platforms nad rooms, lots of scientists in white walking around, and guards with white and red symbols. They looked a lot like the ones from FF6, mind you. so we split up, and each took some positions to try and get intel on where the reactor was. Most of the girls took labcoats and became 'scientists' and the guys took on casual appearances (there was a entire city in this ship, after all.) After some espionage, we got really unlucky, and Kevka showed up. Kevka, in this stage of the game, looked a LOT like sephiroth, but with a much crazier grin all the time, and was tall, but did not yet reach feather in hat stage. He was becoming mad with power, but hadn't completely lost it. Well, Kevka has a few bodyguards, and was actually being pretty personable, hitting people he didn't know on the shoulder, really hard and laughing about 'How's the Day' or something like that, knocking them down and just laughing about it. Was quite fitting. Apparently, Cloud got pissed off and confronted him...&lt;br /&gt;So suddenly, boss mode happened.&lt;br /&gt;Boss mode is really different; If you confront a boss OUT of character, this special mode comes up, where time is slowed down a lot, and you get all these new special gauges; Because if you were to actually defeat kevka at this point, it would probably mess up the game, the game makes sure to give you a damn good challenge. When a boss fight occurs, your teammates can suddenly join the 'battle sphere' which is a large area surrounding the boss. Joining it gives you your command queue;&lt;br /&gt;Once the fight starts, everyting happens in REAL time, but slowed down about 10 times; so you can see everyone attacking at once; thinking quickly is the only way to survive. Kefva had a revolver like the joker, and luckily missed cloud but killed two people in the immediate area (battles don't "transport" you somewhere else, you exist in the world at all times, so your fights can fuck up the world!) cloud tried to hit him but got stabbed in the gut (Kevka had armor on under his white suit) so he backed off; Kevka ended the fight by default, so we couldn;t fight him. Apparently, he had no idea who we were, and was actually delighted we tried to kill him. Something about "I haven't seen such fire in a long time! Cecil, get this man to the recuiting station!" And just continue on, laughing manically after hitting shocked cloud on the shoulder, knocking him down. Kevka's bodyguards never entered the fight, indicating they knew you were no match.&lt;br /&gt;&lt;br /&gt;There is so much detail in this dream, but I can't really remember all of it. Point is, if it was written out correctly, I sure hope that someone makes a RPG like it. Woudl be awesome.&lt;br /&gt;&lt;br /&gt;-Z&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4044374934526922505-6097658796072194156?l=imaginaryz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://imaginaryz.blogspot.com/feeds/6097658796072194156/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4044374934526922505&amp;postID=6097658796072194156&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/6097658796072194156'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/6097658796072194156'/><link rel='alternate' type='text/html' href='http://imaginaryz.blogspot.com/2010/01/dream-final-fantasty-6-2.html' title='Dream; Final Fantasty 6 - 2'/><author><name>Imaginary Z</name><uri>http://www.blogger.com/profile/05059116260376007206</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_O5BsOfO48b0/R1n4E03veuI/AAAAAAAAAAc/p0Q4WRLzwj0/S220/GargHead.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4044374934526922505.post-7339801060932019495</id><published>2010-01-29T13:50:00.002-06:00</published><updated>2010-01-29T13:55:17.706-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='code'/><category scheme='http://www.blogger.com/atom/ns#' term='opengl'/><category scheme='http://www.blogger.com/atom/ns#' term='math'/><category scheme='http://www.blogger.com/atom/ns#' term='game'/><title type='text'>Picking, Mouse Projections, Screen to Ray</title><content type='html'>&amp;nbsp;The Problem:&lt;br /&gt;&lt;br /&gt;When the user clicks on the 2D screen, how do we know in 3D coordinates where they actually clicked, so we can select the object they clicked on?&lt;br /&gt;&lt;br /&gt;The Solution:&lt;br /&gt;&lt;br /&gt;Obviously a simple geometric / linear algebra problem. It is commonly done by querying the graphics card for the projection, modelview, and viewport. I despise asking the card for anything, as it should be a one way pipe. (minus CUDA, which is still new).&lt;br /&gt;&lt;br /&gt;Our special case is, if we know how we constructed the projection matrix, we can easily invert the process to convert a screen ray into world coordinates. Then we can make those world coordinates relative to our "camera" matrix, and you can then perform a ray to scene collision detection;&lt;br /&gt;&lt;br /&gt;This is also called "picking", "selection", and has a variety of other names. I highly reccomend never using any method but your own geometric methods, since you can't rely on this type of functionality to be consistent, without ensuring your own code is.&lt;br /&gt;&lt;br /&gt;In layman terms, "You can click things in 3D" / "What you see is what you get"&lt;br /&gt;&lt;br /&gt;The orange dot is the actual 3D position of the Ray -&amp;gt; AABB intersection&lt;br /&gt;(A Ray is defined by a point and a direction, a AABB is a axis aligned bounding box, so it has a minimum position and a maximum position, or a center and a half-size for each axis)&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_O5BsOfO48b0/S2M67qrzi9I/AAAAAAAAAJU/ZAEavXCGRkQ/s1600-h/MouseProjections.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="374" src="http://3.bp.blogspot.com/_O5BsOfO48b0/S2M67qrzi9I/AAAAAAAAAJU/ZAEavXCGRkQ/s640/MouseProjections.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Here's some code snippet:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;blockquote&gt;class matrix&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public:&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //+X = left, +Y = up, +Z = forward&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; float Xx, Xy, Xz, Xw;&amp;nbsp;&amp;nbsp;&amp;nbsp; //Order from spec; Colum major 0..16. Have to transpose all the mathematics (internally)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; float Yx, Yy, Yz, Yw;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; float Zx, Zy, Zz, Zw;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; float x, y, z, w;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;void mingl::matrix::frustum_get_ray( int umouse_x, int umouse_y, int window_w, int window_h, float distnear, float distfar, float fovangle, float &amp;amp; Rx, float &amp;amp; Ry, float &amp;amp; Rz, float &amp;amp; Rdx, float &amp;amp; Rdy, float &amp;amp; Rdz )&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; float scrn_x =&amp;nbsp; (float)(2*umouse_x - window_w) / ((float)window_w);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; float scrn_y =&amp;nbsp; -(float)(2*umouse_y - window_h) / ((float)window_h);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; float td_dx, td_dy;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; float td_tan = tan( fovangle * (M_PI/360.0f) );&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if( window_w &amp;gt; window_h ){&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; td_dx = td_tan * scrn_x * ((float)window_w/(float)window_h);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; td_dy = td_tan * scrn_y;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }else{&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; td_dx = td_tan * scrn_x;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; td_dy = td_tan * scrn_y * ((float)window_h/(float)window_w);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //Generate points on the projection viewport&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; float p1[3] = { td_dx*distnear, td_dy*distnear, distnear };&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; float p2[3] = { td_dx*distfar, td_dy*distfar, distfar };&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; float dv[3] = { (p2[0] - p1[0]), (p2[1] - p1[1]), (p2[2] - p1[2]) };&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //Note this is a specialized "To Global" operation (because of the inversion on axes)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //Ray does not start from center of camera.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Rx = x - Zx * p1[2] + Xx * p1[0] + Yx * p1[1];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Ry = y - Zy * p1[2] + Xy * p1[0] + Yy * p1[1];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Rz = z - Zz * p1[2] + Xz * p1[0] + Yz * p1[1];&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //note the conversion.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Rdx = -Zx * dv[2] + Xx * dv[0] + Yx * dv[1];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Rdy = -Zy * dv[2] + Xy * dv[0] + Yy * dv[1];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Rdz = -Zz * dv[2] + Xz * dv[0] + Yz * dv[1];&lt;br /&gt;}&lt;/blockquote&gt;&lt;/blockquote&gt;&amp;nbsp;From reading that code, you'll notice the projection matrix is defined by:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //3D projection matrix via symmetrical frustum; the most common projection.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; float fov = 60.0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; float aspect = 1.0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; float unear = 0.125;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; float ufar = 1024.0;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; float top = tan(fov*0.00872664625997f) * unear;&amp;nbsp;&amp;nbsp;&amp;nbsp; //0.00872665f = pi / 360 = (pi / 180) * 0.5&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if( (window_h &amp;gt; 0) &amp;amp;&amp;amp; (window_w &amp;gt; 0) ){&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if( window_w &amp;gt; window_h ){&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; aspect = float(window_w)/float(window_h);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; projection.frustum( aspect * -top, aspect * top, -top, top, unear, ufar );&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }else{&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; aspect = float(window_h)/float(window_w);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; projection.frustum( -top, top, aspect * -top,aspect * top, unear, ufar );&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;void mingl::matrix::frustum( float ul, float ur, float ub, float ut, float un, float uf )&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; float dx = (ur-ul);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; float dy = (ut-ub);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; float dz = (uf-un);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; dx = (dx &amp;lt;= 0) ? 1.0 : dx;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; dy = (dy &amp;lt;= 0) ? 1.0 : dy;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; dz = (dz &amp;lt;= 0) ? 1.0 : dz;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; identity();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Xx = (2.0*un)/dx;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Yy = (2.0*un)/dy;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Xz = (ur + ul)/dx;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Yz = (ut + ub)/dy;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Zz = -(uf + un)/dz;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Zw = -1.0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; z = -(2.0*uf*un)/dz;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; w = 0;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Works beautifully! Onward with my megaman project.&lt;br /&gt;&lt;br /&gt;-Z&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4044374934526922505-7339801060932019495?l=imaginaryz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://imaginaryz.blogspot.com/feeds/7339801060932019495/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4044374934526922505&amp;postID=7339801060932019495&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/7339801060932019495'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/7339801060932019495'/><link rel='alternate' type='text/html' href='http://imaginaryz.blogspot.com/2010/01/picking-mose-projections-screen-to-ray.html' title='Picking, Mouse Projections, Screen to Ray'/><author><name>Imaginary Z</name><uri>http://www.blogger.com/profile/05059116260376007206</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_O5BsOfO48b0/R1n4E03veuI/AAAAAAAAAAc/p0Q4WRLzwj0/S220/GargHead.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_O5BsOfO48b0/S2M67qrzi9I/AAAAAAAAAJU/ZAEavXCGRkQ/s72-c/MouseProjections.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4044374934526922505.post-8268952051111676872</id><published>2010-01-24T10:37:00.000-06:00</published><updated>2010-01-24T10:37:35.184-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='dream'/><title type='text'>Dream; Apparently, photon rendering is a big thing</title><content type='html'>Summary:&lt;br /&gt;&lt;br /&gt;reed, scott, amanda and I go on a failed tulsa telescope trip; then reed and I play a VR cube-like game.&lt;br /&gt;&lt;br /&gt;Details: &lt;br /&gt;&lt;br /&gt;I'm trying to remember the events leading up to the start of the 'game', there was something about a really long trip to tulsa, and scott, reed, amanda and I broke down so squeeky came by and had to rescue us, with nathan, turned out we had to get a rental car or something and who knows what else. I think we were going on a camping/telescoping trip, but I really don't remember as there was this phase shift,&lt;br /&gt;Suddenly, it was virtual reality videogame time, and after watching this boring plot introduction to these two biologists, both of which were studying some fossils up in the mountains, got killed by natural enemies like venomous spiders and snakes; It was odd, as if the grounds were possessed.&lt;br /&gt;Suddenly, it fast forwards, and this place as near this ancient ruins site that looked like a Cube level, I began running around, pickup up weapons in the arena; Little chuck came by and asked me some stupid question, I ignored it and showed him how awesome the graphics were. After that, the gameplay started, and I was waiting for someone else to join. Apparently though, there was a pterodactyl as an enemy, and fucking hell it was invincible. So I'm running around, this super skill avian like monster, at least 12 ft wingspan, is trying to hit my collision box and transfer away 25% of my health; I pick up this regular pistol, an AK-47 like weapon, my M-16 (favorite), futuristic purple plasma belcher, and a green flux rifle, all of which had multiple secondary modes, and looked awesome like they SHOULD be doing some damage. Nothin, the damn bird was invincible. So now I'm running around avoiding getting pecked to death, trying to shut doors behind me, but the goddamn thing could open them with it's face; so it was able to follow me everywhere, there was no escape. Randomly, Nemesis shows up with a rocket launcher and is now also trying to kill me. Luckily, Reed logged in and we both started trying to kill nemesis, but the stupid dinosaur was continuing to attack me only; who knows why.&amp;nbsp; Nemesis could run like nobody's business, so we were having trouble getting away from him; The arena was a very large place, with ruined columns jutting out all over the floor, there were 2 main corridors you could go down anbd a 5 - level rope bridge with huts area in the middle of this Colosseum like ring; The other corridors led to many separate and unique rooms, and a grand hall; the separate rooms usually had a theme, like trophy room, bath room, study, torture chamber, ect... But we ended up climbing our way to the top of the huts since nemesis couldn't jump, continuing to get hit by that stupid pterodactyl, and eventually make it to the top hut with a large button panel. I hold the door shut, the damn dino bird was really strong, it tris to swipe my feet or grab my ankles, since it was able to hold the door partially open, easy to dodge b ut I thought twas was an unusual detail for an enemy that basically just runs into you; maybe there were conditional attacks that we'd really need to avoid?&lt;br /&gt;Either way, there was a puzzle, I tell reed to solve it, he does, but in a way the designers didn't intend, so a giant swarm of anti-dermestic beetles comes from nowhere, and we start running and shooting at them, nemesis shoots them all with a rocket, and we continue playing the game.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4044374934526922505-8268952051111676872?l=imaginaryz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://imaginaryz.blogspot.com/feeds/8268952051111676872/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4044374934526922505&amp;postID=8268952051111676872&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/8268952051111676872'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/8268952051111676872'/><link rel='alternate' type='text/html' href='http://imaginaryz.blogspot.com/2010/01/dream-apparently-photon-rendering-is.html' title='Dream; Apparently, photon rendering is a big thing'/><author><name>Imaginary Z</name><uri>http://www.blogger.com/profile/05059116260376007206</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_O5BsOfO48b0/R1n4E03veuI/AAAAAAAAAAc/p0Q4WRLzwj0/S220/GargHead.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4044374934526922505.post-516291362041295641</id><published>2010-01-20T17:36:00.000-06:00</published><updated>2010-01-20T17:36:05.130-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='dream'/><title type='text'>Dream - Fanservice; Slightly disturbing</title><content type='html'>As stated, this is somewhat a fanservice dream. Don't read if you don't like reading disturbing things.&lt;br /&gt;&lt;br /&gt;Summary:&lt;br /&gt;&lt;br /&gt;Something about folks visiting someone's friend because their friend's just got killed in some accident, or maybe from cancer. So we visit this freaks house, nice house, then go get some groceries before going home and I find a dreamcast and play this crazy vore fanservice game where you were some chick that could turn into a dolphin.&lt;br /&gt;&lt;br /&gt;Details:&lt;br /&gt;&lt;br /&gt;I remember some of the dream, not the events leading up to visiting this random guy. Apparently, some friend of my parents had kicked it, don't really know how they died, but they had no surviving relatives, just a friend that had been taking care of them intermittently, so they decided to pay a visit to him to get the scoop. This dude lived on the coastline, somewhere further east, was a beautiful 4 acre lot on the water, with it's own jeti and pier, boatdock, multi-part house (had a main home, and a side home for tools/games like Bill's 'Mancave') and a very well kept lawn. This guy was single though, which was odd. Either way, I'm bored, the dude doesn't seem that interesting, and he actually had a friend over, which I thought was strange, since he knew we were coming over, but I guess the friend was just leaving. Ironically, I overheard some of their conversation, and some words came up about eka's and such, and I wondered who this guy really was. &lt;br /&gt;So, we putz around his house, he shows us all the cool shit he had, like the exercise room with TV and his tool filled garage with a classic car, his two cats, blah blah blah. He asked me some question, I can't remember what it was, but it was indirectly asking if I was a member of eka's too, so I responded "I bet Imaginary Z would know." and then we left. &lt;br /&gt;Was really weird, and boring. No cool events, but the house was pretty awesome.&lt;br /&gt;&lt;br /&gt;Second part, we're driving home, it's raining a lot, so we stop in at a place that is topologically identical to my Homeland in mustang, so the folks go in and start shopping, me and sis hang out in the front, where they had some crazy arcade games. I find this one, I make fun of it, because it was something like a mermaid/transformation game thing, the demo reel looked like Ecco from the dreamcast. So, I give it a shot, it played fairly well, like a mario 64 type game, there wasn't really anything slowing down the gameplay, you could run around as some chick, use a energy whip to kill shit like Zero suit samus does in brawl, and, if you jumped in the water, you could turn into a dolphin and fly around. The dolphin form initially could not shoot, and the game did not prevent you from going into 'difficult' areas, so, that's the first thing I did. Not too surprisingly, there were these lightly lavender/grey colored plesiousaur/dragon monsters slowly moving around, and since you didn't have any weapon equipped, speed-ramming them did nothing, I tried it a few times, but apparently, if you get too close to their neck/head kinematic range (kinematic range is a probabilistic region defined by the "energy" required to stretch a chain of bones to that position; Much like the 'rope around a silo' problem) you get treated to a funny little cinema scene of the thing swallowing your dolphin with ease. Though, the designers, being sick fucks apparently, let you mash buttons to try and wriggle enough to make it spit you out; So it wasn't really insta-death, though you were given the option to 'suicide' or attempt escape. I thought that was rather bizarre, so I experimented with it; It turned out a glitch allowed you to change back into human form while being eaten, but due to the way the game was programmed, your dolphin form would still exist, so your human form just pops into existence next to your assailent, so you can wail on it's ass while it eats your old form. If you happen to rescue the old form, your human form dissapears, and you're a dolphin again. Was quite strange, and even MORE weirdly, if you let the sea dragon finish off your dolphin, your human form would NOT disappear, but you would switch control back to the swallowed dolphin, from which you could struggle indefinitely, with accompanying highly detail animation (the "object under a silk cloth" type animation) until you got bored of the screen telling you to restart. But when you DID restart, you would start from where you left off the human form, in a way, you had a glitchy emergent behavior trick; Maybe this was intentional, I don't know.&lt;br /&gt;The environment of the game was very blue and icy looking in color, the waters were dark blue and deep, there were very few creatures or plants or things in it, just a couple of those sea dragons and some glowing rocks at the bottom, maybe 500+ ft deep. The point was, this was obviously subconscious fanservice; I'm not complaining but I sure wish I had those models. They looked oddly similar to one of the models I'm currently working on though...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4044374934526922505-516291362041295641?l=imaginaryz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://imaginaryz.blogspot.com/feeds/516291362041295641/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4044374934526922505&amp;postID=516291362041295641&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/516291362041295641'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/516291362041295641'/><link rel='alternate' type='text/html' href='http://imaginaryz.blogspot.com/2010/01/dream-fanservice-slightly-disturbing.html' title='Dream - Fanservice; Slightly disturbing'/><author><name>Imaginary Z</name><uri>http://www.blogger.com/profile/05059116260376007206</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_O5BsOfO48b0/R1n4E03veuI/AAAAAAAAAAc/p0Q4WRLzwj0/S220/GargHead.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4044374934526922505.post-8274183860757524144</id><published>2010-01-10T10:48:00.001-06:00</published><updated>2010-01-10T10:48:21.367-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='dream'/><title type='text'>Odd Nuclear Disaster Dream</title><content type='html'>Parts of this are in fragments, but it was rather long.&lt;br /&gt;&lt;br /&gt;Summary:&lt;br /&gt;&lt;br /&gt;I pick a fight with some douchebag highscool kid trying to currupt one of my friends little brothers, he pulls guns, I smack them away and shoot him. Nuclear disaster happens ,the world floods, all temperatures rise near 110 constantly, people starve and run out of water, marine life comes ashore (all the way to Kansas) bizzare cults and non-eco friendly clans develop, me and the dragon clan have a huge fight out with this large group of savages; we win in the end.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;Details:&lt;br /&gt;&lt;br /&gt;The first part of the dream involved me going to some sort of high school graduation; Apparently, mike, dustin and some people I forgot I knew were there, and dustin's kid was graduating to middle school finally (zach),&amp;nbsp; so I went along to see him walk along his ceremony. At the same time was a high school graduation, filled with lots of idiot punks as usual. Though, Zach started hanging out with this greaser punk in leather, I'd never seen this kid before, and he was trying to tell zach to do drugs, and hang out with the cool crowd. Zach was a smart kid, and knew to stay away, but I saw this event occur later, and confronted the idiot, and we got in some sort of stupid argument and he pulls a gun on zach and threatens to shoot him, so I pull a gun as well, taken from some kid I secretly swiped, and I shot at him. Lucky for him, the gun sucked and it grazed his head so he let go and put his hands up and ran away, so I went to talk to Zach but zach ran off to go with the punk kid.&lt;br /&gt;Chase scene ensues, and the punk drives off but only for about 100ft since car's don't work without gas; And they take off running. I eventually chase him down to this large apartment building, and we face off, I disarm his stupid ass and he pullls an old knife out, threatens me with it until I disarm him from that too, then I just shoot him in the foot and kick him out the door, which at this time led to the ocean, tens of feet down. The fish got him.&lt;br /&gt;So now time fast forwards, zach is in his teens, dustin and co are living in this high rise building, we're on the 20 somethingth floor, which the bottom or so floor are completely underwater, networks of floating bridges are made between buildings, and ours just so happens ot have the only working well, so we are naturally well armed and defended, I had personally executed hundreds of people, and fed them to the local fish so we could have food.&lt;br /&gt;IT wasn't exactly a pretty future, but there were still lots of good people in existence, but the beutiful thing is it's OK to weed out the stupid people now, unlike today where we seem to encourage the breeding of idiots; In the future, if we were breeding idiots it would be for food.&lt;br /&gt;So one day, I was sitting in the window with my homemade sniper scope, and I notices some large black asian dragons flying around some of hte other buildings, I showed everyone and pointed out that they were people holding up these elaborate costumes, running around like idiots. I heard one of them come up the stairs, and this weird ass group of Yoga people just ran through the building in dragon costume, saying a few passing words and leaving just as quickly; taking nothing, but making their presence known.&lt;br /&gt;Eventually, I went over to their cult, and found out they were a group of ecologically minded folk, who were valuing the same ideals my tower did, preserving the marine ecosystem so that it would naturally sustain and preserve itself, and us in the meantime. So we banded up, and I joined the dragon cult minus the goofy rituals.&lt;br /&gt;Well, one day they pointed out that there was this large band of stupid idiots trying to drag nets across our oceans; but they were heavily armed and there were many of them. I confronted them once, killed four of them and slashed their nets; all before their bandwagon began firing back and I ran them into a trap, as hundreds of these motherfuckers came out of nowhere, wasting shots trying to kill me. I lured them into the courtyard of a hollow building, where our dragon clan rained death upon&amp;nbsp; them using medeival weaponry and some of my own custom devices; After a long battle, both sides had heavy losses but we mostly wiped out the intruders, I ran down and cut their throats, those that survived. I alone, apparently, was immune to death b ecause I knew what the future meant for humanity, and I also knew that executing a few humans would mean nothing on the cosmic scale; especially those who believe that might makes right, and anchient reptilian function that lives on as our own personal demon.&lt;br /&gt;Eitherway, we fed the fishes, and birds, and made out with a large feast; sadly our numbers had been halved, but we set out a ritual for them to be given back to the earth; And time proceeded on. Maybe sometime in the hundreds of years distance the earth would start repairing itself, and we could recontinue a new human spirit; One that values peace, balance, and the cosmos more than itself.&lt;br /&gt;&lt;br /&gt;Nothing feels better than killing stupid people, then feeding them to the earth. If only our world's educational standards could promote real thinking instead of political regurgitation. Don't forget that there are a lot of scientists and engineers that are stupid; Stupid is defined as lack of tolerance and understand, and lack of diplomacy. you can be book smart, money smart, street smart, and still be stupid as a rock. Only the scientific mind that values the cosmos is intelligent; your reptilian brain is the enemy. Rise up against it.&lt;br /&gt;&lt;br /&gt;La mayor victoria esta en vencerse a si mismo.&lt;br /&gt;(&lt;span id="result_box"&gt;&lt;span style="background-color: white;" title="La mayor victoria esta en vencerse a si mismo."&gt;The greatest victory is to conquer yourself.)&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4044374934526922505-8274183860757524144?l=imaginaryz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://imaginaryz.blogspot.com/feeds/8274183860757524144/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4044374934526922505&amp;postID=8274183860757524144&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/8274183860757524144'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/8274183860757524144'/><link rel='alternate' type='text/html' href='http://imaginaryz.blogspot.com/2010/01/odd-nuclear-disaster-dream.html' title='Odd Nuclear Disaster Dream'/><author><name>Imaginary Z</name><uri>http://www.blogger.com/profile/05059116260376007206</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_O5BsOfO48b0/R1n4E03veuI/AAAAAAAAAAc/p0Q4WRLzwj0/S220/GargHead.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4044374934526922505.post-9123371057823361887</id><published>2010-01-09T13:11:00.000-06:00</published><updated>2010-01-09T13:11:52.446-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='dream'/><title type='text'>F'd up dream</title><content type='html'>Summary:&lt;br /&gt;&lt;br /&gt;Pan-Man family versus Super Mario Bros as they begin to destroy a holiday resort; I bash in a bobcat's skull with a 2x4 to save Scott, who fell down a rusty sewer grate.&lt;br /&gt;&lt;br /&gt;Details:&lt;br /&gt;&lt;br /&gt;I remember being in some sort of older van, like a 1996 Chevy Lumnia or something, with my sis, dad, mom, all driving up to Colorado or somewhere equally resort like. It was cold, snow glazed the hills but the temperatures were not bad, so the roads were fine. There was plenty of traffic, I had my Sega GameGear and was playing Sonic 2 on the trip. Eventually, we reached this large ski-resort place, which was connected to a hot spring, it was a nice place, rustic decor, but elegant tables, paintings, and professional attire everywhere, somewhat like&amp;nbsp; the interior rooms on a cruiseliner.&lt;br /&gt;So, we moved our luggage to the room, which had the typical 2 bed Suite, a small kitchinette and 1 bathroom. Obviously, you were not meant to use the room for more than sleeping, so we all discussed where to go grab some food; Turned out there was a really nice buffet downstairs in the lobby, with lots of types of ethnic foods. So, we go wait in line and eat dinner aqt the buffet.&lt;br /&gt;Meanwhile, the camera pans over to the entrance where people check in, and , well, Pac-Man and his family (pac jr, pac baby, mrs pac man, pac man and that little dog) check into the resort as well; If you have ever seen the pac man cartoon (I do not recommend it) You can imagine the stark contrast as cartoon characters walk into a resort with humans ala Roger Rabbit style; It was nightmarish, but they were just vacationing as well, nothing weird. Of course, in the background see Clyde and Pinky conjuring up a plan to kill him as per usual.&lt;br /&gt;The camera goes back to use, and we all split up, mom + dad hit up the casino area, and I just went to the game arcade to see if I could beat donkey kong and galaga 88'; I dunno where sis went to, I think ben was there too, so they went somewhere. Odd that ben was not in the car ride with use but appeared later.&lt;br /&gt;So I'm in the arcade, and it pans back to the pac fammily as they tour the resort; being pac people means they don't have any luggage; Pac man had on his red tophat and mrs pacman had some sort of scarf/ascot thing on. Either way, they were looking at the pool area, which was a lake formed by natural springwater, so it was a large, moderately temperatured swim resort, but nobody was in there, weirdly. Spatially, the pool was rectangular, one half had a large auditorium for concerts, the other had the arcade casino, and the other half was leading back into the resort complex. So, at this point, the ghosts come out of nowhere and attack that pac family, and they go all super-pellet and try and fight off the ghosts; It's comedic, and total 80's cartoon style, but as a team they eat teh ghosts and those creepy as hell floating eyes go back to whence the came. They brush up, and pac man decides he needs to get cleaned up before hitting the casino!&lt;br /&gt;The ghosts respawn from somewhere, and start messing around in the arcade, I leave as soon as I see them, I have strong racial prejudice toward non-physical entities. But they check out my game, and do some sort of ghostly magic and pull the mario brothers OUT of the video game, even though it was donkey kong, we get the Super Mario Galaxy looking brothers in the real world, which was more cartoonery nonsense. Of course, the mario bothers immediately stare at the ghosts, who shy away, and they start talking like mario and luigi, and begin destroying bricks and bouncing around like maniacs.&lt;br /&gt;Pac man hears the commotion (Apparently the pac family is well adjusted to western lifestyle and causes no harm) and they rush in to stop the brothers, but, none of their pac-magic works against them; they aren;t ghosts, and they kick the hell out of pacman, but they really aren't willing to do too much, since they get confused about what is going on.&lt;br /&gt;Meanwhile, Pinky gets a cardboard cutout of bowser, and a princess (live, real person that looks like somewhat like Peach) and lures the brothers, but they tank this, and both pull out super stars...&lt;br /&gt;When they do, the game changes, and the brothers start pulling insane acrobatic stunts and just plow through the pac family, and contiue breakign and destroying the resort. The weekend police show up and rain firepower on them, but all of them get 'thrown' away from the super star powers. Everyone is now running around screaming, trying to escape these invincible madmen, people swimming away, going places they shouldn't. Scott apparently was there, and was running away from teh crowd down a rickey, rusty railroad tie area which led away from the resort through the hot spring, but a large metal grate collapsed and he fell down some tunnel. I didn;t notice for a while, since I made sure my folks had got to safety, and I went back to see if any hot chicks were in trouble; None to be seen, but I heard some bullshit and found scott trying to scar away a large bobcat, who was lured by the smell of blood and injury. So, I picked up a two by four and yelled at it; The cat was hardly persuaded, and jumped at me, so I bashed it's head in Scout style. The cat reeled, and started walking funny, it's skull caved and blood pouring down it's face, as it laid down to die from the concussive loss of lifegiving fluid. Ihelped scott up, he got scraped up pretty bad, but only twisted his ankle. So we left, and the mario brothers had run away, jumping around and screaming like madmed, powered by the ilusion of star power. The pac family was knocked out, and the ghosts had one this time.&lt;br /&gt;&lt;br /&gt;None of this mess made any sense. What a waste of sleep power.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4044374934526922505-9123371057823361887?l=imaginaryz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://imaginaryz.blogspot.com/feeds/9123371057823361887/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4044374934526922505&amp;postID=9123371057823361887&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/9123371057823361887'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/9123371057823361887'/><link rel='alternate' type='text/html' href='http://imaginaryz.blogspot.com/2010/01/fd-up-dream.html' title='F&apos;d up dream'/><author><name>Imaginary Z</name><uri>http://www.blogger.com/profile/05059116260376007206</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_O5BsOfO48b0/R1n4E03veuI/AAAAAAAAAAc/p0Q4WRLzwj0/S220/GargHead.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4044374934526922505.post-8500205802772698051</id><published>2010-01-02T15:24:00.000-06:00</published><updated>2010-01-02T15:24:05.199-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='work'/><title type='text'>Nebulous Cacophony to be removed</title><content type='html'>I'm going to be taking down www.gocaco.com; The site will still be up but until I work some deals involving some clams, I won't have the new site up for a while, and it will instead be used for hosting files that should be on my blog.&lt;br /&gt;&lt;br /&gt;Eventually it will be an accompaniment to my blog, and ultimately be turned into my blog. I intend to have a generic phpBB forum as part of the site, and a project management page for keeping track of my code and music projects (using lmms, code::blocks, GiMP, blender as core software components)&lt;br /&gt;&lt;br /&gt;So you'd better hurry up and download all that crap, lest you lose it forever!&lt;br /&gt;&lt;br /&gt;-Z&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4044374934526922505-8500205802772698051?l=imaginaryz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://imaginaryz.blogspot.com/feeds/8500205802772698051/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4044374934526922505&amp;postID=8500205802772698051&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/8500205802772698051'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/8500205802772698051'/><link rel='alternate' type='text/html' href='http://imaginaryz.blogspot.com/2010/01/nebulous-cacophony-to-be-removed.html' title='Nebulous Cacophony to be removed'/><author><name>Imaginary Z</name><uri>http://www.blogger.com/profile/05059116260376007206</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_O5BsOfO48b0/R1n4E03veuI/AAAAAAAAAAc/p0Q4WRLzwj0/S220/GargHead.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4044374934526922505.post-6012574406114588201</id><published>2009-12-29T22:17:00.000-06:00</published><updated>2009-12-29T22:17:41.839-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='personal'/><title type='text'>System Failure; Moustache is Clown</title><content type='html'>Bad News:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I suppose I need to pay more attention to my alien parasite; I think I forgot to pay it rent, and it decided to blast my sorry ass with disease; Nothing permanent, but in a certain high fever, severe headachey, painful bloody mess.&lt;br /&gt;&lt;br /&gt;As a result, I can't make the trip for the new years party. Nor can I do much of anything, at least until this xenoform decides to give me my life back.&lt;br /&gt;&lt;br /&gt;I hope you all have a great time, and bears x 100 or something.&lt;br /&gt;&lt;br /&gt;Good News:&lt;br /&gt;&lt;br /&gt;Uhhh... None for me, thanks!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4044374934526922505-6012574406114588201?l=imaginaryz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://imaginaryz.blogspot.com/feeds/6012574406114588201/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4044374934526922505&amp;postID=6012574406114588201&amp;isPopup=true' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/6012574406114588201'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/6012574406114588201'/><link rel='alternate' type='text/html' href='http://imaginaryz.blogspot.com/2009/12/system-failure-moustache-is-clown.html' title='System Failure; Moustache is Clown'/><author><name>Imaginary Z</name><uri>http://www.blogger.com/profile/05059116260376007206</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_O5BsOfO48b0/R1n4E03veuI/AAAAAAAAAAc/p0Q4WRLzwj0/S220/GargHead.png'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4044374934526922505.post-8942793829893556477</id><published>2009-12-17T21:45:00.001-06:00</published><updated>2009-12-17T22:42:00.789-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='wii'/><title type='text'>New Super Mario Bros</title><content type='html'>&amp;nbsp;So Curetis Siva hangs out and plays New Super Mario Bros for Nintendo's Wii.&lt;br /&gt;&lt;br /&gt;The results are a Mystery Science Theater 3000 like hilarious dialogue, and a perfect example of why this game is so much fun:&lt;br /&gt;&lt;br /&gt;&lt;object height="340" width="560"&gt;&lt;param name="movie" value="http://www.youtube.com/v/bovRH1B8T6E&amp;amp;hl=en_US&amp;amp;fs=1&amp;amp;"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/bovRH1B8T6E&amp;amp;hl=en_US&amp;amp;fs=1&amp;amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="560" height="340"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;object height="344" width="425"&gt;&lt;param name="movie" value="http://www.youtube.com/v/VucVO1szO8A&amp;amp;hl=en&amp;amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/VucVO1szO8A&amp;amp;hl=en&amp;amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4044374934526922505-8942793829893556477?l=imaginaryz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://imaginaryz.blogspot.com/feeds/8942793829893556477/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4044374934526922505&amp;postID=8942793829893556477&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/8942793829893556477'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/8942793829893556477'/><link rel='alternate' type='text/html' href='http://imaginaryz.blogspot.com/2009/12/new-super-mario-bros.html' title='New Super Mario Bros'/><author><name>Imaginary Z</name><uri>http://www.blogger.com/profile/05059116260376007206</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_O5BsOfO48b0/R1n4E03veuI/AAAAAAAAAAc/p0Q4WRLzwj0/S220/GargHead.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4044374934526922505.post-6566698012087298601</id><published>2009-11-21T12:11:00.002-06:00</published><updated>2009-11-21T14:30:06.632-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='adventure'/><category scheme='http://www.blogger.com/atom/ns#' term='xcore'/><category scheme='http://www.blogger.com/atom/ns#' term='opengl'/><category scheme='http://www.blogger.com/atom/ns#' term='mingl'/><title type='text'>mingl - depth sorting order</title><content type='html'>Depth sorting is a traditional fix for a variety of problems;&lt;br /&gt;&lt;br /&gt;However, it is a unsolvable problem. Consider that you have two long triangles, and you point the camera down the longest side of each. The triangles overlap; So if you draw one before the other, one triangle will depth clip the other, resulting in incorrect blending. The traditional fix is to draw with depth writing disabled, and then draw with color writing disabled. This can fix that special case, but causes other problems like highlights and odd depth clippings.&lt;br /&gt;&lt;br /&gt;As a direct result, you generally need to draw all opaque objects first; Then perform the above method, which should correctly render the transparent polygons. however, as it may be obvious, you need a specialized structure to deal with being able to partition and sort your meshes by transparency.&lt;br /&gt;&lt;br /&gt;This problem is not related to alpha clipping or depth fragment alpha, which is the problem of a semitransparent object occluding other geometry. In practice, it does well to solve this issue though.&lt;br /&gt;&lt;br /&gt;Here is the difference between depth sorting and non depth sorting your objects; Notice there are still some errors, but the effect is minimal:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_O5BsOfO48b0/SwgrQrl0ZtI/AAAAAAAAAI0/7gr_IxRJMlc/s1600/GenericDrawingOrder.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_O5BsOfO48b0/SwgrQrl0ZtI/AAAAAAAAAI0/7gr_IxRJMlc/s400/GenericDrawingOrder.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;This effect is largely a matter of taste; And mingl is not responsible for how you draw, only for abstracting the graphics rendering hardware.&lt;br /&gt;&lt;br /&gt;In a unrelated event; Any of you that know the Atari 2600 game "Adventure"? Well, you had better know about this hilarity: &lt;a href="http://slashx.googlepages.com/adventure2600reboot"&gt;Adventure 2600 Reboot&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://imaginaryz.blogspot.com/2008/07/more-adventure-nonsense.html"&gt;Sound familiar?&amp;nbsp;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Yeah. But it's not like my version; and after playing&amp;nbsp; their version, I think I can one up this, so I'll try and make a "Adventure Remix" using my mingl / xcore system. The benefits, are it is something I like to make, as well as something people can probably enjoy messing with for a little bit. I'm just drawing and modeling, but I do not plan to clone or copy the game, instead I want to recreate the spirit of the game, and add my own little improvements. Plus, with my new toon hemi shader, it can look all sorts of shiny.&lt;br /&gt;&lt;br /&gt;Til' later;&lt;br /&gt;&lt;br /&gt;-Z&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4044374934526922505-6566698012087298601?l=imaginaryz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://imaginaryz.blogspot.com/feeds/6566698012087298601/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4044374934526922505&amp;postID=6566698012087298601&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/6566698012087298601'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/6566698012087298601'/><link rel='alternate' type='text/html' href='http://imaginaryz.blogspot.com/2009/11/mingl-depth-sorting-order.html' title='mingl - depth sorting order'/><author><name>Imaginary Z</name><uri>http://www.blogger.com/profile/05059116260376007206</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_O5BsOfO48b0/R1n4E03veuI/AAAAAAAAAAc/p0Q4WRLzwj0/S220/GargHead.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_O5BsOfO48b0/SwgrQrl0ZtI/AAAAAAAAAI0/7gr_IxRJMlc/s72-c/GenericDrawingOrder.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4044374934526922505.post-5893418845723191502</id><published>2009-11-17T21:29:00.001-06:00</published><updated>2009-11-17T21:32:17.338-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='vbo'/><category scheme='http://www.blogger.com/atom/ns#' term='code'/><category scheme='http://www.blogger.com/atom/ns#' term='vertex program'/><category scheme='http://www.blogger.com/atom/ns#' term='opengl'/><category scheme='http://www.blogger.com/atom/ns#' term='fragment program'/><title type='text'>mingl - progress updates</title><content type='html'>xcore / mingl is moving along quite well.&lt;br /&gt;&lt;br /&gt;Operating on a basic create / destroy paradigm, with bind/unbind as the activation mechanism and load as the data send mechanism, it works well for abstracting graphics hardware and allowing for faster creation of intense graphics applications.&lt;br /&gt;&lt;br /&gt;Here's a nonsense screenshot:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_O5BsOfO48b0/SwNoyKH4vvI/AAAAAAAAAIs/fsOPgmL4eK8/s1600/GLBubblesVectorField.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_O5BsOfO48b0/SwNoyKH4vvI/AAAAAAAAAIs/fsOPgmL4eK8/s400/GLBubblesVectorField.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;This is a vector field represented as moving transparent spheres that are depth sorted. The vector field is generated by 3 functions modulated together.&lt;br /&gt;&lt;br /&gt;The shading is generated via vertex and fragment program. The meshes are using a VBO/IBO abstraction paradigm.&lt;br /&gt;&lt;br /&gt;All is well. More later.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4044374934526922505-5893418845723191502?l=imaginaryz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://imaginaryz.blogspot.com/feeds/5893418845723191502/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4044374934526922505&amp;postID=5893418845723191502&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/5893418845723191502'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/5893418845723191502'/><link rel='alternate' type='text/html' href='http://imaginaryz.blogspot.com/2009/11/mingl-progress-updates.html' title='mingl - progress updates'/><author><name>Imaginary Z</name><uri>http://www.blogger.com/profile/05059116260376007206</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_O5BsOfO48b0/R1n4E03veuI/AAAAAAAAAAc/p0Q4WRLzwj0/S220/GargHead.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_O5BsOfO48b0/SwNoyKH4vvI/AAAAAAAAAIs/fsOPgmL4eK8/s72-c/GLBubblesVectorField.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4044374934526922505.post-6906282330554393263</id><published>2009-11-06T19:59:00.001-06:00</published><updated>2009-11-06T20:02:39.256-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='opengl'/><title type='text'>DXT Texture compression</title><content type='html'>DXT image compression (also S3TC) allows you to save:&lt;br /&gt;&lt;br /&gt;DXT1_RGB -&amp;gt; 1:8&amp;nbsp; RGB 565 4 level only&lt;br /&gt;DXT1_RGBA -&amp;gt; 1:8&amp;nbsp; RGB 565 4 level and 1 bit alpha channel&lt;br /&gt;DXT5_RGBA -&amp;gt; 1:4&amp;nbsp; RGB 565 4 level and 7 level alpha channel&lt;br /&gt;&lt;br /&gt;As a result, for certain textures DXT can be used to compress images with reasonable loss of clarity.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_O5BsOfO48b0/SvTRcirrjjI/AAAAAAAAAIk/YEebMWKK0uQ/s1600-h/DXTCompressions.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_O5BsOfO48b0/SvTRcirrjjI/AAAAAAAAAIk/YEebMWKK0uQ/s400/DXTCompressions.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;Most importantly, within the DXT5 compression scheme, you still have 4x4 texel blocks interpolating between two color values. These color values are RGB565 (5 bits of red, 6 bits of gree, 5 bits of blue) and thus the green channel can be more precise. Also, the alpha channel has all 8 bits, but interpolates between 7 alpha values per texel. As a result, you can use DXT5 to store compressed normal maps by storing the x component in the green channel, and the y value in the alpha component. Then, in the shader, you can calculate the missing z value from assuming your normal map was actually normalized (x^2 + y^2 + z^2 = 1).&lt;br /&gt;&lt;br /&gt;More updates later.&lt;br /&gt;Z out.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4044374934526922505-6906282330554393263?l=imaginaryz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://imaginaryz.blogspot.com/feeds/6906282330554393263/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4044374934526922505&amp;postID=6906282330554393263&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/6906282330554393263'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/6906282330554393263'/><link rel='alternate' type='text/html' href='http://imaginaryz.blogspot.com/2009/11/dxt-texture-compression.html' title='DXT Texture compression'/><author><name>Imaginary Z</name><uri>http://www.blogger.com/profile/05059116260376007206</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_O5BsOfO48b0/R1n4E03veuI/AAAAAAAAAAc/p0Q4WRLzwj0/S220/GargHead.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_O5BsOfO48b0/SvTRcirrjjI/AAAAAAAAAIk/YEebMWKK0uQ/s72-c/DXTCompressions.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4044374934526922505.post-9012719399750944449</id><published>2009-11-05T19:50:00.001-06:00</published><updated>2009-11-05T19:51:23.536-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='blender python'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='graphics'/><category scheme='http://www.blogger.com/atom/ns#' term='blender'/><title type='text'>Cube Sphere</title><content type='html'>The Naiive implementation of making a Cube a Sphere is to make a cube, then select all verticies and "Mesh -&amp;gt; Transform -&amp;gt; To Sphere". This results in severe distortion along the principal axes, and a poor approximation of a sphere, as a result.&lt;br /&gt;&lt;br /&gt;A more correct implementation is to notice that this is analogous to taking two planes centered at the origin, and rotating them n time in discrete angular intervals, thus chopping space into uniform areas, resulting in far less distortion.&lt;br /&gt;&lt;br /&gt;Neither approach is perfect because you cannot comb a hairy sphere smooth. But the Cube Sphere is far superior, and easier to generate using a difference equation.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_O5BsOfO48b0/SvN9qH3_UeI/AAAAAAAAAIc/23M4yKMPFM0/s1600-h/CubeSphere.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5400798540769219042" src="http://1.bp.blogspot.com/_O5BsOfO48b0/SvN9qH3_UeI/AAAAAAAAAIc/23M4yKMPFM0/s400/CubeSphere.png" style="cursor: pointer; display: block; height: 220px; margin: 0px auto 10px; text-align: center; width: 400px;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Cube Spheres are good for working with planets and large scale data, but don't have many other uses besides easier texturing of spheres.&lt;br /&gt;&lt;br /&gt;..I can;t seem to figure out how to post data to blogger... how to post a .py script?&lt;br /&gt;&lt;br /&gt;It's not 100% perfect; copy paste into notepad or something&lt;br /&gt;&lt;br /&gt;Here goes nothin':&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;#!BPY&lt;br /&gt;"""&lt;br /&gt;Name: 'CubeSphere'&lt;br /&gt;Blender: 249&lt;br /&gt;Group: 'AddMesh'&lt;br /&gt;Tooltip: 'Creates a Cube Map sphere'&lt;br /&gt;"""&lt;br /&gt;__author__ = "Izcalli64"&lt;br /&gt;__url__ = ("blender", "http://imaginaryz.blogspot.com");&lt;br /&gt;__version__ = "0.0 2009-11-05"&lt;br /&gt;&lt;br /&gt;import Blender&lt;br /&gt;import math;&lt;br /&gt;&lt;br /&gt;def generate_grid( ndiv, spanning ):&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #Optimal spanning value: Unknown&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #Optimal spanning equation: Unknown&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; radius = 1.0;&amp;nbsp;&amp;nbsp;&amp;nbsp; #Fixed; don't vary this.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; points = [];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ndiv = int( ndiv );&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #From experiment; It looks like you need a transformation from radial space to manhatten space:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #the only fixed points are the 4 corner points, from which there are lateral and vertical lines;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #These lines must have points distributed on them evenly, by angle.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #These lines are NOT consistent, but do consist of great circle arcs.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #SOLUTION:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #Generate a cube sphere by taking 2 lists of evenly distributed angles;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #Generate the great circle planes (planes) that intersect the angles;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #Calculate all points on the grid that are the intersections of both:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #&amp;nbsp;&amp;nbsp;&amp;nbsp; The sphere of radius R&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #&amp;nbsp;&amp;nbsp;&amp;nbsp; Great circles A and B (will always form a line, no matter what.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #The result:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #&amp;nbsp;&amp;nbsp;&amp;nbsp; Quite a substantial amount less error than the other method. (see .blend)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #The problem:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #&amp;nbsp;&amp;nbsp;&amp;nbsp; Hard to optimize&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; dtr = math.pi/180.0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mina = 45.0 * dtr;&amp;nbsp;&amp;nbsp;&amp;nbsp; #Minimum angle (45 = pi/4)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; maxa = 135.0 * dtr;&amp;nbsp;&amp;nbsp;&amp;nbsp; #Maximum angle (135 = 3*pi/4)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; rangea = maxa - mina;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; dela = (maxa - mina)/float(ndiv-1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; spanrange = dela * spanning;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #Generate strip angles (for consistency)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; stripa = [];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; stripa.append( [ mina, math.sin(mina), math.cos(mina) ] );&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; idex = 1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ia = mina + dela;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; while( idex &amp;lt; (ndiv-1) ):&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; #Default angles (angular evenness)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; #stripa.append( [ ia, math.sin(ia), math.cos(ia) ] );&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; #Corrected angles:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; delv = 2.0 * ((float(idex)/float(ndiv-1)) - 0.5);&amp;nbsp;&amp;nbsp;&amp;nbsp; #-1.0..1.0 range&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; dels = 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if( delv &amp;lt; 0 ):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; dels = -1.0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; elif( delv &amp;gt; 0 ):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; dels = 1.0;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; #Correction quadratic equation (B-spline could be more effective)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; #ian = dels * (delv*delv) * spanrange + ia;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; #ian = -dels * (1.0 - (delv*delv)) * spanrange + ia;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; ian = -dels * (1.0 - abs(delv)) * spanrange + ia;#Very simple; linear. Problem is not linear.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; #print delv, dels, -dels * (1.0 - (delv*delv));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; stripa.append( [ ian, math.sin(ian), math.cos(ian) ] );&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; ia += dela;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; idex += 1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; stripa.append( [ maxa, math.sin(maxa), math.cos(maxa) ] );&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for ex in stripa:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; print ex;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #Generate strips:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; iy = 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; while( iy &amp;lt; ndiv ):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; ix = 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; while( ix &amp;lt; ndiv ):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; #Plane X / Circle X&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; PXx = stripa[ix][2];&amp;nbsp;&amp;nbsp;&amp;nbsp; #cos(x)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; PXy = stripa[ix][1];&amp;nbsp;&amp;nbsp;&amp;nbsp; #sin(x)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; PXz = 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; #Plane Y / Circle Y&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; PYx = stripa[iy][2];&amp;nbsp;&amp;nbsp;&amp;nbsp; #cos(y)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; PYy = 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; PYz = stripa[iy][1];&amp;nbsp;&amp;nbsp;&amp;nbsp; #sin(y)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; #Cross product (direction vector to use; can be optimized:)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; #nx = PXy * PYz - PXz * PYy;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; #ny = PXz * PYx - PXx * PYz;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; #nz = PXx * PYy - PXy * PYx;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; nx =&amp;nbsp;&amp;nbsp; PXy * PYz;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; ny = - PXx * PYz;&amp;nbsp;&amp;nbsp;&amp;nbsp; #Optimized cross product from zero factors&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; nz = - PXy * PYx;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; #Normalize direction vector&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; nm = math.sqrt( nx*nx + ny*ny + nz*nz );&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; nx /= nm;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; ny /= nm;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; nz /= nm;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; #Apply scaling of shape&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; tx = radius * nx;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; ty = radius * ny;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; tz = radius * nz;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; points.append( [tx,ty,tz] );&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; ix += 1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; iy += 1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return points;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;def generate_points_swizzle( points, comp0, comp1, comp2, neg0, neg1, neg2 ):&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; newpoints = [];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; sw0 = comp0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; sw1 = comp1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; sw2 = comp2;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for P in points:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; np = [0,0,0];#[ P[sw0], P[sw1], P[sw2] ];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if( neg0 != 0 ): &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; np[0] = -P[sw0];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; else:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; np[0] = P[sw0];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if( neg1 != 0 ): &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; np[1] = -P[sw1];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; else:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; np[1] = P[sw1];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if( neg2 != 0 ): &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; np[2] = -P[sw2];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; else:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; np[2] = P[sw2];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; newpoints.append( np );&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return newpoints;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;def generate_grid_uv( xdiv, ydiv ):&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; uvs = [];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; iy = 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; while( iy &amp;lt; (ydiv) ):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; ix = 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; while( ix &amp;lt; (xdiv) ):&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; u0 = float( ix ) / float(xdiv-1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; v0 = float( iy ) / float(ydiv-1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; uvs.append( [u0,v0] );&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; ix += 1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; iy += 1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return uvs;&lt;br /&gt;&lt;br /&gt;def generate_grid_facelist( xdiv, ydiv, offset_index ):&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; faces = [];&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; iy = 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; while( iy &amp;lt; (ydiv-1) ):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; ix = 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; while( ix &amp;lt; (xdiv-1) ):&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; fxy00 = int(offset_index + ix + (iy * xdiv));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; fxy10 = int(offset_index + ix + 1 + (iy * xdiv));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; fxy01 = int(offset_index + ix + ((iy + 1) * xdiv));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; fxy11 = int(offset_index + ix + 1 + ((iy + 1) * xdiv));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; faces.append( [fxy00,fxy10,fxy11,fxy01] );&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; ix += 1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; iy += 1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return faces;&lt;br /&gt;&lt;br /&gt;def generate_cubesphere( in_radius, in_divisions, in_evenness ):&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #Generate each cube face, simply rotate it's data to match what we want.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ndiv = in_divisions + 2;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; faces = [];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; points = [];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; uvs = [];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; origpoints = generate_grid( ndiv, in_evenness );#x,y,z&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; faces.extend( generate_grid_facelist( ndiv, ndiv, 0 ) );&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; points.extend( origpoints );&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; uvs.extend( generate_grid_uv( ndiv, ndiv ) );&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; faces.extend( generate_grid_facelist( ndiv, ndiv, len(points) ) );&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; points.extend( generate_points_swizzle( origpoints, 2,1,0, 0,0,0 ) );&amp;nbsp;&amp;nbsp;&amp;nbsp; #x,y,z =&amp;gt; z,y,x&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; uvs.extend( generate_grid_uv( ndiv, ndiv ) );&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; faces.extend( generate_grid_facelist( ndiv, ndiv, len(points) ) );&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; points.extend( generate_points_swizzle( origpoints, 2,0,1, 0,0,0 ) );&amp;nbsp;&amp;nbsp;&amp;nbsp; #x,y,z =&amp;gt; x,z,y&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; uvs.extend( generate_grid_uv( ndiv, ndiv ) );&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; faces.extend( generate_grid_facelist( ndiv, ndiv, len(points) ) );&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; points.extend( generate_points_swizzle( origpoints, 0,1,2, 1,1,1 ) );&amp;nbsp;&amp;nbsp;&amp;nbsp; #x,y,z =&amp;gt; -x,-y,-z&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; uvs.extend( generate_grid_uv( ndiv, ndiv ) );&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; faces.extend( generate_grid_facelist( ndiv, ndiv, len(points) ) );&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; points.extend( generate_points_swizzle( origpoints, 2,1,0, 1,1,1 ) );&amp;nbsp;&amp;nbsp;&amp;nbsp; #x,y,z =&amp;gt; -z,-y,-x&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; uvs.extend( generate_grid_uv( ndiv, ndiv ) );&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; faces.extend( generate_grid_facelist( ndiv, ndiv, len(points) ) );&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; points.extend( generate_points_swizzle( origpoints, 2,0,1, 1,1,1 ) );&amp;nbsp;&amp;nbsp;&amp;nbsp; #x,y,z =&amp;gt; -x,-z,-y&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; uvs.extend( generate_grid_uv( ndiv, ndiv ) );&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #Scale all points by radius value (lol?)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return points,uvs,faces;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;def main():&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Draw = Blender.Draw&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PREF_RADIUS = Draw.Create(1.0)&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; #"Radius" of cube-sphere&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PREF_DIVISIONS = Draw.Create(7)&amp;nbsp;&amp;nbsp;&amp;nbsp; #Divisions per face&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PREF_EVENNESS = Draw.Create(0.0)&amp;nbsp;&amp;nbsp;&amp;nbsp; #Evenness of point distribution (by area weighting, so uv texture distortion is absolute minimal at default value)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if not Draw.PupBlock('Add CubeSphere', [\&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ('Radius:', PREF_RADIUS,&amp;nbsp; 0.01, 100.0, 'Radius for the main ring of the torus'),\&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ('Divisions:', PREF_DIVISIONS,&amp;nbsp; 0, 256, 'Number of subdivisions to generate'),\&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ('Evenness:', PREF_EVENNESS,&amp;nbsp; -1.0, 1.0, 'Evenness scaling for evaluation'),\&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ]):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; return;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; verts, uvs, faces = generate_cubesphere( PREF_RADIUS.val, PREF_DIVISIONS.val, PREF_EVENNESS.val );&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #Every vertex has an exact and corresponding uv value to it (sticky uv)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #As a result, it shall be simple to assign face UV's.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; meshobj = Blender.Object.New( 'Mesh', 'CubeSphere' );&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; meshdata = Blender.Mesh.New();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; meshdata.verts.extend(verts);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; meshdata.faces.extend(faces);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #Apply uv coordinates:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; meshdata.addUVLayer("CubeMap");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; meshdata.activeUVLayer = "CubeMap";&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if( meshdata.faceUV ):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; for f in meshdata.faces:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; vinds = [];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; for v in f.verts:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; vinds.append( v.index );&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; vdin = 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; for vdex in f.uv:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; uvd = uvs[ vinds[ vdin ] ];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; vdex[0] = uvd[0];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; vdex[1] = uvd[1];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; vdin += 1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; else:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; print "#ERROR; Face UV could not be enabled??";&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; meshdata.calcNormals();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; meshdata.update();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; meshobj.link( meshdata );&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Blender.Scene.GetCurrent().objects.link( meshobj );&amp;nbsp;&amp;nbsp;&amp;nbsp; #Is this deprecated? #ERROR&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;main();&lt;br /&gt;#Blender.Draw.PupMenu("Error%t|This script requires a full python installation")&lt;br /&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4044374934526922505-9012719399750944449?l=imaginaryz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://imaginaryz.blogspot.com/feeds/9012719399750944449/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4044374934526922505&amp;postID=9012719399750944449&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/9012719399750944449'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/9012719399750944449'/><link rel='alternate' type='text/html' href='http://imaginaryz.blogspot.com/2009/11/cube-sphere.html' title='Cube Sphere'/><author><name>Imaginary Z</name><uri>http://www.blogger.com/profile/05059116260376007206</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_O5BsOfO48b0/R1n4E03veuI/AAAAAAAAAAc/p0Q4WRLzwj0/S220/GargHead.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_O5BsOfO48b0/SvN9qH3_UeI/AAAAAAAAAIc/23M4yKMPFM0/s72-c/CubeSphere.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4044374934526922505.post-8772151551532468691</id><published>2009-10-31T13:54:00.004-05:00</published><updated>2009-10-31T14:02:49.179-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='code'/><category scheme='http://www.blogger.com/atom/ns#' term='vertex array'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='opengl'/><title type='text'>Vertex Buffer Objects - speed testing</title><content type='html'>For drawing 32,768 meshes of 12*16*2 triangles each (1 triangle strip):&lt;br /&gt;&lt;br /&gt;OpenGL 2.1 hardware:&lt;br /&gt;VA/IA: ~230ms&lt;br /&gt;VBO: ~30ms&lt;br /&gt;&lt;br /&gt;OpenGL 1.4 hardware:&lt;br /&gt;VA/IA: ~230ms&lt;br /&gt;VBO: ~240ms&lt;br /&gt;&lt;br /&gt;The note is, although your card may say it supports the VBO extension, or support VBO as per the OpenGL 1.5 specs, it doesn't.&lt;br /&gt;&lt;br /&gt;VBO's only work in 1.5 GL's or later, due to hardware restrictions.&lt;br /&gt;&lt;br /&gt;Remember; If you worry about optimization, you'd better have timing tests to verify that it even matters. Saving about 10% or more is useful.&lt;br /&gt;Also, small frame optimizations are useless; Anyone can do those, and they generally introduce unmaintainable hacks. Worry about your high level optimizations, like using "most common failed test first" and algorithmic and design changes to maximize your logical speed.&lt;br /&gt;&lt;br /&gt;Anyways. Here's a buncha UV spheres, as mentioned (generated using xcore + mingl):&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_O5BsOfO48b0/SuyI_bnBvkI/AAAAAAAAAIU/7LdlVYEaV8M/s1600-h/StareTooHardAndYouSeeEverything.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 234px;" src="http://1.bp.blogspot.com/_O5BsOfO48b0/SuyI_bnBvkI/AAAAAAAAAIU/7LdlVYEaV8M/s400/StareTooHardAndYouSeeEverything.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5398840676634967618" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Currently working on the texture functions in mingl. Having to write compressors/decompressors for all the DXT formats. It'll be quite useful though.&lt;br /&gt;&lt;br /&gt;Z out. Happy Halloween.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4044374934526922505-8772151551532468691?l=imaginaryz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://imaginaryz.blogspot.com/feeds/8772151551532468691/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4044374934526922505&amp;postID=8772151551532468691&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/8772151551532468691'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/8772151551532468691'/><link rel='alternate' type='text/html' href='http://imaginaryz.blogspot.com/2009/10/vertex-buffer-objects-speed-testing.html' title='Vertex Buffer Objects - speed testing'/><author><name>Imaginary Z</name><uri>http://www.blogger.com/profile/05059116260376007206</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_O5BsOfO48b0/R1n4E03veuI/AAAAAAAAAAc/p0Q4WRLzwj0/S220/GargHead.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_O5BsOfO48b0/SuyI_bnBvkI/AAAAAAAAAIU/7LdlVYEaV8M/s72-c/StareTooHardAndYouSeeEverything.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4044374934526922505.post-8827293783246495544</id><published>2009-10-29T20:31:00.005-05:00</published><updated>2009-10-29T20:40:16.668-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='code'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='opengl'/><title type='text'>xcode, mingl, xgfx</title><content type='html'>Continuing my great adventure to construct the engine I need;&lt;br /&gt;Yes Unity is now free. Who cares; What we need is a blender Synthesis program so I can use all my high def animations and levels.&lt;br /&gt;&lt;br /&gt;xcore is moving along nicely, most data structure and memory alignment things work perfectly. Still some issues with float hacks.&lt;br /&gt;&lt;br /&gt;mingl is quickly being put together, the abstraction of all mesh data into the VBO/IBO/VAO paradigm makes using OpenGL very very nice. In fact, learning a mingl type system is far easier than learning OpenGL fixed pipeline crap.&lt;br /&gt;&lt;br /&gt;Vertex Buffer Objects:&lt;br /&gt;&lt;br /&gt;They don't help unless you have OpenGL 1.5 or higher. Go figure.&lt;br /&gt;And instancing doesn't really help unless you have a very specialized, small geometry item.&lt;br /&gt;Here's 32,768 cubes:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_O5BsOfO48b0/SupCtQPosTI/AAAAAAAAAIM/0J-D6WEp4pU/s1600-h/DontStareIntoTheTriangulation.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 234px;" src="http://2.bp.blogspot.com/_O5BsOfO48b0/SupCtQPosTI/AAAAAAAAAIM/0J-D6WEp4pU/s400/DontStareIntoTheTriangulation.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5398200448579055922" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;If you stare too long, you begin to see a n-dimensional triangulation or worse, a shadow of a n-dimensional object.&lt;br /&gt;&lt;br /&gt;I'll press on until I can have dancing lizard demo # 4. Or in this case, it might be a higher res female model.&lt;br /&gt;&lt;br /&gt;Peace out.&lt;br /&gt;-Z&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4044374934526922505-8827293783246495544?l=imaginaryz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://imaginaryz.blogspot.com/feeds/8827293783246495544/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4044374934526922505&amp;postID=8827293783246495544&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/8827293783246495544'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/8827293783246495544'/><link rel='alternate' type='text/html' href='http://imaginaryz.blogspot.com/2009/10/xcode-mingl-xgfx.html' title='xcode, mingl, xgfx'/><author><name>Imaginary Z</name><uri>http://www.blogger.com/profile/05059116260376007206</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_O5BsOfO48b0/R1n4E03veuI/AAAAAAAAAAc/p0Q4WRLzwj0/S220/GargHead.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_O5BsOfO48b0/SupCtQPosTI/AAAAAAAAAIM/0J-D6WEp4pU/s72-c/DontStareIntoTheTriangulation.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4044374934526922505.post-7728892358248286306</id><published>2009-10-25T13:27:00.002-05:00</published><updated>2009-10-25T13:39:46.121-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='code'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='opengl'/><title type='text'>xcore, mingl, xgfx</title><content type='html'>Not much to update today; Started some new projects.&lt;br /&gt;&lt;br /&gt;In the spirit of the IGTL::Sys classes I made (mostly copy paste from them since they're so dang useful), I am building xcore, which is responsible for:&lt;br /&gt;&lt;br /&gt;1. OS level byte types&lt;br /&gt;2. exceptions and error reporting&lt;br /&gt;3. CPU identification, SSE intrinsic math and special instructions&lt;br /&gt;4. Memory manager&lt;br /&gt;5. Specialized templated common file structures, like index_array, carray, index_deque, string_table&lt;br /&gt;6. Directory I/O and file I/O&lt;br /&gt;&lt;br /&gt;XCore is the minimal utility toolkit that drives all of my programming. On top of XCore is an important layer called GHOST, which was coded by the blender foundation and furthur extended by me for my own projects. GHOST is a cross platform windowing toolkit that accomplishes some of these things, but not all of them. I'm using it religiously since it avoids stupid SDL licensing issues, and has support for context sharing, multiple windows, and a better event system. The nice thing is, since I use blender anyways to make all of my media, it'll be a cinch to always mention i am using code from blender, thus keeping in line with their license for distribution.&lt;br /&gt;&lt;br /&gt;mingl is a minimum wrapper on top of OpenGL that completly abstracts it, preventing me from making any non-suppported OpenGL calls. For example, it wraps all geometry data as a vbo/ibo/vao class (read up on OpenGL 3.0 if you don't know what these are) and internally can down-support any openGL version using this system. It cannot abstract shades really well, so it looks like it will require GL 2.0+ for any shaders to even work. I'm also not sure yet if I need to write my own shader coders so that the engine can generate shaders for vertex/fragment program aas well as GLSL; This seems a little difficult at the moment so I'll defer it.&lt;br /&gt;&lt;br /&gt;xgfx is the graphics engine that performs culling, scene management, mesh updating, keyframing, armature animations, lighting, shadowing, and all the regular crap you expect to have in a game engine. &lt;br /&gt;&lt;br /&gt;So, with this toolchain of xcore/ mingl/ xgfx /xoal/ xnet, it should abstract all the things I need for any game, just like I did back in late 2005. Except this time, it'll be my engine with no rules and no hangups or lies to slow me down. Of other importance, it's all using C++ as much as possible, so each component should be independent as much as possible.&lt;br /&gt;&lt;br /&gt;Z out.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4044374934526922505-7728892358248286306?l=imaginaryz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://imaginaryz.blogspot.com/feeds/7728892358248286306/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4044374934526922505&amp;postID=7728892358248286306&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/7728892358248286306'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/7728892358248286306'/><link rel='alternate' type='text/html' href='http://imaginaryz.blogspot.com/2009/10/xcore-mingl-xgfx.html' title='xcore, mingl, xgfx'/><author><name>Imaginary Z</name><uri>http://www.blogger.com/profile/05059116260376007206</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_O5BsOfO48b0/R1n4E03veuI/AAAAAAAAAAc/p0Q4WRLzwj0/S220/GargHead.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4044374934526922505.post-5530801613090751627</id><published>2009-10-10T16:29:00.005-05:00</published><updated>2009-10-10T16:54:07.037-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='shaders'/><category scheme='http://www.blogger.com/atom/ns#' term='vbo'/><category scheme='http://www.blogger.com/atom/ns#' term='graphics'/><category scheme='http://www.blogger.com/atom/ns#' term='code'/><category scheme='http://www.blogger.com/atom/ns#' term='vertex array'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='model'/><category scheme='http://www.blogger.com/atom/ns#' term='GLSL'/><category scheme='http://www.blogger.com/atom/ns#' term='opengl'/><category scheme='http://www.blogger.com/atom/ns#' term='blender'/><title type='text'>KDTrees and blender gui synthetics</title><content type='html'>Remember kids, if you use a synthetic oil, it's not a good idea to switch back to regular.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_O5BsOfO48b0/StD9FfgpyZI/AAAAAAAAAH0/TvLUIjsA1H8/s1600-h/KDTreeBlenderLikeGUINT.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 312px;" src="http://1.bp.blogspot.com/_O5BsOfO48b0/StD9FfgpyZI/AAAAAAAAAH0/TvLUIjsA1H8/s400/KDTreeBlenderLikeGUINT.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5391087024762112402" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;As far as I understand it, "KDTrees" are simply a data structure that says:&lt;br /&gt;&lt;br /&gt;def kdtree:&lt;br /&gt;   def node:&lt;br /&gt;       x,y,w,h&lt;br /&gt;       split&lt;br /&gt;       low_node *&lt;br /&gt;       high_node *&lt;br /&gt;       parent *&lt;br /&gt;       direction&lt;br /&gt;&lt;br /&gt;And, each node occupies a region of space defined by a x,y,w,h box (or x,y,z) and "splits" that box into TWO boxes, along only one of the axes (either x or y). This way, you can more efficiently partition static objects into a scene; this is like all BSP / octree scene management techniques; However, updating a KD tree is rather expensive, it really is good for storing static scenes though as it requires a far lesser node density and can expand into any other volume as needed.&lt;br /&gt;&lt;br /&gt;So, they're used in blender's GUI; I'm getting my mockup GUI system to work slowly, and here are many panels defined by glViewports with text in them. The text system is nothing more than a badass texture font I used some free program to generate with 2 px padding and as a alpha only texture, so the memory required for those letters is quite minimal; although fonts are not conducive to mipmapping, so you must manually provide other LOD fonts for your program. Don't forget that always mipmapping is better for your hardware.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_O5BsOfO48b0/StD9NJCAceI/AAAAAAAAAH8/60giUmF1ofU/s1600-h/KDTreeBlenderLikeGUI.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 312px;" src="http://3.bp.blogspot.com/_O5BsOfO48b0/StD9NJCAceI/AAAAAAAAAH8/60giUmF1ofU/s400/KDTreeBlenderLikeGUI.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5391087156166947298" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I'm also perfecting my cMesh class, which will provide a full next generation mesh including armature animation and animux system, basically equaling and exceeding the capabilities of all existing high definition games; And doing so in a manner consistent with next gen technology (VBO/Shader) while still retaining the ability to be processed via older cards, at great CPU expense.&lt;br /&gt;&lt;br /&gt;It looks something like this:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_O5BsOfO48b0/StD_XjnLK3I/AAAAAAAAAIE/l6xb0q9QTzs/s1600-h/ProperMeshFormat.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 309px; height: 400px;" src="http://4.bp.blogspot.com/_O5BsOfO48b0/StD_XjnLK3I/AAAAAAAAAIE/l6xb0q9QTzs/s400/ProperMeshFormat.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5391089534124108658" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The concept is present in all games I have hacked, and works like this:&lt;br /&gt;&lt;br /&gt;A mesh consists of "tiles", which are separate VA/IA's that contain some amount of triangle strips/triangles/quadstrips with a consistent vertex format and ideally contiguous data. This means each tile can store different vertex parameters, the usual culprits are:&lt;br /&gt;&lt;br /&gt;current vertex position (3)&lt;br /&gt;next vertex position + weight (4) //For mesh keyframes only&lt;br /&gt;texcoord 0 (2) //1st texture coordinate&lt;br /&gt;texcoord 1 (2) //2nd texture coordinate (if you have seperate UV mappings, not efficient)&lt;br /&gt;normal (3) //Required for any lighting&lt;br /&gt;binormal (3) //can be shader generated, but space may need to exist in VA array)&lt;br /&gt;matrix indicies (4) //Required to skin a mesh that has more than 1 matrix deforming it&lt;br /&gt;matrix weights (4) //Required to skin a mesh properly&lt;br /&gt;&lt;br /&gt;So, each tile can behave as a independent mesh. Above a tile is a tile state, which contains the RC (RenderCommand) array for actually issuing the stripping indicies and material changes and matrix palette updates for this mesh.&lt;br /&gt;&lt;br /&gt;Above that is the TileTree, so you can swap/zsort/prioritize and use lod tiles as needed. &lt;br /&gt;&lt;br /&gt;the concept of a tile is to load all mesh data into your graphic card, and then merely tell the card what to use to render via a few array binding commands. This is extremely efficient, as it supports mesh instancing to a large degree, and prevents transferring data to the card. The only drawback is you still have to transmit matrix updates to the card, but even a 270 bone character (like Valgirt) this is still far less information that a small VA.&lt;br /&gt;&lt;br /&gt;So, once you have tiles setup, we have a generic bone/matrix animation system, with a matrix class (yes, I like quat's too, but matrices require less conversions in a game setting; these matricies can be changed to be only state driven mind you.).&lt;br /&gt;&lt;br /&gt;The heart of this system is the base animation classes, which consist of "Keys" which are blocks of static data to interpolate between, "Channels" which are a list of keys and times, and "Animations" which combine channels together to form complete animations. &lt;br /&gt;&lt;br /&gt;The Animux is a animation multiplexer, which combines any number of animations together, so that you can use multiple types of animations together, for instance "Run_legs" and "Shoot_Torso" like Quake, or "Face_Phoneme_ma" and "Run". This allows you to make characters that can walk, talk, and run + shoot at the same time, and even use IK calculations as you want.&lt;br /&gt;&lt;br /&gt;I've probably done this thrice before, but THIS time, I've got it nailed, and have massive amounts of evidence and experience with the new GLSL to support this type of design. Hopefully, I can get AniStar up and running so I can actually have a program that can make animations for given characters.&lt;br /&gt;&lt;br /&gt;Z out.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4044374934526922505-5530801613090751627?l=imaginaryz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://imaginaryz.blogspot.com/feeds/5530801613090751627/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4044374934526922505&amp;postID=5530801613090751627&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/5530801613090751627'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/5530801613090751627'/><link rel='alternate' type='text/html' href='http://imaginaryz.blogspot.com/2009/10/kdtrees-and-blender-gui-synthetics.html' title='KDTrees and blender gui synthetics'/><author><name>Imaginary Z</name><uri>http://www.blogger.com/profile/05059116260376007206</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_O5BsOfO48b0/R1n4E03veuI/AAAAAAAAAAc/p0Q4WRLzwj0/S220/GargHead.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_O5BsOfO48b0/StD9FfgpyZI/AAAAAAAAAH0/TvLUIjsA1H8/s72-c/KDTreeBlenderLikeGUINT.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4044374934526922505.post-4009711093259360048</id><published>2009-10-01T20:06:00.003-05:00</published><updated>2009-10-01T20:46:26.723-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='graphics'/><category scheme='http://www.blogger.com/atom/ns#' term='code'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='opengl'/><category scheme='http://www.blogger.com/atom/ns#' term='nvidia'/><category scheme='http://www.blogger.com/atom/ns#' term='FPS'/><title type='text'>Graphical 'Lag' Problem resolved</title><content type='html'>Here's the problem:&lt;br /&gt;&lt;br /&gt;You code up a nice 3D game, and find that every time you call 'swapBuffers' your program is blocked from execution. You've tried threads, weird API's, and even low level OS hacking tricks; And nothing fixes it! Your game will still be forced to run at 60 FPS, no matter what, and every buffer swap lags your code at least 15 ms! Which is total burned CPU! And tons of dropped packets! And messages!&lt;br /&gt;&lt;br /&gt;If you happen to have a graphics card, and specifically a NVidia one, here is the problem:&lt;br /&gt;&lt;br /&gt;Go to start-&gt;Control Panel-&gt; NVidia Control Panel(Display; Move to the display tab, advanced... Open the Nvidia Control Panel)&lt;br /&gt;&lt;br /&gt;Make sure this is off:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_O5BsOfO48b0/SsVSo-FzUSI/AAAAAAAAAHs/5u2THGizppQ/s1600-h/DisplayIssuesResolved.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 326px;" src="http://2.bp.blogspot.com/_O5BsOfO48b0/SsVSo-FzUSI/AAAAAAAAAHs/5u2THGizppQ/s400/DisplayIssuesResolved.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5387803393034244386" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;What is happening, is it is making a crit section/thread safe block for buffer swaps, which if you write high performance games, this kills your testing phase since your game is force-lagged out.&lt;br /&gt;&lt;br /&gt;This easily pushed my FPS and IFPS from 60 to well in the hundreds. In fact, in my GHOST test, I went from 15 RFms with 1 dropped frame to 10 RFms with 0 dropped frames. This translates to 0 dropped frames per second from 60 dropped frames per second.&lt;br /&gt;&lt;br /&gt;I have fought this problem for a while; glad it wasn't my problem. The moral of the story? Sometimes you just have to step back and learn something new.&lt;br /&gt;&lt;br /&gt;- Imaginary Z&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4044374934526922505-4009711093259360048?l=imaginaryz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://imaginaryz.blogspot.com/feeds/4009711093259360048/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4044374934526922505&amp;postID=4009711093259360048&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/4009711093259360048'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/4009711093259360048'/><link rel='alternate' type='text/html' href='http://imaginaryz.blogspot.com/2009/10/graphical-lag-problem-resolved.html' title='Graphical &apos;Lag&apos; Problem resolved'/><author><name>Imaginary Z</name><uri>http://www.blogger.com/profile/05059116260376007206</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_O5BsOfO48b0/R1n4E03veuI/AAAAAAAAAAc/p0Q4WRLzwj0/S220/GargHead.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_O5BsOfO48b0/SsVSo-FzUSI/AAAAAAAAAHs/5u2THGizppQ/s72-c/DisplayIssuesResolved.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4044374934526922505.post-2863471544014386716</id><published>2009-09-29T16:34:00.000-05:00</published><updated>2009-09-29T16:35:14.653-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lucid dream'/><category scheme='http://www.blogger.com/atom/ns#' term='dream'/><title type='text'>Dream Blog - Fuckin' Midna</title><content type='html'>Not much to describe; A lot of it was fuzzy, and some parts were pure fanservice to me; Of which I will not include. If they weren't obvious, too bad.&lt;br /&gt;&lt;br /&gt;Apparently, John, Brien, and I were driving away from some upper eastern state; I guess something happened and we had to get out of there. So it's a roadtrip dream for a while, that is until we come across a bridge made out of pretty rickety stuff, something noone would ever drive a car over. Well, turned out we couldn't drive the car over it, so we hitched up and carried our stuff over to the other side; The area was extremely densely wooded, very large tall old trees, and we could see a motel not too far away. I kidded, and since I knew it was a dream, was like "Oh man, guess we can't get across." John pointed out that the floating logs in the mire below could be used as a bridge, but not seriously. Again, since I had control at this point, I just jumped down onto the logs, a good 30-50 ft fall into a alligator and log filled pit. Much to my surprise, the gator's had no intent of attacking anything, and I just walked across to the land while brien and john walked down a cliff calling me an idiot. I got bored, so I pissed off a gator intentionally just to see what it would do; It didn't do anything* except hiss. Oh well.&lt;br /&gt;Anyways, we walked to the hotel through some foresty path, which was a little rundown, apparently everything had been abandoned like some sort of zombie apocalypse dream. Though, there were no other people around John did have a .45 like sidearm, which was nice, brien was just brien, and I didn't have any weapons. We went it, the place still had power, and set up camp on a higher floor, the water as a little murky so we'd have to move forward eventually; But with power we could survive a little bit. Somehow, Zach was able to join us, and we chatted it up, he seemed to know more about what was happening, but it was all cryptic and didn't make any sense.&lt;br /&gt;Somehow there's a memory gap here, and we're entering this city which had been mostly abandoned, this odd side plot of this little Midna clone chick constantly thwarting our adventures came clear; It was like a little demon, exactly like Midna. Apparently it had the hots for John or something, but it was trying to kill us as we went through the city to the center or somewhere like that.&lt;br /&gt;Well, since it's entirely fantasy at this point, I can't clearly remember how it ended up this way, but Midna became our friend, and it turned out that this other demon was following John, because he had a pure heart, and only once two pure hearts could combine could she attain "ultimate power". Well, Midna happened to have one, and at some point John and Midna realized this; Demon shows up, takes the pure heart (which, I liked this detail that the "pure heart" was purely glitter; It had no effect being added or removed to either person) and morphs into this giant cobra-shiva-rampage monster, and begins trying to kill John and Midna.&lt;br /&gt;At this point it get's interesting, because we get a lives counter* and a equipment list, and start trying to fight off a rampaging beast. Of course it summons multiple other beasts to help it wreck up the place; all cool looking and somewhat reminiscent of "Inhumanoids". But my dad, dad's brother, and plenty of other familairs showed up, each with special abilities to help us construct traps to try and kill the beasts. Dad's bro (also named John) was a demolitions expert in a lab coat with welding goggles and gloves, and we used him the most because we could lure the monster to a building rigged to explode, and do some serious damage to it&lt;br /&gt;So we continued running and crazy climbing things trying to stop or otherwise kill the monsters, John and Midna equipped ethereal weapons and constantly were moving and firing green glowing arrows at it like Hexen; I dunno what happened to everyone else. &lt;br /&gt;At some point, we got cornered by all 4 monsters, and the large one declared victory, but somehow there was a blackout and explosion, and everything went black.&lt;br /&gt;After awakening, the entire city was destroyed, it was very dark, the sky has a dark reddish tint and smelled of death, lights were barely glowing, and kelly, me and brien were the only ones nearby. I picked up a steel pipe and kelly had a crossbow and brien had a rock for bashing popo's with. Anyways, apparently, the world had ended and those monsters had completely destroyed civilization as we know it, which was great, given what's going on at the moment.&lt;br /&gt;Ran into a stupid chain gang, rummaging through a car, I queried them for info, fought them, won easily (apparently, knowledge of martial arts went away too) and they told us the scoop and let us join their gang. Which included running around stealing things out of cars. So, then we began the quest rummaging through this destroyed world to find our friends.&lt;br /&gt;&lt;br /&gt;Alarm goes off!&lt;br /&gt;&lt;br /&gt;* Missing gross details only I care about&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4044374934526922505-2863471544014386716?l=imaginaryz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://imaginaryz.blogspot.com/feeds/2863471544014386716/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4044374934526922505&amp;postID=2863471544014386716&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/2863471544014386716'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/2863471544014386716'/><link rel='alternate' type='text/html' href='http://imaginaryz.blogspot.com/2009/09/dream-blog-fuckin-midna.html' title='Dream Blog - Fuckin&apos; Midna'/><author><name>Imaginary Z</name><uri>http://www.blogger.com/profile/05059116260376007206</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_O5BsOfO48b0/R1n4E03veuI/AAAAAAAAAAc/p0Q4WRLzwj0/S220/GargHead.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4044374934526922505.post-864077738590011180</id><published>2009-09-28T20:24:00.000-05:00</published><updated>2009-09-28T20:25:22.882-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='vore'/><category scheme='http://www.blogger.com/atom/ns#' term='dragon'/><category scheme='http://www.blogger.com/atom/ns#' term='lucid dream'/><category scheme='http://www.blogger.com/atom/ns#' term='dream'/><title type='text'>Dream blog - New Mexico Bones?</title><content type='html'>Odd New Mexico Dream&lt;br /&gt;&lt;br /&gt;WEll, not like my usual ones  that are action oriented with a lot of violence, killing, and superpowerful weaponry. this one had a much stronger emotional feel, touching on some complex areas.&lt;br /&gt;&lt;br /&gt;I don't remember how it really began, but a lot of familiar faces from the Palace showed up, and apparently we were somewhere in New Mexico for a festival of some kind. It seemed to be a wine deal, yet there were plenty of activities for the families to participate in, such as rail-carts, carnival games and the regular fair businesses. The palace guys all split up, and I remember messing around with skee ball and some other generic novelties before we met up for some authentic New Mexico chile in the food court. Times were pretty normal seeming, plenty of razzing and videogame discussions. &lt;br /&gt;What was odd though, was that the camera and point of view would be switching from first to third person frequently, and there were two odd characters dressed in 1800 style pinstripe suits and black tophats, looking exactly like corporate fat villians, complete with monocle, white stache and that smug grimace associated with so much pork. Apparently these two kept having heated discussions on some topic, but only appeared in the background as whoever was filming was pretending to be a art student and making really nice framed shots of multiple things at once for a good composition in film.&lt;br /&gt;Anyways, eventually we all got up to this little stadium deal for the rail karts, which was a short series of solid steel tubing and carts that sat on them, just like any old toy rail cars you have seen; Except these were ridable, and people were taking races on them (4 at once could compete) but generally the lightest person would win.&lt;br /&gt;So, after watching them talk about this for a while, I went on the kart thing and so did amanda, we raced, but the jerk giving us the start cue made me lose a lot of time by declaring start before I was even in the cart. But I caught up, popping wheelies on the rails to gain speed coming down hills. But I slowed and let her win; Was pretty fun to have a lot of people cheering for a rigged event. &lt;br /&gt;The camera was also noticing the two tophatters in the front row, constantly speaking to eachother about something that was getting noticeably more grim, people overhearing their conversation looking worried and confused at the pair. Cue montage; And as the camera goes to listen to their conversation and I was dismounting the kart, we see a zoom out of New Mexico and a small story unfolds.&lt;br /&gt;Apparently, there were gold mines in new mexico at some point; And the man on the left (Chesterfield? I can;t remember his name) had been a descendant of the family that founded one of the mines; Now the mines lay in secrecy so that the US government could not track the gold incoming and would basically be a black market deal; The business was run successfully up until Chesters era; His father had always explained that one of the mines was never to be investigated or opened; and declared that any man found entering or exploring the area would be killed on sight. But he explained that he and a buddy snuck up there, assuming that it was to hide the largest gold deposit; And they snuck up there near dusk, and upon entering this small hole in the ground, they saw a extremely heavily boarded and partially caved in mine with no markings at all, and a large supposedly tool shed on the right, the roof was covered in dirt so as to be invisible to aerial spies. Though, the damn fools decided to open the shed in hopes of discovering more about the hidden gold stash. &lt;br /&gt;Well, far be it from my dreams to exclude the paranormal, but inside was a fully assembled dragon skeleton. As stupid and generic as that sounds, it wasn't the fact that a perfectly assembled set of bleached bones was there, or that it looked very menacing, or even that it was a generically creepy setting; There was a completely different feeling, similar to the kind that you get when you know someone is watching you; When you feel a spiderweb drape across your neck even though you weren't moving; And especially that horrible sensation you immediately get when you know something is very very wrong and your life is in grave danger; both boys were not scared; This wasn't anything to be afraid of, yet they instantly whitened from fear. The camera did a nice pano-zoom behind them, and this eerie noise began to creep in as the two freaked out and slammed the shed shut, forgetting to place the lock back on the doors. The noise sounded like the whispers and moans of a thousand dying people, including children.&lt;br /&gt;Snap back to present day times, the two continuing their conversation. However, as I was chatting it up and helping someone's kid get on the go-kart, you could overhear Chester say something to the effect of ìand I'd never seen so much gold in my life!î The other man nods, but immediately everyone in the crowd got that feeling again, looking up and around wondering what was happening and why everyone suddenly got chills.&lt;br /&gt;Without any warning, this deep growly voice emanates from the ground as a large skeleton dragon claw emerges, and pulls up (you obviously guessed it) that same dragon skeleton; with a few aesthetic differences. Mainly, instead of bleached white bones, they were slightly yellow, some with reddish strips in them as if the creature was rebuilding it's body piece by pieces. If you are familiar with the concept of ìlichî think that. It  screamed at the men, lifting and staring down the two yelling multiple things in multiple voices, something no living creature can do; ìThat is MY GOLDî ìYou traitors killed your father!î ìlying sleaze bags!î and other random pitched sounds, but the primary voice was well understood. The men got up and both pulled regular saturday specials and fired round after round in to the skull; to no effect.&lt;br /&gt;I, meanwhile, was rapidly moving to scoot the kids away from the rails, but they kept screaming like everyone else. I managed to shuffle them to safety as everyone else seemed to run away. I looked at this monster and arrogantly figured I could take this; Wouldn't be the first dragon skeleton I killed. Well, ìkilledî meaning broken. Just before the beast was about to rend the two to ribbons via claw swipe, I grabbed a rock and baseball bat and hit the rock into it to get it's attention.&lt;br /&gt;Whooops.&lt;br /&gt;It turned to glare on me, full force of it's psychological pressure bearing down on me; But luckily, since I had meet the real ìsatanî face to face before, this was peanuts. I stood there and yelled some generics at it to make myself feel better. ìLeave us alone! Go away!î I felt pretty good about the situation, I had plenty of space to run around in, and a weapon, and this thing was made of brittle bones. If I could get a strike in I'd be okay.&lt;br /&gt;But, the creature was a tad more powerful than your average physical entity; I guess the fact it was a living skeleton should have queued me in on that. IT looked at me, then looked at it's target getting away, then smiled, looking at me again and began to try and crush my spirit. ìYou would lose your own life to save such evil men? You truly are a fool...î It leaned down, and reached out for me. So I bashed one of it's complex wrist bones with the bat, jumping out of the way. It reacted like I had hurt it's wrist, and looked at me again as I retorted. ìIt doesn't matter who, as long as they're people I'll do my best!î &lt;br /&gt;the dragon looked at me with a quizzical, yet mocking glance, smirking as it leaned down and folded it's arms, still mostly in the ground at this point; Stared directly at me, hollow eye sockets suddenly aglow with a dim orangy red light. ìDo your worst.î&lt;br /&gt;I Ran in, and bashed it's skull as hard as I could. The shock rang through my wrist like hitting a concrete pillar, and I knew I was good as dead. The thing didn't even move, no flinch, no crack... and from personal experiments, I know that that hit is good enough to show damage on any material I had ever encountered. But this didn't show any at all... nothing moved. I backed up, and the dragon began pulling itself out of the ground slowly, showing that it was a complete skeleton. I lost it at this point, and began rapidly hitting it's head over and over, backing up, trying to do something to stop it; but it kept it's skull low, and continued glaring at me as I began to run out of ground, it's newly extracted tail whipping about like Ridley's, smashing up the bleachers and rail karts; which had surprisingly been untouched the whole time; I guess whoever made the movie set wasn't sure how long these scenes would take.&lt;br /&gt;I didn't drop the bat, but the dragon finally stood on all fours and shook some dirt off, it had some pieces of flesh clinging to it's thighs and waist, but not much. Oddly, the flesh was complete, not rotting or in disrepair at all, as if it was a complete being that was simply ìnot all hereî. It looked at me with a neutral expression, declaring ìI want your spiritî before snatching a claw at me, which I expertly dodged via a low roll; though, I guess it had other powers because it's other hand came out of the ground and got me.&lt;br /&gt;After being yanked under the ground and back to the surface, which hurt like hell, getting indian burns on your neck, legs, and scalp; it held me in front of it's face, I struggled to get out of it;s grip, but it held on correctly; Just enough to barely suffocate me, not enough to kill me. I wasn't sure at this point what it was trying to do, but I had a strange feeling it wasn't intending to flay me quite yet; Why I wasn't sure, I tried to hurt it, but with zero success. And those bastards that caused this ran away, the chickenshits. I could see police officers running out with shotguns to start blasting this thing, but I doubt they understood what the people were screaming about.&lt;br /&gt;Anyways, without any real warning, the thing opened it's jaws and lowered me legs first into nothing; I mean, it's a goddamn skull, we've all seen the classic ìskeleton drinks wineî gag right? Well, turns out something like this isn't exactly the same, and to my own horror, it had a complete body internally, I could see it but only from certain angles, as if it's outwardly transparent body had disguised it's organs and real muscular tissue. &lt;br /&gt;&lt;br /&gt;This part gets a little... squishy, so if you don't want to know, don't continue.&lt;br /&gt;&lt;br /&gt;I'm not one to be unfamiliar with dragon gullets; and being swallowed alive and whole was at least thankful, minus the fact that in reality this would be one of the most horrible deaths conceivable; Asphyxiation with an acid bath + being rubbed with grinding stones. Sounds great, right? Fuck people who enjoy that. I hate em. But, lucky for me, as I tried my damndest to escape, but with obviously no success, everything kind of faded out, as if some sort of static field was creeping up my body, eliminating random pieces of existence one at a time. Luckily no pain was perceived, but being dissolved like that instantaneously is rather frightening. And not fun at all. &lt;br /&gt;&lt;br /&gt;Well, maybe this part was not squishy. That's ìVore Liteî for ya.&lt;br /&gt;&lt;br /&gt;The camera at this point looked as the police began to shoot at the skeleton, doing nothing of course; And the monster obliged them by spitting out my clothes onto the bleachers, which contained my ID and other information they could use to confirm who was lost. The monster then sank into the dirt again, slithering back to where it came, leaving the crowd with a odd event to sort out.&lt;br /&gt;Fast forward to some time later, apparently my funeral was had at the edge of some lake somewhere, there were a lot of people cause my family loves to use family events as excuses to hang out; More power to em.&lt;br /&gt;But, after doing a generic sad walk showing my folks and sister discussing my death, the two men with hats approached them and had a conversation. Skip forward to a large laboratory, in Area 51 style where some scientists were trying to summon that demon; Which is stupid, why would you need to summon it if you knew where it was? Obviously it wasn't going to rest until it's gold hoard was complete again. Jeese, what a stupid cast. Either way, I wasn't dead, I guess the creature could see through people just as good as it could totally destroy people. It's a little hard to explain, but it ìsharedî it's existence with me, basically absorbing the essence of what I was including my physical state and other attributes; Much like Raesir can do, only not as good. So, it and I had a lot of talks, and I grew to respect this demon; It had a lot of personality and stories to share; It led quite a sad life, something like Snake from MGS. &lt;br /&gt;Anyways, we kinda ghosted up to the lab to watch and make fun of these losers trying to understand something they can't, simply because they didn't have enough materials to make a judgment call on what to do. Science always works because of the repeatability and applicability of tests; That's why you can trust it; You can prove a lot about gravity anywhere on the earth, just as you can basic newtonian physics. The more we know the more we are allowed to construct new hypothesis and test them. But anyways, being a part of another organism is kinda like being a satellite for a spaceship in a video game; You don't really get to leave ever, but you do get to hover around your owner. It also turned out that every single person that this dragon had eaten during it's lifetime was inside it, so there was a plentiful hoard of people there, that spoke some language I couldn't understand well at all, but eventually could figure out. Kinda 13th Warrior-ish.&lt;br /&gt;So, we watched  them try and built a primitive particle accelerator in order to create a channel for the thing to appear in. I suggested to the dragon that we should make it electrocute that fat guy, but he declined. He would get his dues, that tophat motherfucker. But it did let me go over and whisper at my folks this was bullshit and they should leave asap. Maybe Kelly is right, and ghost powers are awesome...&lt;br /&gt;&lt;br /&gt;Alarm goes off. Groggily wake up, glad to be alive again.&lt;br /&gt;&lt;br /&gt;Of curious note was the overlay of the map of new mexico; I need to draw it and figure out where it was located; If it does exist it would be a interesting trip to go there, although I must say that there are some seriously scary things out there in this world that do require lots of explaining. Dragon skeleton was really cool though.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4044374934526922505-864077738590011180?l=imaginaryz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://imaginaryz.blogspot.com/feeds/864077738590011180/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4044374934526922505&amp;postID=864077738590011180&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/864077738590011180'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/864077738590011180'/><link rel='alternate' type='text/html' href='http://imaginaryz.blogspot.com/2009/09/dream-blog-new-mexico-bones.html' title='Dream blog - New Mexico Bones?'/><author><name>Imaginary Z</name><uri>http://www.blogger.com/profile/05059116260376007206</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_O5BsOfO48b0/R1n4E03veuI/AAAAAAAAAAc/p0Q4WRLzwj0/S220/GargHead.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4044374934526922505.post-7374315296704372580</id><published>2009-09-20T11:59:00.004-05:00</published><updated>2009-09-20T12:18:35.973-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='beer'/><category scheme='http://www.blogger.com/atom/ns#' term='brewing'/><title type='text'>FAILURE ANALYSIS REPORT</title><content type='html'>EVENT:&lt;br /&gt;&lt;br /&gt;On Saturday, September 19th, 2009&lt;br /&gt;Multiple confirmed reports of flat and unappetizing beer piled in. Customers reported watery and flat tasting beer, as well as bottles that did not foam or pop when opened.&lt;br /&gt;&lt;br /&gt;ANALYSIS:&lt;br /&gt;&lt;br /&gt;On acquisition of the available samples, analysis confirmed that due to a manufacturing defect, the majority of the batch #3 was lost due to a sealing leak in the rubber o-ring of the bottle caps, similar to the challenger shuttle disaster.&lt;br /&gt;&lt;br /&gt;In depth analysis shows that no step in the process was misaligned; All employees were intoxicated as preferred, and every procedure to the letter was followed. No single person or human error is at fault. However, the materials provided by a separate manufacturing firm were the cause, as the bottle caps provided were not compatible with the bottles, as was stated. This error could have been detected with a simple radius and sealing mechanism test; And this procedure has now been implemented into the brewing process to prevent further issues.&lt;br /&gt;&lt;br /&gt;Exhibit #1:&lt;br /&gt;&lt;br /&gt;The bottle on the right is correct; The bottle on the left is a defect.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_O5BsOfO48b0/SrZid5372FI/AAAAAAAAAHE/f1oIP4ZOHEs/s1600-h/Picture+1027.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://3.bp.blogspot.com/_O5BsOfO48b0/SrZid5372FI/AAAAAAAAAHE/f1oIP4ZOHEs/s400/Picture+1027.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5383598670459164754" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;As you can see, the evident leakage of gas has caused a net change in volume. This is directly indicative of a leak in the container. Also, the sediment ring proves that the fluid level has decreased over time. The cap is slightly ajar as well.&lt;br /&gt;&lt;br /&gt;Exhibit #2:&lt;br /&gt;&lt;br /&gt;The cap on the top with the synthetic white seal is the correct cap; The cap on the bottom is the defect.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_O5BsOfO48b0/SrZhBED2gcI/AAAAAAAAAG8/7g8lBN-bR1s/s1600-h/Picture+1026.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 300px; height: 400px;" src="http://3.bp.blogspot.com/_O5BsOfO48b0/SrZhBED2gcI/AAAAAAAAAG8/7g8lBN-bR1s/s400/Picture+1026.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5383597075465667010" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Examination of the caps shows the first used caps, the superior, synthetic plastic white sealing ring correctly fits the mouth of the bottle we are using. The inferior, waxy gum cap below does not sufficiently seal the bottle, resulting in predictable cap popping and leaking. Both caps are identical in dimension, weight, size, save for the sealing gasket.&lt;br /&gt;&lt;br /&gt;SOLUTION:&lt;br /&gt;&lt;br /&gt;Beer brewing process now includes examination of bottle caps to inspect for matching radii and proper sealing rings.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I, Imaginary Z, as the owner of this brewing establishment owe a large and deeply felt public apology. Our customers should never have to face this kind of tragedy, as it not only leaves a bad taste in our mouths, but hurts all involved. You trust us to deliver a solid, consistent and refreshing product, and we have, through sheer accident, failed you. As our company motto stresses quality and consistency of delivered products, we have already corrected this error to prevent any future incidents. If you are a victim of this tragedy, please, visit or write and we will do all we can to make it right to you.&lt;br /&gt;&lt;br /&gt;Sincerely,&lt;br /&gt;&lt;br /&gt;Imaginary Zephran&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4044374934526922505-7374315296704372580?l=imaginaryz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://imaginaryz.blogspot.com/feeds/7374315296704372580/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4044374934526922505&amp;postID=7374315296704372580&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/7374315296704372580'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/7374315296704372580'/><link rel='alternate' type='text/html' href='http://imaginaryz.blogspot.com/2009/09/failure-analysis-report.html' title='FAILURE ANALYSIS REPORT'/><author><name>Imaginary Z</name><uri>http://www.blogger.com/profile/05059116260376007206</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_O5BsOfO48b0/R1n4E03veuI/AAAAAAAAAAc/p0Q4WRLzwj0/S220/GargHead.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_O5BsOfO48b0/SrZid5372FI/AAAAAAAAAHE/f1oIP4ZOHEs/s72-c/Picture+1027.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4044374934526922505.post-2958267617794487311</id><published>2009-08-16T20:39:00.006-05:00</published><updated>2009-08-16T21:31:17.784-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='wii'/><category scheme='http://www.blogger.com/atom/ns#' term='dragon'/><category scheme='http://www.blogger.com/atom/ns#' term='godzilla'/><category scheme='http://www.blogger.com/atom/ns#' term='hacking'/><category scheme='http://www.blogger.com/atom/ns#' term='blender'/><title type='text'>Pics, as stated</title><content type='html'>One, we have the lovely 'Ryuou' / 'Valgirt' from Dragon Quest Swords (11k poly, 272 bones):&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_O5BsOfO48b0/Soi1MBITiwI/AAAAAAAAAGk/OUXNTjPVQfc/s1600-h/FullyWorkingValgirt.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 220px;" src="http://2.bp.blogspot.com/_O5BsOfO48b0/Soi1MBITiwI/AAAAAAAAAGk/OUXNTjPVQfc/s400/FullyWorkingValgirt.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5370741773705644802" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Two, we have the awesome robotic 'Kiryu' / 'Mechagodzilla' from Godzilla: Unleashed (6k poly, 69 bones):&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_O5BsOfO48b0/Soi1cfKpROI/AAAAAAAAAGs/iTlj7ixdGqE/s1600-h/KiryuWorkingExample.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 220px;" src="http://1.bp.blogspot.com/_O5BsOfO48b0/Soi1cfKpROI/AAAAAAAAAGs/iTlj7ixdGqE/s400/KiryuWorkingExample.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5370742056646427874" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;These pic's don't show much except that the importing is pretty near flawless into blender, including weights and other nifty things.&lt;br /&gt;&lt;br /&gt;Side note, I'm using the GLSL display option in blender, and have a script that converts I8A8 normal maps into RGB = XYZ normal maps, so that blender can use them in the shaders it has. Also, the light setup is a new one I'm experimenting with, that has two hemispherical lights always 180 degrees apart, but only one is applying specular components. It is similar to a ambient light, but seems to be a little nicer. Once I finish my CIE Lighting model shader, I'll try making that mess happen.&lt;br /&gt;&lt;br /&gt;And, of course, both of these models are copyrighted to their respective owners. Go buy the damn game(&lt;a href="http://www.amazon.com/Dragon-Quest-Swords-Mirrors-Nintendo-Wii/dp/B0010YOQIC"&gt;1&lt;/a&gt;)(&lt;a href="http://www.amazon.com/Godzilla-Unleashed-Nintendo-Wii/dp/B000R1A0L6"&gt;2&lt;/a&gt;) if you want them yourself!&lt;br /&gt;&lt;br /&gt;-Z&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4044374934526922505-2958267617794487311?l=imaginaryz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://imaginaryz.blogspot.com/feeds/2958267617794487311/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4044374934526922505&amp;postID=2958267617794487311&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/2958267617794487311'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/2958267617794487311'/><link rel='alternate' type='text/html' href='http://imaginaryz.blogspot.com/2009/08/pics-as-stated.html' title='Pics, as stated'/><author><name>Imaginary Z</name><uri>http://www.blogger.com/profile/05059116260376007206</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_O5BsOfO48b0/R1n4E03veuI/AAAAAAAAAAc/p0Q4WRLzwj0/S220/GargHead.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_O5BsOfO48b0/Soi1MBITiwI/AAAAAAAAAGk/OUXNTjPVQfc/s72-c/FullyWorkingValgirt.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4044374934526922505.post-4526902851922100588</id><published>2009-08-15T12:41:00.006-05:00</published><updated>2009-08-16T21:29:27.177-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='wii'/><category scheme='http://www.blogger.com/atom/ns#' term='gamecube'/><category scheme='http://www.blogger.com/atom/ns#' term='code'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='model'/><category scheme='http://www.blogger.com/atom/ns#' term='hacking'/><category scheme='http://www.blogger.com/atom/ns#' term='blender'/><title type='text'>Hacking Success; Dragon Quest Swords broken!</title><content type='html'>Add:&lt;br /&gt;&lt;br /&gt;Godzilla: Unleashed&lt;br /&gt;Rampage: Total Destruction&lt;br /&gt;Dragon Quest Swords&lt;br /&gt;Monster Hunter G&lt;br /&gt;Monster Hunter Tri&lt;br /&gt;Super Smash Bros. Brawl&lt;br /&gt;Carnival Games *&lt;br /&gt;Super Mario Galaxy&lt;br /&gt;NiGHTS&lt;br /&gt;ect...&lt;br /&gt;&lt;br /&gt;to the list of games I can extract models from.&lt;br /&gt;&lt;br /&gt;I wish I knew who to give credit to, but all I needed was this little function here to finally break apart the .fpk / Dragon Quest Swords compression format (I was really close too, ironically)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;typedef unsigned int u32;&lt;br /&gt;typedef unsigned short u16;&lt;br /&gt;typedef unsigned char u8;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;int endian=1;&lt;br /&gt;&lt;br /&gt;u32 BE32(u32 data)&lt;br /&gt;{&lt;br /&gt;if(endian)&lt;br /&gt;return ( (data&lt;&lt;24) | ((data&lt;&lt;8)&amp;0x00ff0000) |&lt;br /&gt;((data&gt;&gt;8)&amp;0x0000ff00) | (data&gt;&gt;24) );&lt;br /&gt;else&lt;br /&gt;return data;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int blen;&lt;br /&gt;int fbuf;&lt;br /&gt;&lt;br /&gt;/* PRS get bit form lsb to msb, FPK get it form msb to lsb */&lt;br /&gt;int get_bits(int n, char *sbuf, int *sptr)&lt;br /&gt;{&lt;br /&gt;int retv;&lt;br /&gt;&lt;br /&gt;retv = 0;&lt;br /&gt;while(n){&lt;br /&gt;retv &lt;&lt;= 1;&lt;br /&gt;if(blen==0){&lt;br /&gt;fbuf = sbuf[*sptr];&lt;br /&gt;//if(*sptr&lt;256)&lt;br /&gt;//{ printf("[%02x] ", fbuf&amp;0xff); fflush(0); }&lt;br /&gt;(*sptr)++;&lt;br /&gt;blen = 8;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;if(fbuf&amp;0x80)&lt;br /&gt;retv |= 1;&lt;br /&gt;&lt;br /&gt;fbuf &lt;&lt;= 1;&lt;br /&gt;blen --;&lt;br /&gt;n --;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;return retv;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int uncomp(char *dbuf, int dlen, char *sbuf, int slen)&lt;br /&gt;{&lt;br /&gt;int sptr;&lt;br /&gt;int dptr;&lt;br /&gt;int i, flag, len, pos;&lt;br /&gt;&lt;br /&gt;blen = 0;&lt;br /&gt;&lt;br /&gt;sptr = 0;&lt;br /&gt;dptr = 0;&lt;br /&gt;while(sptr &lt; slen){&lt;br /&gt;flag = get_bits(1, sbuf, &amp;sptr);&lt;br /&gt;if(flag==1){&lt;br /&gt;//if(sptr&lt;256)&lt;br /&gt;//{ printf("%02x ", (u8)sbuf[sptr]); fflush(0); }&lt;br /&gt;if(dptr &lt; dlen)&lt;br /&gt;dbuf[dptr++] = sbuf[sptr++];&lt;br /&gt;}else{&lt;br /&gt;flag = get_bits(1, sbuf, &amp;sptr);&lt;br /&gt;if(flag==0){&lt;br /&gt;len = get_bits(2, sbuf, &amp;sptr)+2;&lt;br /&gt;pos = sbuf[sptr++]|0xffffff00;&lt;br /&gt;}else{&lt;br /&gt;pos = (sbuf[sptr++]&lt;&lt;8)|0xffff0000;&lt;br /&gt;pos |= sbuf[sptr++]&amp;0xff;&lt;br /&gt;len = pos&amp;0x07;&lt;br /&gt;pos &gt;&gt;= 3;&lt;br /&gt;if(len==0){&lt;br /&gt;len = (sbuf[sptr++]&amp;0xff)+1;&lt;br /&gt;}else{&lt;br /&gt;len += 2;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;//if(sptr &lt; 256)&lt;br /&gt;//{ printf("&lt; %08x(%08x): %08x %d&gt; \n", dptr, dlen, pos, len); fflush(0); }&lt;br /&gt;pos += dptr;&lt;br /&gt;for(i=0; i&lt; len; i++){&lt;br /&gt;if(dptr &lt; dlen)&lt;br /&gt;dbuf[dptr++] = dbuf[pos++];&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;return dptr;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Thanks to that mess, I could use my own BRRESToOBM and the Pipeworks1.4ToOBM converters to completely extract the models and import them into blender. &lt;br /&gt;&lt;br /&gt;Why do this, you ask?&lt;br /&gt;&lt;br /&gt;Simple! Since NOT A SINGLE DAMN PERSON here is competent enough to help me, my only method of QA/QOS/QMS/verification is checking my work against commercial products. It's a very useful method as you often get to see techniques for animation, texturing and shading that are well known to industry but not well documented, or just plain hard to find.&lt;br /&gt;&lt;br /&gt;Some of the cool things I've learned:&lt;br /&gt;&lt;br /&gt;*Use additional bones inside of the arm joints on your characters; This allows you to retwist the arm visually while still keeping the IK chain unbroken. This is a classic character animation technique that I never had seen in practice.&lt;br /&gt;&lt;br /&gt;*Use lots of matrices and bleed the weights out as much as possible, trying not to exceed 4 weights per vertex; Don't just use 0.5/0.5 blending factors (Valgirt has 272 bones...)&lt;br /&gt;&lt;br /&gt;*If you are applying a bump/normal map to a character, use the I8A8 texture format and simply calculate the z component in the shader; This costs no additional instructions AND guarantees a normalized z component which you would have to do anyways.&lt;br /&gt;&lt;br /&gt;*Use well painted textures, and don;t be afraid to use non-contiguous models (fins, talons, tongues, even neck/finger joints do not always have to be connected to the base mesh!&lt;br /&gt;&lt;br /&gt;*Make sure you add in additional transform bones to characters, such as a Root Node and X/Y rotation nodes.&lt;br /&gt;&lt;br /&gt;*for mesh modeling, targeting 3k verticies isn't really an issue.&lt;br /&gt;&lt;br /&gt;*Always sort your meshes by: Material, Matrix Deformation Pool, Index array type.&lt;br /&gt;&lt;br /&gt;*Always convert your final mesh pools into triangle strips if you can; Avoid quads and triangles. If you must use triangles, sort them in a indexed triangle list so that each next triangle shares adjacent verticies. Note that on file loading, you can always convert strips back to triangles; but not the other way around.&lt;br /&gt;&lt;br /&gt;*Matrix deformation systems allow you to do things you could never do with bone animation systems; Since you just get a 3x4 float matrix per 'bone', you can apply translation, rotation, scale, and shear transformations. Since the hardware is unaffected by the values you put in those matrices (same number of ops) you're allowed to really have fun animating and be guaranteed consistent results anywhere.&lt;br /&gt;&lt;br /&gt;*Mesh keyframes are A-OK and should be combined into your matrix mesh; for example facial poses and stuff. Simply apply those before running your mesh through the shader; You can get very awesome character animations this way.&lt;br /&gt;&lt;br /&gt;*Try and avoid making your matricies match a 'skeleton' of you character; This often results in hard mechanical animation that looks not fun. It also makes your artists have to work harder, because a 'bone' does not behave like a matrix. Usually, with matrix deformations, you want the matrix to be at the 'ring center' of the mesh data, so that scaling and transforms will behave as you expect. Interestingly, since matrices have no constraints, you can always make this look like the hard mechanical, but you can't do that the other way around.&lt;br /&gt;&lt;br /&gt;*Add additional target matricies; It only costs a small amount of CPU and gives your models flexibility for grapple animations, picking up objects, and easier cinematic animations&lt;br /&gt;&lt;br /&gt;*I've seen 11,000 vertex models fully shaded on the Wii. No kidding. With 200 + bones. Think about that for a second. Think about how much more powerful your PC is than that.&lt;br /&gt;&lt;br /&gt;*Most importantly, animate/design for fun. Don't make things realistic; It's a waste of your time because commercial studios can always do that better than you can. And who wants to play a realistic game anyways?&lt;br /&gt;&lt;br /&gt;I'll post pics later, today I have more beer to acquire!&lt;br /&gt;&lt;br /&gt;-Z&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4044374934526922505-4526902851922100588?l=imaginaryz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://imaginaryz.blogspot.com/feeds/4526902851922100588/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4044374934526922505&amp;postID=4526902851922100588&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/4526902851922100588'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/4526902851922100588'/><link rel='alternate' type='text/html' href='http://imaginaryz.blogspot.com/2009/08/hacking-success-dragon-quest-swords.html' title='Hacking Success; Dragon Quest Swords broken!'/><author><name>Imaginary Z</name><uri>http://www.blogger.com/profile/05059116260376007206</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_O5BsOfO48b0/R1n4E03veuI/AAAAAAAAAAc/p0Q4WRLzwj0/S220/GargHead.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4044374934526922505.post-2252457089063563142</id><published>2009-07-18T15:31:00.004-05:00</published><updated>2009-08-16T21:28:41.508-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gamecube'/><category scheme='http://www.blogger.com/atom/ns#' term='furry'/><category scheme='http://www.blogger.com/atom/ns#' term='hacking'/><category scheme='http://www.blogger.com/atom/ns#' term='blender'/><title type='text'>ZLB is zlib from Starfox Adventures</title><content type='html'>As a side note;&lt;br /&gt;&lt;br /&gt;It turns out a lot of Nintendo titles use zlib compression streams for their data formats.&lt;br /&gt;&lt;br /&gt;Most importantly, the infamous 'ZLB' format within the Gamecube's "Starfox Adventures" is nothing more than a normal zlib stream. Go download the zlib source and compile your own test to prove this.&lt;br /&gt;&lt;br /&gt;If you see zlib compressed data, you generally see something like this:&lt;br /&gt;&lt;br /&gt;78 9C - Wii games (sometimes)&lt;br /&gt;58 85 - Starfox&lt;br /&gt;&lt;br /&gt;Followed by apparently meaningless bytes. If you read how zlib works, you'll learn more about how that compression format really works, and as always, UTSL (Use The Source Luke)&lt;br /&gt;&lt;br /&gt;I still have not cracked the Dragon Quest / Monster Hunter compression format. That one will be tackled next, it seems easier now that I have a decompressed block of data to compare &amp; reverse engineer.&lt;br /&gt;&lt;br /&gt;Amazing what you can do with a little perseverance and a lot of intelligence, eh?&lt;br /&gt;&lt;br /&gt;Next up is trying to get some locals here to help me make XNA fun stuff. Just for kicks, since there aren't many people around here competent enough to want to make games for fun anymore.&lt;br /&gt;&lt;br /&gt;No surprise. Some people actually value social time over working, and some people 'have a life' as they might say.&lt;br /&gt;&lt;br /&gt;Peace!&lt;br /&gt;&lt;br /&gt;-Z&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4044374934526922505-2252457089063563142?l=imaginaryz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://imaginaryz.blogspot.com/feeds/2252457089063563142/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4044374934526922505&amp;postID=2252457089063563142&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/2252457089063563142'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/2252457089063563142'/><link rel='alternate' type='text/html' href='http://imaginaryz.blogspot.com/2009/07/zlb-is-zlib-from-starfox-adventures.html' title='ZLB is zlib from Starfox Adventures'/><author><name>Imaginary Z</name><uri>http://www.blogger.com/profile/05059116260376007206</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_O5BsOfO48b0/R1n4E03veuI/AAAAAAAAAAc/p0Q4WRLzwj0/S220/GargHead.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4044374934526922505.post-8965113324569535920</id><published>2009-07-04T16:18:00.003-05:00</published><updated>2009-08-16T21:29:52.209-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='code'/><category scheme='http://www.blogger.com/atom/ns#' term='opengl'/><category scheme='http://www.blogger.com/atom/ns#' term='flash'/><category scheme='http://www.blogger.com/atom/ns#' term='blender'/><title type='text'>Technically Competent Flash Game Engine</title><content type='html'>After playing with flash enough (Flash Professional 8)&lt;br /&gt;I've reached a conclusion about how to build powerful, dynamic flash games.&lt;br /&gt;&lt;br /&gt;I've worked with flash off and on for years, C/C++ and OpenGL are much cooler, but it has become difficult to manage my pipeline without additional tools that do not exist; So I am taking a break from that for a bit.&lt;br /&gt;&lt;br /&gt;In order to properly make a flash game, you must first understand what a 'video game' is and how it works internally; They are full of interesting technical challenges as well as evil hacks; Because a game tends to be a simulator or emulation of some system, that means we'll never be able to truly make exactly what we want, either due to time or power constraints.&lt;br /&gt;&lt;br /&gt;With that in mind, let's build up a 'megaman' example game.&lt;br /&gt;&lt;br /&gt;We know from playing the megaman series on the NES that megaman is a little robot dude that can shoot other robots, some of which can move around and shoot back! And, if he enters a boss room, he can shoot a special enemy that can give him additional weapons!&lt;br /&gt;&lt;br /&gt;Not much else too the game, really! Let's generalize it.&lt;br /&gt;&lt;br /&gt;What kinds of things are there in the game?&lt;br /&gt;-Sprites (2D Pictures)&lt;br /&gt;-Sounds (Sound effects)&lt;br /&gt;-Music (Longer strings of sounds! .nsf or some other mod format)&lt;br /&gt;&lt;br /&gt;Well, that's kind of an aesthetic look. The actual game however, isn't quite as simple, as there are a variety of object types, like each type of enemy, each type of bullet, and so on.&lt;br /&gt;&lt;br /&gt;When we look at a game from the programmers perspective, we can group all the things that work that same, and build a hierarchy:&lt;br /&gt;&lt;br /&gt;Object&lt;br /&gt; -Sprite&lt;br /&gt; -Moving Object&lt;br /&gt;   --Bullet&lt;br /&gt;   --Controlled Moving Object&lt;br /&gt;      ---Enemies&lt;br /&gt;      ---Megaman&lt;br /&gt;&lt;br /&gt;So, for each level down we go, we have to add more special code; There still is no magical way to code each type, that will ultimately have to be done. However, we can reduce the amount of work signifigantly by providing generic utilities for moving and updating those objects; &lt;br /&gt;&lt;br /&gt;For example, we can have "MoveAsPlatformingCharacter" "MoveAsFlyingThing" "MoveAsBullet".&lt;br /&gt;&lt;br /&gt;And, the ironic thing, is the game is still just moving pictures that can add and remove pictures and sometimes play sounds. There isn't anything more to it than that.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;So, stepping back a bit, let's look at what flash can do for us:&lt;br /&gt;&lt;br /&gt;-Automatic Heirarchy&lt;br /&gt;-Display sprites, images, movies...&lt;br /&gt;-AND can move, rotate and scale them!&lt;br /&gt;-AND can colorize, shade, ect...&lt;br /&gt;-AND can dynamically draw shapes!&lt;br /&gt;-Automatic Sound playing&lt;br /&gt;-Streaming music palying&lt;br /&gt;-Input handling&lt;br /&gt;&lt;br /&gt;So flash can do everything we need! But, flash is not assembly code, it is a SCRIPT LANGUAGE. That means that you cannot apply the same logic you use in C to flash; Script languages are not C, and C is not a script language and vice versa.&lt;br /&gt;&lt;br /&gt;So in flash terms, we will have 1 movie clip called 'game' that has everything we need in it, as well as having ALL the functions we will use in it, so that you can do this:&lt;br /&gt;&lt;br /&gt;game.moveObject( obj, 4, 0 ); //Move object obj right by 4 units&lt;br /&gt;&lt;br /&gt;Inside of the game movie clip, we must have all the clips we want to duplicate in real time. Usually this is accomplised by:&lt;br /&gt;&lt;br /&gt;game.dup_character;&lt;br /&gt;game.dup_bullet;&lt;br /&gt;ect...&lt;br /&gt;&lt;br /&gt;Where, inside each of those dup_character, you have a lot of named frames for that specific character type, like "Heatman", "Iceman", "Megaman", and in each of those frames, you put down the instance of the clip you want to animate; you do not do the animations in the duplicate clip, you make a seperate layer;&lt;br /&gt;This way, you can name each clip inside of the duplicate clip the SAME THING, ergo: "mc", so that the game can reference the mc identically for each instance, AND separate scaling and other properties from it.&lt;br /&gt;&lt;br /&gt;[MovieClip: dup_robot]&lt;br /&gt;   [FrameName : "Megaman"]&lt;br /&gt;   mc [Instance of "Megaman" movie clip, which has all his named animations, like "run", "jump", ect...]&lt;br /&gt;   [FrameName : "Heatman"]&lt;br /&gt;   mc [Instance of "Heatman" movie clip, which has all HIS animations ]&lt;br /&gt;&lt;br /&gt;so your 'game' clip now has this:&lt;br /&gt;&lt;br /&gt;[game : Game clip]&lt;br /&gt;   dup_robot [Instance of "dup_robot" movie clip, which has all the possible robot types each in a specially named frame]&lt;br /&gt;   dup_bullet [Instance of "dup_bullet" movie clip, which has all possible bullet types each in a named frame]&lt;br /&gt;   ect...&lt;br /&gt;&lt;br /&gt;Using this method, you can simply duplicate a dup_clip, then set it's frame, then once you do that, you can set the mc inside of it's frame, thus instantly allowing your game to be very flexible to add extra things later!&lt;br /&gt;&lt;br /&gt;So this is all fine and dandy' Now in flash you can duplicate any clip that graphically represents what your game is, but, what about the actual game?&lt;br /&gt;&lt;br /&gt;Here's where it get's difficult; If you trust flash's 1 collision function (hitTest) then you might know that it DOES NOT WORK on and point test that is NOT on the stage (any non-rendered pixel CANNOT be hit-tested against. SO DONT USE IT!)&lt;br /&gt;&lt;br /&gt;That means yes, you have to make up your own collision scheme, and make up your own collision math, and your own physics system for motion.&lt;br /&gt;&lt;br /&gt;Basically, that means that every object should have a .x, .y, .vx, .vy in it, so you can perform basic rectilinear motion. As for updating your objects, so long as you make a working rectilinear motion function, you can add any complex types of motion you want later.&lt;br /&gt;&lt;br /&gt;This will be covered later, but the easiest solution is to add another dup_clip that creates boxes and ramps, which are very basic and mathematically simple collision primitives that you CAN make a game out of quickly.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;But all this high level talk isn't much use; Because when you get started, you'll find you need a couple of basic tools:&lt;br /&gt;&lt;br /&gt;Something to store this data,&lt;br /&gt;A Map (dict for those python kidz)&lt;br /&gt;A SpaceHashing/Broadphase test&lt;br /&gt;&lt;br /&gt;Map is actually simple in flash,&lt;br /&gt;&lt;br /&gt;var mymap = new Object();&lt;br /&gt;mymap[ "any key as a string" ] = data;&lt;br /&gt;&lt;br /&gt;So you can abuse flash's quick Log2(n) internal string search for object properties as a map. It's as fast as it get's folks.&lt;br /&gt;&lt;br /&gt;A Spacehash is up to you, I prefer using a single axis sort and doing a map/array of bins, which have maps of catergories, each which stores an object UID&lt;br /&gt;&lt;br /&gt;Yes, every object you make should have a non-repeating Unique ID. Don;t rely on the movieclip as one, you never know when depth levels can change or clips for that matter. Use a Number and just increment it, or make a map and reuse unused keys.&lt;br /&gt;&lt;br /&gt;Blargh; What a mess. Too much information to disgorge for ya'll.&lt;br /&gt;&lt;br /&gt;I'll post the flash engine later. Then you can just %#@*(&amp; use it!&lt;br /&gt;&lt;br /&gt;Happy fourth!&lt;br /&gt;&lt;br /&gt;-Z&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4044374934526922505-8965113324569535920?l=imaginaryz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://imaginaryz.blogspot.com/feeds/8965113324569535920/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4044374934526922505&amp;postID=8965113324569535920&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/8965113324569535920'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/8965113324569535920'/><link rel='alternate' type='text/html' href='http://imaginaryz.blogspot.com/2009/07/technically-competent-flash-game-engine.html' title='Technically Competent Flash Game Engine'/><author><name>Imaginary Z</name><uri>http://www.blogger.com/profile/05059116260376007206</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_O5BsOfO48b0/R1n4E03veuI/AAAAAAAAAAc/p0Q4WRLzwj0/S220/GargHead.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4044374934526922505.post-1454974371368372950</id><published>2009-06-21T18:04:00.003-05:00</published><updated>2009-06-21T18:10:23.793-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pokemon'/><category scheme='http://www.blogger.com/atom/ns#' term='blender'/><title type='text'>Pokemon Battle Revolution - h4x</title><content type='html'>Interesting theoretical question;&lt;br /&gt;&lt;br /&gt;Let's say you make a video game with monsters such as Lizardon (Charizard for some);&lt;br /&gt;&lt;br /&gt;And you want it to have different textures so you can make different colored versions.&lt;br /&gt;&lt;br /&gt;The logical thing to do is to add the textures as references, or make a named texture set so your model can just quickly request a texture set switch, right?&lt;br /&gt;&lt;br /&gt;Apparently, someone at nintendo didn't get the memo, and instead, they JUST MAKE AN ENTIRE NEW FILE which has the additional textures in it, ignoring the fact that the entire model set is identical and only the textures change...&lt;br /&gt;&lt;br /&gt;For example, &lt;br /&gt;&lt;br /&gt;Mr. Lizardon is ~ 800 kB, compressed.&lt;br /&gt;&lt;br /&gt;When you decompress him, you get:&lt;br /&gt;&lt;br /&gt;lizardon_0 ~ 1024 kB&lt;br /&gt;lizardon_1 ~ 1024kB&lt;br /&gt;&lt;br /&gt;So, the funny part, is the textures take up maybe 200 kB of each file. &lt;br /&gt;If they would have just added the textures in, it would have saved nearly 800 kB, and who knows what that translates to in the compressed format!&lt;br /&gt;&lt;br /&gt;Weird enough. Also, it explains why some of the colorings I had were dead wrong (is it?)&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_O5BsOfO48b0/Sj69d-x8VcI/AAAAAAAAAGc/zRJSEwfhE4E/s1600-h/MultiplePokeColors.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 220px;" src="http://4.bp.blogspot.com/_O5BsOfO48b0/Sj69d-x8VcI/AAAAAAAAAGc/zRJSEwfhE4E/s400/MultiplePokeColors.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5349921730129057218" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Oh well. Once I figure out where it tells me how many vertex arrays / vertex objects there are, I'll have it nearly 100% exported.&lt;br /&gt;&lt;br /&gt;Peace!&lt;br /&gt;&lt;br /&gt;-Z&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4044374934526922505-1454974371368372950?l=imaginaryz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://imaginaryz.blogspot.com/feeds/1454974371368372950/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4044374934526922505&amp;postID=1454974371368372950&amp;isPopup=true' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/1454974371368372950'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/1454974371368372950'/><link rel='alternate' type='text/html' href='http://imaginaryz.blogspot.com/2009/06/pokemon-battle-revolution-h4x_21.html' title='Pokemon Battle Revolution - h4x'/><author><name>Imaginary Z</name><uri>http://www.blogger.com/profile/05059116260376007206</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_O5BsOfO48b0/R1n4E03veuI/AAAAAAAAAAc/p0Q4WRLzwj0/S220/GargHead.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_O5BsOfO48b0/Sj69d-x8VcI/AAAAAAAAAGc/zRJSEwfhE4E/s72-c/MultiplePokeColors.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4044374934526922505.post-4560554953302920454</id><published>2009-06-20T15:37:00.004-05:00</published><updated>2009-06-20T15:45:04.423-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pokemon'/><category scheme='http://www.blogger.com/atom/ns#' term='blender'/><title type='text'>Pokemon Battle Revolution - h4x</title><content type='html'>The first thing you probably said was "Pokemon!?? @#$%%(&amp;!?" with more expletives.&lt;br /&gt;&lt;br /&gt;On a side note; It was useful to decode the LZSS varient used in these games; It offers a serial form of compression that is very good at packed redundant data, and is byte driven instead of bitwise like a huffman. It seems to get pretty decent compression ratios for sparse or repetitive data; and is general &amp; lossless. Also, learning more block compression schemes for pixel data is useful, PVRTC is the only one I care about at the moment, but STC3 and some others are handy for my own projects. Do they have a normal map compression scheme yet? hm.&lt;br /&gt;&lt;br /&gt;On the actual note; I'm not sure if finding out how pokemon are made is useful; But it does show me just how crappy textures can be if you use shaders properly.&lt;br /&gt;&lt;br /&gt;And, why would they use vertex keyframe animation? Makes it really really hard to integrate into any other system; Might explain the lack of Digimon/Monster Rancher type games. Oh well. Only theories.&lt;br /&gt;&lt;br /&gt;Here's some random pokemon in Blender; No credence given since I never played the games:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_O5BsOfO48b0/Sj1J9QaC2FI/AAAAAAAAAGU/YlXYic5ATsI/s1600-h/randompokemon.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 220px;" src="http://3.bp.blogspot.com/_O5BsOfO48b0/Sj1J9QaC2FI/AAAAAAAAAGU/YlXYic5ATsI/s400/randompokemon.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5349513249111070802" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;-Z&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4044374934526922505-4560554953302920454?l=imaginaryz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://imaginaryz.blogspot.com/feeds/4560554953302920454/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4044374934526922505&amp;postID=4560554953302920454&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/4560554953302920454'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/4560554953302920454'/><link rel='alternate' type='text/html' href='http://imaginaryz.blogspot.com/2009/06/pokemon-battle-revolution-h4x.html' title='Pokemon Battle Revolution - h4x'/><author><name>Imaginary Z</name><uri>http://www.blogger.com/profile/05059116260376007206</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_O5BsOfO48b0/R1n4E03veuI/AAAAAAAAAAc/p0Q4WRLzwj0/S220/GargHead.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_O5BsOfO48b0/Sj1J9QaC2FI/AAAAAAAAAGU/YlXYic5ATsI/s72-c/randompokemon.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4044374934526922505.post-3191733046448789399</id><published>2009-06-13T20:23:00.002-05:00</published><updated>2009-06-13T20:42:33.719-05:00</updated><title type='text'>You're fucking right</title><content type='html'>So I have yet another bad day out of my 27,375 available.&lt;br /&gt;&lt;br /&gt;Solution Time.&lt;br /&gt;&lt;br /&gt;1. Create my own 3D animation tool that does what I need it to; &lt;br /&gt;&lt;br /&gt;2. Open it to the community via Sourceforge; &lt;br /&gt;&lt;br /&gt;3. Integrate IGTL::Sys into the mix to improve both components;&lt;br /&gt;&lt;br /&gt;4. Create 1 x demo project to showcase how it works in a pipeline.&lt;br /&gt;&lt;br /&gt;I've named the project; Once I finish the design specifications it's on to coding it.&lt;br /&gt;&lt;br /&gt;Planned:&lt;br /&gt;&lt;br /&gt;*Support for full 3D Joint/Matrix based animation (Hardware level matrix joints, with bone display option for seamless transitions from your old tools)&lt;br /&gt;&lt;br /&gt;*Support for the newly popular UVS animation (Using bones as 2D billboards that have x,y scale and can change uv coordinates per keyframe; Think Odin Sphere)&lt;br /&gt;&lt;br /&gt;*Perfect Data Editor so that all data can be viewed/changed irrespective of present 3D view/mode, as well as locking and visible flags for all pieces of data.&lt;br /&gt;&lt;br /&gt;*Keyframe based animation on a discrete timeline; So be sure to start with your base FPS set correctly (default is 50)&lt;br /&gt;&lt;br /&gt;*Logical flow to data and animation; No 'global timeline' exists. Everything is animated from 'Strips', and 'Sequences' can be made from and combinations of strips&lt;br /&gt;&lt;br /&gt;*Mode driven editing; Object mode for scene objects, Mesh Keyframe mode for mesh objects; Pose keyframe mode for Joint/UVS objects.&lt;br /&gt;&lt;br /&gt;*Level Of Difficulty integration; Default system is super simple; Advanced users can tweak and expand editors as needed to suit their work mentality&lt;br /&gt;&lt;br /&gt;*Entirely abstracted input with multitouch support; Any Human Input readable by SDL can be used and assigned to hotkeys/event keys. This also means you can record some macros within the program. (Automation tools)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Some obvious problems:&lt;br /&gt;&lt;br /&gt;-Exporting will be limited initially to a text format for inter-compatibility; So long as the text format specification is rigid (like OGRE xml) then anyone can easily write a converter from text -&gt; custom.&lt;br /&gt;&lt;br /&gt;-Speed and User friendliness; If you do not have OpenGL 2.0 or a newer graphics card, the program will initially deny you the ability to use it. This will be fixed later because it is not a priority to write my own TnL for OpenGL 1.1 users. I have done so before, but this is the lowest priority item.&lt;br /&gt;&lt;br /&gt;-Operating Systems; Windows and Mac and Linux don't seem to have multitouch support in the SDL I am using. Too bad; I'll have to store special mouse states for 'virtual mice' aka joysticks.&lt;br /&gt;&lt;br /&gt;-Networking; I want this program to allow collaborative editing; This is always difficult to do and not a priority item because it is outside the scope of the first version, plus this would be mostly beneficial for scene editing and individual animations; Think cooperative moviemaking&lt;br /&gt;&lt;br /&gt;-Rendering; This program is NOT a rendering tool; It can export frames, but onlt as good as your graphics card can make them. I do not want to write a rendering pipeline; But I should include exporters so you can dump a animation to a real rendering program like Blender. However, this is also a low priority item due to it being outside of the scope.&lt;br /&gt;&lt;br /&gt;-Complexity; all good tools have reasons for complexity; Generally it is lazy programmers, but that's because some of the basic problems are very difficult, and they have timelines to meet so they do 'the dumb yet it works' solution. I am doing this for no profit, so there will be slowdowns in the development of this tool.&lt;br /&gt;&lt;br /&gt;-3D Mesh Modeling; I do not want to make a mesh modeler; That is blender's job, not this tool. I want this tool to focus on making game animations with an existing mesh, as well as weighting the verticies of the mesh in the program. This means I will need some mesh tools; and that means the first thing people will demand is a mesh editor/generator. This is a low priority and not the scope of the program, though I may add some cool tools for it in the future; especially because re-meshing is common in real industry; which includes re-uv mapping and adding/removing some verticies. This will have to be supported and is a medium priority item.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I plan to have it work a lot like blender. I hope if I build it, indy developers and hobbyist animators can use it for their purposes and avoid the headaches with classical paid program nightmares.&lt;br /&gt;&lt;br /&gt;This should take me at least 6 months to get a beta out.&lt;br /&gt;&lt;br /&gt;-Z&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4044374934526922505-3191733046448789399?l=imaginaryz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://imaginaryz.blogspot.com/feeds/3191733046448789399/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4044374934526922505&amp;postID=3191733046448789399&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/3191733046448789399'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/3191733046448789399'/><link rel='alternate' type='text/html' href='http://imaginaryz.blogspot.com/2009/06/youre-fucking-right.html' title='You&apos;re fucking right'/><author><name>Imaginary Z</name><uri>http://www.blogger.com/profile/05059116260376007206</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_O5BsOfO48b0/R1n4E03veuI/AAAAAAAAAAc/p0Q4WRLzwj0/S220/GargHead.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4044374934526922505.post-3861213324502886699</id><published>2009-06-10T23:36:00.005-05:00</published><updated>2009-06-11T00:05:38.858-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='blender'/><title type='text'>Extremely Depressed</title><content type='html'>As stated, I am very sad.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_O5BsOfO48b0/SjCP0BYjBiI/AAAAAAAAAGM/JXfZiCxsiHQ/s1600-h/IThinkI%27llShootMyself.gif"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 116px;" src="http://2.bp.blogspot.com/_O5BsOfO48b0/SjCP0BYjBiI/AAAAAAAAAGM/JXfZiCxsiHQ/s400/IThinkI%27llShootMyself.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5345930881576142370" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div align=center&gt;(from &lt;a href="http://garfieldminusgarfield.net/"&gt;http://garfieldminusgarfield.net/&lt;/a&gt;)&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;More than 10 years of programming, multiple jobs, and even an engineering degree later, I'm still not happy.&lt;br /&gt;&lt;br /&gt;Here's why:&lt;br /&gt;&lt;br /&gt;Blender, being the free opensource 3D wondertool had intrigued me from when I first found it. However, after years of playing, making animations, and games using this tool, now that I entered the realm of 'real' game development, blender is severely lacking in multiple areas.&lt;br /&gt;&lt;br /&gt;1. Armatures&lt;br /&gt;&lt;br /&gt;The concept of a armature is invalid; The 3D graphics hardware you have and have had since 1970's has always been of the 'projection matrix' * 'modelview matrix' =&gt; output raster position. Now, modern 3D hardware has the ability to be programmed, so, people like me can code in fully articulated characters by adding weights per vertex and writing a simple vertex shader that multiplies by each joints matrix.&lt;br /&gt;Blender does not conform to this universal standard; IT instead tries to 'make it easy' by giving you a 'bone', which, here's the serious problem: It has a length. Matrices deform from their center, not an arbitrary point. This makes conversion to my game and from my game to blender impossible, thus, blender cannot be used for the animation pipeline. Any attempt to 'hack' blender into making this work is a waste of time; True, you can constrain your game a lot, but if you had 1/100th the experience I do, you would know better. Now for another point; Even with armatures, blenders animation system is designed for movies; That is, everything works on a global timeline via global IPO keys. No game works like this, so combining run + walk animations becomes very difficult, as well as keeping track of current animation track data. They have botched and fluffed over this for years; No positive results yet.&lt;br /&gt;In conclusion, thanks to a broken bone system and incompatible animation keying system, I now no longer have a animation tool my artists can use for our pipeline.&lt;br /&gt;&lt;br /&gt;2. Space conversions&lt;br /&gt;&lt;br /&gt;Blender doesn't use math centric +x forward, +y left, +z up space consistently. This causes nothing but headaches for everyone. There is no justification for having inconsistent coordinate systems, pick a coordinate system and make your entire program be consistent.&lt;br /&gt;&lt;br /&gt;3. Pipeline&lt;br /&gt;&lt;br /&gt;When I make a model in blender, I use my character sketches and some quick concept coloring. Blender makes mesh modeling quick, which is nice. However, when I finish with my model, I want to take the data out, and put it into my game. There are many options for this, but, I usually have to write my own converter. Given, every single update of blender, guess what? My converter breaks somehow thanks to a undocumented python function or change in the way things work. Usually the breaks are not too large, but this is a lot of my time wasted for something that the program should do automatically; For instance, 'dump ascii' should export a large, concisely documented ascii file of all the data for the current selection, including it's linked data and so forth. If they wrote a game engine in blender, why can;t we dump that data out? And why do I keep having to make more converters to spit out a text file?&lt;br /&gt;&lt;br /&gt;4. Data Model&lt;br /&gt;&lt;br /&gt;Blender uses a older C-Data model. This is a good one to use, however, I would like to have more data model tools; For instance, if everything is reference counted and deleted on zero counts fine; But let me control that and show it to me in the OOPS or a special 'data tree' viewer. As a developer, I need control for that data to better improve the exporting I have to write for this tool. Also, sometimes blender files get junked up with bad chunks from older files. And, more importantly, where is the .blend to ascii converter? That would be very nice to have.&lt;br /&gt;&lt;br /&gt;5. Next Gen Content&lt;br /&gt;&lt;br /&gt;Blender currently is pathetic when it comes to this; Let's say I want to make a MGS4 snake. No problem you say, and model out a nice 3300 poly Pliskin and then build an armature for him. Now, you can bend and animate him with some ease, though, lookie here, his shoulder bends funny! Well, after about an hour of tweaking the armature, you got it to look better, but not commercial quality. Now you have to generate a mesh keyframe and link it to a python controller that listens to the armature. Okay, fine. But, how do you export that data out of the system? And how do you ever preview your animations if keyframes are global application? Hm, looks like you have a severe problem editing keyframes and armature actions. OH NO, you added visemes so snake could talk; Looks like there's no way to make animations except by manually entering times on the timeline; oh, and look, while he's talking the python controlled armature actuator is fuzzing the keyframes... Looks like you just wasted 8 hours fighting a system that wouldn't work anyways.  &lt;br /&gt;Enough bitching about that example; Point is, if you have a animation system, but 1 special component can have 'local' timelines (armature 'actions'), why can't mesh keyframes and other animation systems have 'time strips' that you can make, so that your main animation system can paste strips together? Oh what's that? NLA? only works with armature actions, sorry. Unless you're making a movie with no dynamic content, you're SOL here. And try writing an exporter for that. At least they finally added GLSL to the damn system.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I'm so depressed. What do I do, write my own tool like FrameGL3 (already solved all these problems myself btw; SDS, IK, anims, ect...) or do I just give up? This is a lot of work for anyone to undertake; Only because of the gruntwork required. More importantly, there has to be someone else who has this problem, but where is there solution?&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Also, being unable to crack 'Dragon Quest Swords' funky LZSS type compression really has me down. But not down like &lt;a href="http://www.youtube.com/watch?v=P8T-bxRgv5k&amp;feature=related"&gt;Valgirt Nedlog&lt;/a&gt; has me down; fucker's hard!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Maybe I should give it all up for a while, like, a year or something...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I'm in the wrong fucking state/country/planet...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;-Z&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;As a side note; I've hacked the graphics out of Primal Rage 2; Killer Instinct; Wario World; Super Smash Bros; Turok; and many other games just to learn how they built their data, as my ONLY FORM OF VALIDATION that what I have been doing is correct.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4044374934526922505-3861213324502886699?l=imaginaryz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://imaginaryz.blogspot.com/feeds/3861213324502886699/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4044374934526922505&amp;postID=3861213324502886699&amp;isPopup=true' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/3861213324502886699'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/3861213324502886699'/><link rel='alternate' type='text/html' href='http://imaginaryz.blogspot.com/2009/06/extremely-depressed.html' title='Extremely Depressed'/><author><name>Imaginary Z</name><uri>http://www.blogger.com/profile/05059116260376007206</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_O5BsOfO48b0/R1n4E03veuI/AAAAAAAAAAc/p0Q4WRLzwj0/S220/GargHead.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_O5BsOfO48b0/SjCP0BYjBiI/AAAAAAAAAGM/JXfZiCxsiHQ/s72-c/IThinkI%27llShootMyself.gif' height='72' width='72'/><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4044374934526922505.post-6538610406957096805</id><published>2009-04-28T16:42:00.001-05:00</published><updated>2009-04-28T16:43:24.799-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='vore'/><category scheme='http://www.blogger.com/atom/ns#' term='dragon'/><category scheme='http://www.blogger.com/atom/ns#' term='japan'/><category scheme='http://www.blogger.com/atom/ns#' term='dream'/><title type='text'>Dream; A Better Japan</title><content type='html'>I went to japan with Brien an John.&lt;br /&gt;&lt;br /&gt;But this wasn't old or new japan, this was Eden japan.&lt;br /&gt;&lt;br /&gt;After we got out of our plane, and walked into the airport terminal, it was obvious that Japan was no longer like it's former self; they had mastered use of space and eliminated building ridiculous amounts of structures for ridiculous amounts of people. All of the advertising nonsense had gone away, the airport was very small, because it only needed to have the airstrip large.&lt;br /&gt;So we take a walk instead of taking a taxi or bus, and walk right into the middle of this city, that, unlike current japan, isn't full of skyscrapers and people congestion, but rather a very clear air to the place, no trash anywhere, the density of the population was reduced heavily, there were trees, parks, and lots of green things all over the place.&lt;br /&gt;&lt;br /&gt;Interestingly, we get to walk by this water park thing on the corner, near the ocean. This part of the dream more or less catered to my interests, so skip if you want. There was this large quarter circle wave pool, at least 200 some feet radius, and in the middle it had this pretty awesome water slide, which was naturally decorated like any typical asian dragon should be. The only interesting mechanical aspect was the slide was tethered and stable, so it could actually move around, which changed the slide as you were sliding, kinda a cool design, made it pretty intimidating, though the graphics were cute and funny, so it wasn't too terrifying. The way it moved was unusually organic though, and like all waterslides of this type, you start at the tail and come out the mouth. I asked a local about this craziness, and they pointed to a holo-prompter, which played a little holographic video detailing the history (faked) of the slide itself. Apparently, back a long time ago, there was some great conflict over this portion of the sea, and two warring families were causing so much bloodshed, that it angered one of the great dragons enough to come and destroy the commanding officers (this is accompanied by a nifty animation where the slide morphs into it's real form and devours all the warriors at that point in time, yay.) before settling down into the form you see now. Knowing that transformation ideals weren't uncommon in japan, I dismissed this mess and moved on, so we walked toward the city again.&lt;br /&gt;&lt;br /&gt;On first glance, we get to see that most of the buildings aren't much taller than 14 or so floors, and appear to be made of bricks and glass, adhering to earthen tones and less harsh colors. There were hardly any steel buildings to be found, and every mile there was at least 2 acres devoted to a green park, where most of the people were milling about, talking, or, as the case was, riding the little carnival rides and buying stuff from street vendors. It looked in spirit a lot like the first part of chrono trigger, really. In either case, we were trying to find where Elena was, and we wandered onto the highschool campus, which had some very ominous prison like brick buildings, with darkened glass. School was always in session, and their highschool was not just that, but also a university, implying that education could be learned on a college level if you so desired. The campus had a few buildings too, and spanned a good chunk of space, with plenty of park inbetween it, much like OU's mall areas, but much greener and more well maintained, which is easier for a place that doesn't have the kind of weather we do.&lt;br /&gt;So after talking about the high school, we began to walk toward main street and all the commotion, nothing much fantastic happening yet, there was a giant ferris wheel in the middle of the town and some sort of festival going on, with generic fair foods and booths, people were in general having a great time; so we got some sake and joined up. Although, the japanese people were different this time, they would make eye contact and greet, though I believe this is a function of alcohol rather than culture.&lt;br /&gt;Eventually, after walking around this city for a bit, we found the building we were looking for, and the camera is forced to undergo a fade till we arrive at scott's new lab, which is larger than his current one but still just as messy. We talk to him for a while, and hang out talking about some disease that had occurred, as if there had already been a life cleansing tragedy that occurred naturally, and he remembered he had a time capsule somewhere in the ceiling (raised ceiling) so that the government wouldn't find and destroy it; Apparently the japanese government destroyed their history in order to maintain order or something stupid like that. So we much around trying to find his box, a maintenance guy comes over and asks what we're trying to do, scott makes up an unbelievable lie, the guy doesn't care, and tells us he'll do what he can. About this time the alarm goes off, so that ended that.&lt;br /&gt;&lt;br /&gt;Nothing fantastic happened in this dream, it was pretty tame, not much more than a elated feeling of walking around this happier, more dense world. I think what really struck me was the cleanliness, things weren't like in america where we sacrifice our planet for speed and profit, it was emphasized with nature, temporary materials were all rice paper variants, there was no trash at all anywhere, all of the greenery was well maintained and practical rather than just looking pretty, sporting herbs, air cleaners, fresh smelling flowers and fruit trees. All of this would have failed if the people have been fucking it up, as they usually do, but that didn't happen here. Something had these people trained, or no longer living in fear. I'd like to believe it was that waterslide.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4044374934526922505-6538610406957096805?l=imaginaryz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://imaginaryz.blogspot.com/feeds/6538610406957096805/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4044374934526922505&amp;postID=6538610406957096805&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/6538610406957096805'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/6538610406957096805'/><link rel='alternate' type='text/html' href='http://imaginaryz.blogspot.com/2009/04/dream-better-japan.html' title='Dream; A Better Japan'/><author><name>Imaginary Z</name><uri>http://www.blogger.com/profile/05059116260376007206</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_O5BsOfO48b0/R1n4E03veuI/AAAAAAAAAAc/p0Q4WRLzwj0/S220/GargHead.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4044374934526922505.post-5586690535120922839</id><published>2009-04-24T16:40:00.000-05:00</published><updated>2009-04-28T16:41:52.633-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='vore'/><category scheme='http://www.blogger.com/atom/ns#' term='pokemon'/><category scheme='http://www.blogger.com/atom/ns#' term='movie'/><category scheme='http://www.blogger.com/atom/ns#' term='dream'/><title type='text'>Dream; Stupid pokemon movie</title><content type='html'>'A Pokemon Movie'&lt;br /&gt;&lt;br /&gt;Already this isn't good.&lt;br /&gt;&lt;br /&gt;But anyhow, apparently a grand tournament of pokemon masters was to commence on this island, inviting all of the worlds best and most skilled trainers to compete against eachother for a sort of 'black' prize; This was not a legitimate sponsored tournament, this was a underground one, allowing dirty tricks and darker tactics to be used, pokemon may even be killed for that matter.&lt;br /&gt;So, I was not a trainer at all, however, Kelly was a master-trainer in training, and the rest of the GH crew were either support characters or friends of Kelly for light sparring. Turns out, since I know not a lot about pokemon except their data formats, there was a school for animal training in general, which was somewhat like a night school, since it did not replace primary education, but instead augmented development of this pokemon fad hobby thing. I do remember that Kelly seemed to have the same team from brawl, which doesn't make sense, but oh well. &lt;br /&gt;On the side, Etna, my favorite videogame heroine, was also deciding to enter the contest. However, there was this hilarious Disgaea style cutscene with her arguing with her Prinny's about getting items so she could create the ultimate demon pokemon, and well, she did, but as we all know she's not the type of person to spend the time and effort to properly train an animal, and rather assumes it'll act correctly or train it by force.&lt;br /&gt;So, after some conversations at school, and a few classes, GH team banded and we took a boat out to this island so we could watch the competition. Kelly was too smart to enter this tournament, especially when all bets were off about the safety of your monsters. But it'd be kickass to see some of the toughest pokemon out there battling it out. We arrived, watched a few fights, which involved some weird pokemons I hadn't seen before, then decided to go to the concession stand to get some foodulons.&lt;br /&gt;Well, when we left, it was Etna's turn soon, and she was walking her pokemon on a leash to the side of the arena for waiting, but, well, the food storage was visible to this monster, and it began yanking on it's leash, Etna scolded it, but, well, it's not trained properly, so it yanks on the leash till it breaks (it was comically thin) and starts gobbling all the food. Etna goes over and starts hitting it, then gets a shocked look, says 'Ugh' and leaves promptly. Well, apparently this demon pokemon just starts growing as it continued to eat, and everyone immediately took notice, as it had gotten nearly arena sized in no time at all.&lt;br /&gt;We were all at the snack bar, and we hear the commotion and go to check it out, but not really rush in, more like peeking.&lt;br /&gt;Well, this giant monster thing looked a lot like one of those generic godzilla shapes, but longer arms and more sleek build, kinda brown and tan two-tone type colorings with some black markings here and there. It's eyes were yellow-reddish, but it also had claws on it's hands and feet, and some spines on it's tail. It did look like yet another pokemon, but, well, since it was THIS big, it immediately began eating as many of the entrants and pokemon as possible! Which was essentially fanservice to me, but that's besides the point. The thing runs around, smashes the exit so everyone is trapped, and basically spends the next few minutes making sure it had eaten everyone in glorious cartoon style. Well, the Generic professor oak character was standing there, and tried to run but it got him, cue main-character death scream.&lt;br /&gt;So we were deciding what to do, and some other trainer with the same pokemon as kelly rushes out and declares it can beat this monster, and the movie stops and I mentally said 'Hold it. This arena was supposedly filled with the worlds best pokemon and trainers, this thing wipes em ALL out easily, and some punk kid with the original set characters thinks he can do something? Yeah. whatever.'&lt;br /&gt;So we cut to a interior shot of the professor, who looked like he was floating in some sort of dark amber liquid, trying to hold his breath but fails, and it cuts to a monologue 'huh? Strange, I'm not dead... wait... Neither are any of the others! Oh no...' As it pans out, showing this large dark-colored liquid filled chamber, with a ton of these amber bubbles each containing one of the eaten people/monsters, most of them asleep or knocked out. Apparently, this monster was a generic anime 'container' monster, it's purpose is to contain and restrain, without harming it's victims. These kind of things are everywhere in cartoons.&lt;br /&gt;So, GH team decides to leave. Not our problem. After all, if it was Etna, she'll get her Prinny's to beat the f*** out of it until she get's what she wants.&lt;br /&gt;&lt;br /&gt;The really funny thing about this dream, was the entire thing was drawn animated; It did look exactly like those super shitty pokemon cartoons, and all of us were drawn in that style, which was hilarity. It worked surprisingly well, and honestly, this movie had just about the same quality as the actual pokemon movies, but with much less fanservice to additional fetish groups, instead focusing only on one. Which is no surprise to anyone.&lt;br /&gt;Other curious details, the school for training looked a lot like my high school, the arena was in a mountain, and kept very dark, that pokemon Etna brought was called 'Gizzardon', and all of it's internal scenes were in high detail, but still had animated parts if need be. The in-dream kelly really liked that squirtle though, he even had it trained to do homework and talk some, which was pretty badass. However, the ivysaur just sat next to the window and made noises, and the charizard was just sleeping all the time. Was kinda a funny dorm room shot I guess.&lt;br /&gt;Nothing too crazy actually happened it seems. I'm disappointed Raesir didn't show up, this seems like his kinda event.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4044374934526922505-5586690535120922839?l=imaginaryz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://imaginaryz.blogspot.com/feeds/5586690535120922839/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4044374934526922505&amp;postID=5586690535120922839&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/5586690535120922839'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/5586690535120922839'/><link rel='alternate' type='text/html' href='http://imaginaryz.blogspot.com/2009/04/dream-stupid-pokemon-movie.html' title='Dream; Stupid pokemon movie'/><author><name>Imaginary Z</name><uri>http://www.blogger.com/profile/05059116260376007206</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_O5BsOfO48b0/R1n4E03veuI/AAAAAAAAAAc/p0Q4WRLzwj0/S220/GargHead.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4044374934526922505.post-429515217038113150</id><published>2009-04-22T17:01:00.003-05:00</published><updated>2009-04-22T17:10:33.598-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='wii'/><category scheme='http://www.blogger.com/atom/ns#' term='dragon'/><category scheme='http://www.blogger.com/atom/ns#' term='furry'/><category scheme='http://www.blogger.com/atom/ns#' term='opengl'/><category scheme='http://www.blogger.com/atom/ns#' term='dream'/><category scheme='http://www.blogger.com/atom/ns#' term='brawl'/><category scheme='http://www.blogger.com/atom/ns#' term='blender'/><title type='text'>Brawl models and dream</title><content type='html'>Man, I burned myself out yesterday trying to figure out textures.&lt;br /&gt;&lt;br /&gt;As a result, I haven't slept well since I started this, I keep having crazy dreams, and I was able to remember most of this one:&lt;br /&gt;&lt;br /&gt;Dream was odd. &lt;br /&gt;I remember going through a 1st/3rd person shooter where there were unusual zombies, not like normal zombies but something more similar to crazy possessed demon people. I remember one room I got too where I kept getting killed, it was a large room, with a small cubby on one side of it and had a stairway at the back, but to the side of that stairway was a small windowed room with metal walls, and a sealed metal door where the special weapon I was supposed to get was. The entire look ot the scene was dark and grimy, like RE5, but better looking. The lighting was sometimes dynamic, but the walls dripped with rust and grime, as if there had been blood but it dried. The smell was bad too, though I think was was psychologically imposed via my imagination. So I ran pas this guy in a plaid shirt with a large broken pipe, who was some crazy lumberjack like dude, and past this other kid with the typical NY punk ass look who had a knife, got into the room, grabbed this special weapon, but when I did, those two turned into these much larger bug mutant monsters, walking with reversed legs from their back and having 4 spindly ones in front with gnashing teeth and large red eyes. Not particularly scary or anything, but they were really fast and had a sort of mantis mentality, if they got close to you, their legs snapped out and yanked you into their jaws for a kill bite. Not much you could do there, but this special weapon was a wired plasma arc discharger, think of it like a gun that can shoot chainsaws. It was very effective, but you had only milliseconds to get off two EXACT shots to kill these bugs before you had to exactly run upstairs and barricade the door, which saved, then you turned around and blasted more human zombies and some ceiling bugs.&lt;br /&gt;Of course, sinec it took me enough tries to get past that room (There were lots more before it, somewhat like a Super Half-life or something) the dream took a different turn, and I noticed I was in a restaurant. I ran through hit the first time though, noticing that there were odd pictures on the walls, but after I had ran through it, I found a pool of survivors, who, weirdly enough, were all the buddies I knew from Eka's, even some of them I had never met in real life. That stuck me as odd, and apparently there was some sort of crazy furry convention or something going on and they just happened to congregate there. I talked to them for a moment or two, being slightly blood splattered and worn from intense combat. Two of the wanted to help, but they had no weapons, so I had them go get some while the safe room music queued. I went back to the restaurant and it clicked; Apparently, the wall pictures were of a toon-Kami, which immediately raised my mental threat level to max, at least until I saw Ted sitting at a table with two other people I knew. I went over and sat down, and we had some sort of funny conversation about the restaurant, it kinda looked like a Captain D's which was equally ironic. The information I gathered there wasn't too useful, but it was greatly entertaining.&lt;br /&gt;After a few drinks, I went back to the convention, and it was, of course, empty, they didn't make it. There were much stronger bug monsters, some that could fly, and I said 'aw fuck it' and saved the game and went back to the restaurant to get some food. Needless to say, in that particular establishment that's not exactly how it works, but goddamnit I tried.&lt;br /&gt;&lt;br /&gt;I can't seem to remember too much of it, I've had long strings of dreams lately that involve me missing my good friends a lot, mostly goathouse members and lots and lots of drinking involved. I conclude that I must be severely depressed, and I can't blame me for that.&lt;br /&gt;I guess you can't really be friends until you've seen the fires of hell as a team, eh?&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Update on the format converter; Still trying to sort out textures, but guess what? Blender doesn't like the 394 material MetalGearRex model because it can only handle 16! So f***.&lt;br /&gt;&lt;br /&gt;Here's a stupid screenshot with MetaRidely, King K. Rool, Mario, Luigi, Peach, and Link.&lt;br /&gt;&lt;br /&gt;Sortof.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_O5BsOfO48b0/Se-Ufl8HHiI/AAAAAAAAAGA/eyM1rt2KCE0/s1600-h/NotEverythingWorksYet.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 220px;" src="http://3.bp.blogspot.com/_O5BsOfO48b0/Se-Ufl8HHiI/AAAAAAAAAGA/eyM1rt2KCE0/s400/NotEverythingWorksYet.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5327640154683678242" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;For those of you that care, I'm still getting the hang of the transforms down; They don't seem as bad as figuring out how to find which textures and which blending modes to use. Obviously it's a snap to manually assign textures, but this should do most of the job for us, right? I do seem to have the polygon data down perfectly, I am not trying to get any particular model, just reverse engineering their format so I can improve my own. It's bizzare, there is no good reason I can think of why this file needs to be this complex. You can do the same thing or better with a GRF/BRF setup, or hell, any other normal linear file. Honestly the only complex thing WOULD be the materials, and that's what I'm having trouble with... &lt;br /&gt;&lt;br /&gt;Also as a side note, blender's bone system is SHIT, because you cannot have zero length bones or infinite length bones. Come to think of it, hardware only uses matrices, so what the hell DOES a bone have length for?!?! This is very very stupid, as the convention makes no sense for any real application. Obviously you can display bones as octohedrons in reverse child-&gt;parent mode. This is trivial to do and would eliminate this horrid 'length' idea. Also, why the fuck is bone space so bizzare? What ever happened to consistent in +X forward, +Y left, +Z up? I really miss that idea, since it's correct for the hardware and avoids any confusion if it's all the same.&lt;br /&gt;&lt;br /&gt;I don't think I'll ever stop being amazed that the more you know about something, the more flaws you can find.&lt;br /&gt;&lt;br /&gt;! Oh shit, an icecream truck! GTG save it!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4044374934526922505-429515217038113150?l=imaginaryz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://imaginaryz.blogspot.com/feeds/429515217038113150/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4044374934526922505&amp;postID=429515217038113150&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/429515217038113150'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/429515217038113150'/><link rel='alternate' type='text/html' href='http://imaginaryz.blogspot.com/2009/04/brawl-models-and-dream.html' title='Brawl models and dream'/><author><name>Imaginary Z</name><uri>http://www.blogger.com/profile/05059116260376007206</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_O5BsOfO48b0/R1n4E03veuI/AAAAAAAAAAc/p0Q4WRLzwj0/S220/GargHead.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_O5BsOfO48b0/Se-Ufl8HHiI/AAAAAAAAAGA/eyM1rt2KCE0/s72-c/NotEverythingWorksYet.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4044374934526922505.post-8504852796908727525</id><published>2009-04-19T22:50:00.004-05:00</published><updated>2009-04-19T23:01:36.166-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='wii'/><category scheme='http://www.blogger.com/atom/ns#' term='dragon'/><category scheme='http://www.blogger.com/atom/ns#' term='model'/><category scheme='http://www.blogger.com/atom/ns#' term='opengl'/><category scheme='http://www.blogger.com/atom/ns#' term='ridley'/><category scheme='http://www.blogger.com/atom/ns#' term='brawl'/><category scheme='http://www.blogger.com/atom/ns#' term='blender'/><title type='text'>Super Smash Bros Brawl model format</title><content type='html'>So I have been exploring Brawl.&lt;br /&gt;&lt;br /&gt;I've learned a little more about constructing armatured models, this is primarily useful for my art team in assisting their understanding of how professional projects handle their game media. Using references is extremely informative when you create your own models, as you get to learn from others mistakes more quickly, and see new ways to make special joints and features.&lt;br /&gt;&lt;br /&gt;I'm doing this out of pure academic interest, as I found out there is not much difference between this and the melee formats. I hacked both, but brawl models in general look better.&lt;br /&gt;&lt;br /&gt;So here's the Ridley Trophy in Blender, definitely not something desirable to wake up to:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_O5BsOfO48b0/SevyD9rfbXI/AAAAAAAAAF4/2KrZQvGTzUY/s1600-h/RidleyTrophy.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 220px;" src="http://4.bp.blogspot.com/_O5BsOfO48b0/SevyD9rfbXI/AAAAAAAAAF4/2KrZQvGTzUY/s400/RidleyTrophy.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5326617134206250354" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;And yeah, I still have that awesome little plastic Ridley figurine that Kelly let me have. He's quite happy guarding my desk!&lt;br /&gt;&lt;br /&gt;Peace!&lt;br /&gt;&lt;br /&gt;-Z&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4044374934526922505-8504852796908727525?l=imaginaryz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://imaginaryz.blogspot.com/feeds/8504852796908727525/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4044374934526922505&amp;postID=8504852796908727525&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/8504852796908727525'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/8504852796908727525'/><link rel='alternate' type='text/html' href='http://imaginaryz.blogspot.com/2009/04/super-smash-bros-brawl-model-format.html' title='Super Smash Bros Brawl model format'/><author><name>Imaginary Z</name><uri>http://www.blogger.com/profile/05059116260376007206</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_O5BsOfO48b0/R1n4E03veuI/AAAAAAAAAAc/p0Q4WRLzwj0/S220/GargHead.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_O5BsOfO48b0/SevyD9rfbXI/AAAAAAAAAF4/2KrZQvGTzUY/s72-c/RidleyTrophy.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4044374934526922505.post-5163468653616301528</id><published>2009-04-11T10:24:00.000-05:00</published><updated>2009-04-11T10:25:08.923-05:00</updated><title type='text'>Oklahoma Electronic Game Expo</title><content type='html'>&lt;a href="http://oege.catblog.occc.edu/wordpress/"&gt;&lt;br /&gt;Oklahoma Electronic Game Expo&lt;br /&gt;and Multimedia Conference ~ April 11, 2009&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Interesting.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4044374934526922505-5163468653616301528?l=imaginaryz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://imaginaryz.blogspot.com/feeds/5163468653616301528/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4044374934526922505&amp;postID=5163468653616301528&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/5163468653616301528'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/5163468653616301528'/><link rel='alternate' type='text/html' href='http://imaginaryz.blogspot.com/2009/04/oklahoma-electronic-game-expo.html' title='Oklahoma Electronic Game Expo'/><author><name>Imaginary Z</name><uri>http://www.blogger.com/profile/05059116260376007206</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_O5BsOfO48b0/R1n4E03veuI/AAAAAAAAAAc/p0Q4WRLzwj0/S220/GargHead.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4044374934526922505.post-8043777118090141561</id><published>2009-04-06T18:05:00.002-05:00</published><updated>2009-04-06T18:10:31.354-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lucid dream'/><title type='text'>Lucid Dream</title><content type='html'>Because I was woken at 4 am, I had a terrible nights sleep. I knew I was falling asleep, but I remained conscious into the dream world. What that meant was I had full cognitive control over my actions and parts of the dream, however, here's how it went:&lt;br /&gt;&lt;br /&gt;I wanted to go home. I wanted to see my old house and look up at the stars and pretend this world and it's species weren't fucked. So I did. I was lying down in a sleeping bag, alone in the upstairs room, looking out at the sky. It was too dim, realistically dim so I turned up the brightness to see galaxies. It was very beautiful. However, a small girl appeared beside me, holding her knees with a stuffed animal, looking frightened. I asked her what was wrong, and she told me aliens. That almost got me up, but I stayed dreaming and continued to ask her what they were like. I used generic grey's descriptions, and then asked if they were like the Reconi, but, she got some crayons that were on the floor and drew me a picture of them and told me their name, but since I had to work I forgot the words, It was unusual and I'll remember it later, but it was something with a 'ou' sound and a 'g'. I kept asking her questions, but by doing so my mind destroyed her, and she melted into a skeleton because that's apparently what I would like to do to so many people... Either way, after that I turned off the dream and tried to sleep instead of control the dream, for like 5 minutes before the alarm went off. &lt;br /&gt;&lt;br /&gt;So, I'm not sure what this was about, I usually don't have dreams about non-fuzzy aliens, but whatever these things were they were NOT our friends or allies. Kinda crinkly if I remember right.&lt;br /&gt;&lt;br /&gt;I'll try again later sometime. Peace!&lt;br /&gt;&lt;br /&gt;-Z&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4044374934526922505-8043777118090141561?l=imaginaryz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://imaginaryz.blogspot.com/feeds/8043777118090141561/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4044374934526922505&amp;postID=8043777118090141561&amp;isPopup=true' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/8043777118090141561'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/8043777118090141561'/><link rel='alternate' type='text/html' href='http://imaginaryz.blogspot.com/2009/04/lucid-dream.html' title='Lucid Dream'/><author><name>Imaginary Z</name><uri>http://www.blogger.com/profile/05059116260376007206</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_O5BsOfO48b0/R1n4E03veuI/AAAAAAAAAAc/p0Q4WRLzwj0/S220/GargHead.png'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4044374934526922505.post-815330132529306470</id><published>2009-04-02T16:29:00.007-05:00</published><updated>2009-04-02T16:52:12.897-05:00</updated><title type='text'>Tangent space normal maps</title><content type='html'>Alright, this is some useful stuff. I didn't find very many useful articles online about this, except for Blender.&lt;br /&gt;&lt;br /&gt;The basic idea is, if you want to use bumpmapping/shiny/normal mapping, you can do this either for static objects (objects that NEVER have their mesh change, like trees, terrain, walls...) or dynamic objects (animated characters). For static objects, you can use what is called 'object space normals', aka, a texture with normal data relative to the object baked in. For dynamic objects, you are forced to use 'tangent space normals' where tangent vectors are calculated for each vertex each frame in the shader.&lt;br /&gt;&lt;br /&gt;This works, because just like matrix palette deformations, you multiply a vertex by a matrix to transform it, either locally or globally. In this case, we have each vertex with a vertex normal, and a tangent, which means we know each verticies local space. This allows us to initially calculate better lighting parameters per-vertex using a vertex shader. As you know, Normal cross tangent or binormal will ive you the other missing vector in the 3x3 rotation matrix. &lt;br /&gt;&lt;br /&gt;Now that you have a vertex shader that generates the parameters needed (has to send them via texture coords or other fragment parameters in the shader...) you can write a fragment shader that does your lighting computations, and calculates the per-pixel normal, tangent, and binormal, which then samples the normal map texture for the normal value at that pixel, thus resulting in normal mapped surface.&lt;br /&gt;&lt;br /&gt;although this is trivial to do with shader parameters (add an extra array with tangent vectors) the fragment shader is annoying, because per fragment, you must renormalize the interpolated normal and tangent per vertex before applying the transformation to determine the normal to use for lighting equations.&lt;br /&gt;&lt;br /&gt;All this blah and hooplah I did using fragment and vertex program. It's pretty kickass, and very simple.&lt;br /&gt;&lt;br /&gt;Here is a example showing a generic 'snake' normal map on a realtime deformable tube using hemispherical lighting:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_O5BsOfO48b0/SdUvXxvfRCI/AAAAAAAAAFg/RvcZMcUOarQ/s1600-h/tubeNM.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 225px;" src="http://2.bp.blogspot.com/_O5BsOfO48b0/SdUvXxvfRCI/AAAAAAAAAFg/RvcZMcUOarQ/s400/tubeNM.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5320210620344124450" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;And here is no normal map applied using open GL lighting&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_O5BsOfO48b0/SdUviSgJpBI/AAAAAAAAAFo/pb9a6k3FRQw/s1600-h/tubeNoNM.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 225px;" src="http://2.bp.blogspot.com/_O5BsOfO48b0/SdUviSgJpBI/AAAAAAAAAFo/pb9a6k3FRQw/s400/tubeNoNM.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5320210800936854546" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This is the normal map, generated from Blender via 'Bake Selected to Active' (select all your scales and bumps, then the cylinder object which has the UV map you want to bake to, and done!)&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_O5BsOfO48b0/SdUzdOArfeI/AAAAAAAAAFw/BDWdmdqIS7I/s1600-h/test_tubetex.bmp"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 400px;" src="http://3.bp.blogspot.com/_O5BsOfO48b0/SdUzdOArfeI/AAAAAAAAAFw/BDWdmdqIS7I/s400/test_tubetex.bmp" border="0" alt=""id="BLOGGER_PHOTO_ID_5320215111878278626" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;And here's some nitty gritty low level shader code:&lt;br /&gt;&lt;br /&gt;...vertex shader...&lt;br /&gt;# ...pass normal &amp; binormal to fragment as texture coords in 0 and 1&lt;br /&gt;MOV  oTex0.zw, vNorm.xyxy; #tex0.zy = normal.xy&lt;br /&gt;MOV  oTex1.x, vNorm.zzzz; #tex1.x = normal.z, tex1.yzw = binormal.xyz, &lt;br /&gt;MOV  oTex1.yzw, vBin.xxyz; #&lt;br /&gt;MOV  oTex0.xy, vTex0;&lt;br /&gt;#...&lt;br /&gt;&lt;br /&gt;...fragment shader...&lt;br /&gt;&lt;br /&gt;!!ARBfp1.0&lt;br /&gt;# Setup&lt;br /&gt;ATTRIB fTex0 = fragment.texcoord[0]; #tex and normal&lt;br /&gt;ATTRIB fTex1 = fragment.texcoord[1]; #Normal + Binormal&lt;br /&gt;&lt;br /&gt;PARAM EyeDir = state.matrix.mvp.row[2]; #Get mvp/eye direction&lt;br /&gt;PARAM Light0Dir = state.light[0].position; #state.light[0].spot.direction&lt;br /&gt;PARAM HemiParam = program.local[4];  #{ 0.5, 0.5, 8.0, 0.125 }#Hemi Light Constants (darkness, 1-darkness, hemi_power, hemi_scale)&lt;br /&gt;PARAM FlipValues = program.local[3];  #Direction flipping values&lt;br /&gt;&lt;br /&gt;PARAM ColorAmb = state.material.front.ambient;&lt;br /&gt;PARAM ColorDif = state.material.front.diffuse;&lt;br /&gt;PARAM ColorSpec = state.material.front.specular;&lt;br /&gt;PARAM ColorEmit = state.material.front.emission;&lt;br /&gt;PARAM ColorShininess = state.material.front.shininess;&lt;br /&gt;&lt;br /&gt;PARAM K = {1, 0.5, 0, 2.0};&lt;br /&gt;&lt;br /&gt;TEMP vNorm, vBin, vTang, temp1, temp2, colTex;&lt;br /&gt;&lt;br /&gt;#---Get texture normal (tangent space normal)---&lt;br /&gt;TEX temp1, fTex0, texture[0], 2D; #Sample texture (ext normals)&lt;br /&gt;TEX colTex, fTex0, texture[1], 2D; #Sample texture as color... rgb = xyz, a = ?ColorShininess? would be cool.&lt;br /&gt;&lt;br /&gt;MAD temp1, temp1, K.w, -K.x; #Convert texnormal to normal [-1,1] (works)&lt;br /&gt;&lt;br /&gt;DP3  temp1.w, temp1, temp1; #Normalize texnormal&lt;br /&gt;RSQ  temp1.w, temp1.w;&lt;br /&gt;MUL  temp1, temp1, temp1.w;&lt;br /&gt;&lt;br /&gt;#---Calculate basis for tangent stuff (realtime, for deforming models. Static models can save the vectors and avoid this)---&lt;br /&gt;MOV vNorm.xy, fTex0.zwxy; #Load in normal&lt;br /&gt;MOV vNorm.z, fTex1.zwxy;&lt;br /&gt;DP3  vNorm.w, vNorm, vNorm; #Normalize normal (correct it) &lt;br /&gt;RSQ  vNorm.w, vNorm.w;&lt;br /&gt;MUL  vNorm, vNorm, vNorm.w;&lt;br /&gt;&lt;br /&gt;MOV vBin.xyz, fTex1.yzwx; #Load in binormal&lt;br /&gt;DP3  vBin.w, vBin, vBin; #Normalize binormal (correct it)&lt;br /&gt;RSQ  vBin.w, vBin.w;&lt;br /&gt;MUL  vBin, vBin, vBin.w;&lt;br /&gt;&lt;br /&gt;MUL vNorm, vNorm, FlipValues;&lt;br /&gt;MUL vBin, vBin, FlipValues;&lt;br /&gt;&lt;br /&gt;XPD vTang, vBin, vNorm;  #Calculate tangent (pseudo-normalized)&lt;br /&gt;&lt;br /&gt;#Make texture normal Global: ??? z/blue = out, y/up = down, x/left = right&lt;br /&gt;MUL vNorm, temp1.z, vNorm;&lt;br /&gt;MAD vNorm, temp1.x, vBin, vNorm;&lt;br /&gt;MAD vNorm, temp1.y, vTang, vNorm;&lt;br /&gt;&lt;br /&gt;#---Start of full hemi shading:---&lt;br /&gt;#Req: &lt;br /&gt;DP3 temp2, EyeDir, vNorm;  #Eye dot normal = specref vector&lt;br /&gt;MUL temp2, vNorm, temp2.w;  #Scale normal by dp and 2.0&lt;br /&gt;MUL temp2, temp2, K.w;&lt;br /&gt;SUB temp2, EyeDir, temp2;  #Sub to get specular normal&lt;br /&gt;&lt;br /&gt;DP3 temp2.y, temp2, Light0Dir;  #Specular dot produxt (specular normal dot light)&lt;br /&gt;DP3 temp2.x, vNorm, Light0Dir;  #Diffuse dot product (normal dot light)&lt;br /&gt;&lt;br /&gt;#---Hemispherical lighting---&lt;br /&gt;MAD temp2.x, temp2.x, HemiParam.x, HemiParam.y; #t = t*0.5 + 0.5 (hemispherical lighting = cool)&lt;br /&gt;&lt;br /&gt;#---Scale the light to be the hemisphere---&lt;br /&gt;POW temp2.x, HemiParam.z, temp2.x; #t = pow(t, hard), flip this to halo (A^B)&lt;br /&gt;MUL temp2.x, temp2.x, HemiParam.w; #t *= spec&lt;br /&gt;&lt;br /&gt;#---Calculate final hemi diffuse color---&lt;br /&gt;LRP temp1, temp2.x, colTex, ColorAmb; #Interpolate color to ambient color (mult op)&lt;br /&gt;&lt;br /&gt;#---Specular highlight---&lt;br /&gt;MOV temp2.w, ColorShininess.x;  #Load specular value into LIT vector... (0..127)&lt;br /&gt;LIT temp2, temp2;   #compute diffuse &amp; specular coefficients&lt;br /&gt;&lt;br /&gt;#---Calculate final diffuse + specular color---&lt;br /&gt;LRP temp1, temp2.z, ColorSpec, temp1; #Interpolate diffuse to specular color (white = K.xxxx) based on specular component&lt;br /&gt;&lt;br /&gt;#---Emissive color addition---&lt;br /&gt;ADD temp1, temp1, ColorEmit;  #Add in emission color&lt;br /&gt;&lt;br /&gt;MOV result.color.xyz, temp1;&lt;br /&gt;MOV result.color.w, fragment.color.w; #Load final color with initial color alpha&lt;br /&gt;#---End of full hemi shading:---&lt;br /&gt;&lt;br /&gt;END&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Well, that's all. AS you can see, there is yet another 'art' component to matching good normal maps to good models, but hell, if the quality jumps this much using such a simple configuration, it'll be cakewalk to make next-gen looking characters, well, at least unrealistic ones.&lt;br /&gt;&lt;br /&gt;Peace ya'll.&lt;br /&gt;&lt;br /&gt;-Z&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4044374934526922505-815330132529306470?l=imaginaryz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://imaginaryz.blogspot.com/feeds/815330132529306470/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4044374934526922505&amp;postID=815330132529306470&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/815330132529306470'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/815330132529306470'/><link rel='alternate' type='text/html' href='http://imaginaryz.blogspot.com/2009/04/tangent-space-normal-maps.html' title='Tangent space normal maps'/><author><name>Imaginary Z</name><uri>http://www.blogger.com/profile/05059116260376007206</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_O5BsOfO48b0/R1n4E03veuI/AAAAAAAAAAc/p0Q4WRLzwj0/S220/GargHead.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_O5BsOfO48b0/SdUvXxvfRCI/AAAAAAAAAFg/RvcZMcUOarQ/s72-c/tubeNM.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4044374934526922505.post-1305240631540667488</id><published>2009-03-28T10:27:00.003-05:00</published><updated>2009-03-28T10:55:53.976-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='popeye'/><category scheme='http://www.blogger.com/atom/ns#' term='dragon'/><category scheme='http://www.blogger.com/atom/ns#' term='rpg'/><category scheme='http://www.blogger.com/atom/ns#' term='dream'/><title type='text'>Dream; Lots of weird things</title><content type='html'>not sure exactly what was happening but... it was in three parts.&lt;br /&gt;&lt;br /&gt;Part 1, seemed to be me walking around this sort of zoo place, and, I've never been in a zoo like this, I should draw out the floor plan, but it was kinda like a seaworld thing, lots of concrete walls and pats, large open areas and exhibits. It was a normal zoo however, but I was confronted by one of the managers who wanted to ask me some questions. &lt;br /&gt;Apparently, Apple had setup some sort of shitty mac exhibit, which was in a reasonably large place, and, well, being apple, it was just a bunch of people gawking at things they don't understand, and the people who do just avoiding it or earning commission.&lt;br /&gt;So I walked around, looked at ipods, apple SERVERS (wtf?! nightmare!), and some neat aural displays that combined synthaesia with touch/movement interface for media browsing and editing. I played with apple equipment, there were lots of people here, kids, adults, it was a real zoo.&lt;br /&gt;So, apparently, I went over and leaned on a concrete wall and talked to the zoo rep, she was a cute brunette, about 28, real nice, so it was cool. We got to talking, and then a fade out and fade in, aaaand,&lt;br /&gt;apparently, we had changed the exhibit from 'Apple' to 'Dragons', which, makes NO fucking sense in a zoo, unless they were promoting their reptile house or something (which was the case). Somehow, in that lapse, we move the apple exhibit out, and replaced it with these styrofoam/inflatable dragon-mockups, explaining history of those mythological beasts, and performing scientific analysis for comparison with real animals that have similar traits. Personally, it was stupid, but the value here was using a generic 'catch' to draw people in, then let the kids screw around with interactive games and simple question and statements that make them think, rather than just telling them things. For example, comparing one of the eastern dragon exhibits with snakes and some sort of salamander made sense, common observation about how such a creature could move without legs, and stuff like that. Using non-real things was more interesting that using real things, plus you learn about both.&lt;br /&gt;Anyways, it was a pretty kickass exhibit for kiddos, and for adults too, it had some in depth information as well as light stuff scattered about, neato virtual simulations and videos, the works. So, I had hooked up with this chick and we did a good job.&lt;br /&gt;Well, that was the first part of the dream, and suddenly it began to go downhill. After work, I had gone home, but stopped at a local bad, and now the world looked like 'The Watchmen' or 'Sin City', and I had my trenchcoat and a gruff face. I went into the bar, and talked to this one guy who was freaking out about treasure and apocalypse, talking about some sort of horrible event and the death of everyone. I ignored him, but, I went to a game machine at the bar and played 'Popeye vs. Satan', the game, no lie.&lt;br /&gt;the game played a LOT like Mario Galaxy, but minus the gravity. You were the plucky hero Popeye, trying to save olive oyl. There were lots of worlds, and mostly context sensitive 2 button controls (context and other) so at first, I was watching this river flow, with lots of big fish in it, but it was boring, however, there was this large dam-gate that opened and closed every 2 minutes, flushing the current fish and anything in the water to their death. So, I explored up the mountain, into this cave which had some old machinery. Popeye was apparently adept at mechanics, and I told hm to 'wut? whoa! akacacaca!' the gate machine so it wouldn't open again, which stopped the fish flow so he could get the materials across the lake to fix the elevator lift which took him UP the cave in the mountain, then suddenly the elevator would drop, him straight into generic hell, full of fire, where you had to jump and perform all these cartoony moves (This game played like a really fun Dragon's Lair) to avoid getting burned. Eventually, after platforming through demons and spinach punching the hell out of them, we reached Satan himself, who told us Olive Oyl was in another dimension, and throws popeye into the jungle world! Jungle world was the same idea, but much harder platforming elements, wire sliding, tricky moving jumping and more insta-death traps. Anyways, I quit playing and walked out to go home, buuut,&lt;br /&gt;When I did, it went to phase 3 of the dream, which was 'RyonaSaga' but toned down on the ryona. (which I hate) So, I turned into an anime character like me, and banded up with a bunch of tough anime chicks (yay Fran!) The RPG was very generic, I think it was just fanservice for all sorts of kinky stuff, but still, we started in this town, that had been catoonized, and apparently this dragon lord (generic! bleh.) had been devouring townspeople and resources for a while, it was obvious, but represented as hilarious shark-like bites taken out of buildings. so, we geared up and Xenogears'd our way out of the town, fighting genetic soldiers, machines, and some monsters. After getting out og the town, we did the desert level, fought sandworms, birds, super sand tanks and some flying sandmonsters. Then, we get to the port town, talk to a few people, take a ship out on the ocean to find the lord to kill him, but at this point we had acquired some sort of bear as a sidekick, and had much better armor and magic stuff. However, as all RPG's require, seamonster eats our ship, cue jabu-jabu style level, get treasure out of it that is awesome weapon, doesn't kill the monster, it becomes a summon, make it to other shore, now armed to the teeth. &lt;br /&gt;What happened next was not-RPG style, suddenly it became Resident Evil style in the dragon lord's castle, with traps and sneaking taking precedence of fights. There were heavily armored bears guarding the place, which was pretty damn scary, somewhat reminiscent of 'The Golden Compass', but with no anthropomorphic features. Eventually, we snuck into the lord's chamber, and we confront this generic chinese emperor, who talks to us for a while, before opening a dark gate and escaping, leaving us to feed his pet, which was this odd 4 legged 2-armed mutant beast creature, looked pretty cool, but wasn't big enough to take us on, I shot it with seamonster-gun once, and we chased the emperor onward, the entourage of purple and green haired chicks still giggling and talking in high pitched voices following. Yuck.&lt;br /&gt;After that, things got fuzzy, I was out in the backyard at my old house digging up a pipe or something with Zack, Scott and Caleb. Who knows.&lt;br /&gt;&lt;br /&gt;Of interesting notes, &lt;br /&gt;Popeye worked really well as a 3D platforming character, because his cartoony universe was perfect for a 3D catoony universe. That gameplay was well done too, it felt like Mario64, because you had freedom to go around, and context controls to to logical things all the time.&lt;br /&gt;The characters in the RPG died a lot, and didn't come back. Luckily, there seemed to be an infinite supply of anime girls, which always had the same equipment your team died with... how strange.&lt;br /&gt;Graphics were PS2 style, not PS3/HD. It kinda fit for both games this time.&lt;br /&gt;There was a lot more to the zoo parts, but it's kinda fuzzy. I could draw it out I suppose.&lt;br /&gt;&lt;br /&gt;Peace out.&lt;br /&gt;&lt;br /&gt;-Z&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4044374934526922505-1305240631540667488?l=imaginaryz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://imaginaryz.blogspot.com/feeds/1305240631540667488/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4044374934526922505&amp;postID=1305240631540667488&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/1305240631540667488'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/1305240631540667488'/><link rel='alternate' type='text/html' href='http://imaginaryz.blogspot.com/2009/03/dream-lots-of-weird-things.html' title='Dream; Lots of weird things'/><author><name>Imaginary Z</name><uri>http://www.blogger.com/profile/05059116260376007206</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_O5BsOfO48b0/R1n4E03veuI/AAAAAAAAAAc/p0Q4WRLzwj0/S220/GargHead.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4044374934526922505.post-4475693476334065895</id><published>2009-03-24T17:07:00.004-05:00</published><updated>2009-03-24T17:18:16.442-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='dragon'/><category scheme='http://www.blogger.com/atom/ns#' term='vertex program'/><category scheme='http://www.blogger.com/atom/ns#' term='GLSL'/><category scheme='http://www.blogger.com/atom/ns#' term='SDL'/><category scheme='http://www.blogger.com/atom/ns#' term='opengl'/><category scheme='http://www.blogger.com/atom/ns#' term='lizard'/><category scheme='http://www.blogger.com/atom/ns#' term='fragment program'/><title type='text'>More nonsense</title><content type='html'>So, working on more things, lots of things. 'Sys' is the new IGTL system namespace, which provides all the utilities that you could need for memory, data structures, file/directory IO, mathematics, 3D mathematics, algorithms, and all the basic stuf every system should have. Basically, it's a new version of cstdlib, that uses C++ stuff (like STL, but not junky) for some systems. Specially, it has a lot of very common math and algorithms in a very clean and not junky C-style system, so you don't have to freak out over overhead.&lt;br /&gt;&lt;br /&gt;It's coming along awesome, and I love it. It makes so much more sense now, getting the base code out of the way. Although, it does prove that the C++ crap is near useless, which by extenstion makes most all languages that are not python a$$. And all other languages are useless for realtime stuff.&lt;br /&gt;&lt;br /&gt;So, I also learned how to do 'Hemispherical Lighting', which is a simple little trick in your good ole shader math:&lt;br /&gt;&lt;br /&gt;float dp = light_vector dot normal ;&lt;br /&gt;float schemi = hemi_scale * pow( hemi_power, 0.5 * dp + 0.5 ); //Light factor to use&lt;br /&gt;&lt;br /&gt;And, again in GL_fragment_shader_arb lingo,&lt;br /&gt;&lt;br /&gt;DP3 temp2.x, nNorm, -mvp[2];        #Dot view normal (curr view) with vertex normal to get generic light intensity&lt;br /&gt;&lt;br /&gt;#---Hemispherical lighting--- Req: K.y = 0.5, LK.z = light_pow, LK.w = light_scale&lt;br /&gt;MAD temp2.y, temp2.x, LP.x, LP.y;    #t = t*0.5 + 0.5    (hemispherical lighting = cool)&lt;br /&gt;&lt;br /&gt;#---Scale the light to be the hemisphere&lt;br /&gt;POW temp2.y, LP.z, temp2.y;        #t = pow(t, hard), flip this to halo (A^B)&lt;br /&gt;MUL temp2.y, temp2.y, LP.w;        #t *= spec&lt;br /&gt;&lt;br /&gt;#---Calculate final hemi diffuse color&lt;br /&gt;MUL temp1, temp2.y, fragment.color;    #Interpolate color to black (mult op)&lt;br /&gt;&lt;br /&gt;And, some examples, but I don;t have comparison shots because Blender uses hemi lights, you can easily see the difference.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_O5BsOfO48b0/SclZsZKxwTI/AAAAAAAAAFQ/Qk4KOrLk2Og/s1600-h/Delgagain.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 234px;" src="http://2.bp.blogspot.com/_O5BsOfO48b0/SclZsZKxwTI/AAAAAAAAAFQ/Qk4KOrLk2Og/s400/Delgagain.png" alt="" id="BLOGGER_PHOTO_ID_5316879454292787506" border="0" /&gt;&lt;/a&gt;Hey, it's delgadosaur again, and it looks less plastic, more daylight plastic.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_O5BsOfO48b0/SclZvuoNBrI/AAAAAAAAAFY/AfP8fLUTmbo/s1600-h/Purpdrag.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 234px;" src="http://3.bp.blogspot.com/_O5BsOfO48b0/SclZvuoNBrI/AAAAAAAAAFY/AfP8fLUTmbo/s400/Purpdrag.png" alt="" id="BLOGGER_PHOTO_ID_5316879511592961714" border="0" /&gt;&lt;/a&gt;And a new member of the crew, this purple-dragon thing that's more friendly and low poly. But that's what textures and sub-surface models are for, right?&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Anyways. Peace out.&lt;br /&gt;&lt;br /&gt;-Z&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4044374934526922505-4475693476334065895?l=imaginaryz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://imaginaryz.blogspot.com/feeds/4475693476334065895/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4044374934526922505&amp;postID=4475693476334065895&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/4475693476334065895'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/4475693476334065895'/><link rel='alternate' type='text/html' href='http://imaginaryz.blogspot.com/2009/03/more-nonsense.html' title='More nonsense'/><author><name>Imaginary Z</name><uri>http://www.blogger.com/profile/05059116260376007206</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_O5BsOfO48b0/R1n4E03veuI/AAAAAAAAAAc/p0Q4WRLzwj0/S220/GargHead.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_O5BsOfO48b0/SclZsZKxwTI/AAAAAAAAAFQ/Qk4KOrLk2Og/s72-c/Delgagain.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4044374934526922505.post-2627719098695320223</id><published>2009-03-23T17:04:00.002-05:00</published><updated>2009-03-23T17:16:54.913-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='reconi'/><category scheme='http://www.blogger.com/atom/ns#' term='dream'/><title type='text'>Dream; Goodbye tasty humans</title><content type='html'>Not sure how the whole mess got started, but I do distinctly remember driving in the car with dad, mom, and sis. I think we were driving somewhere in Kansas, but the landscape was hilly, but that was because of some sort of natural disaster. Spanning a light gray sky, swirling with slow moving clouds, you could see occasional lighting flashes and sections of hazy dust and rain. It seemed grayish blue, there were no trees, only a soft diffuse light coming from what we assumed is the sun, the landscape looked like it had been melted by intense blasts of heat, clawed out by something much larger than a earth mover. Of course, some parts were still intact, it seemed that random damage had occurred, but there were no plants. Just yellow straw grass here and there.&lt;br /&gt;So we drive into this thing that looks like a tow, I guess we were escaping the carnage, and stopped to look around. This place looked the same, all of the buildings looked like they had been sandblasted, and were somewhat moved, indicating a large shockwave had come from a specific direction at some point. There were some skeletons scattered about, but nothing too severe. After poking around the town, looking for any survivors, I decided that we had to go to the university. For some reason, we had to go to KU, being that it would be least affected by whatever crazy thing happened here. I went solo, as there were lots of supplies unused in that town, and drove a broken highway to KC. there were lots of cars along the way, damaged, tossed, something like the cloverfield movie, lots of evidence, no picture of the thing itself. Eventually I made it near one of the larger buildings, which was guarded by many heavily armed folks.&lt;br /&gt;Apparently, John was a well known professor there, so I was able to get in, and waited in a holding/detox room so I could figure out what happened. I scribbled nonsense on the whiteboard, and this creepy old teacher came by and was all 'I like vectors too' and made some stupid math joke, I scowled at her and tried to explain my problem, but she cut me off so I tuned her out. That happens a lot at work too. Then john came by, and we began talking about what the hell was going on, apparently, no one remembers what happened, just kind of waking up after the fact. All infrastructure had been damages, radio signals are destroyed, no working ionosphere thanks to the dust (must be aliens, this is something that the Reconi do to sentient planets...) so no way to communicate.&lt;br /&gt;Course, this is where things got acid-y. I was sitting down, and John started to talk to that math lady, I guess I was tired and nodded off, but only half asleep, and the world became a cartoon, and that lady morphed into this weird demon chick with a flowing cloth behind her, and john morphed into this goofy pink&amp;amp;lavender dragon monster, and after laughing at both of them, I watched this little cartoon short where the dragon danced around, trying to impress the demon lady, who matched the dance skill or something, then they both ran to a starting line and had a footrace, which was weird...&lt;br /&gt;I snapped awake at the mention of my name, but there was some word there that woke me up in real life, it was only 2:30 or something, which sucked, &lt;a href="http://www.okfarminsurance.com/adCampaignMaterial/tv_commercials/Chain_Post.wmv"&gt;it was being Oklahoma outside&lt;/a&gt;, so I went back to sleep, or tried to.&lt;br /&gt;&lt;br /&gt;I'm not sure what kind of disaster would entirely kill the planet like this, but I imagine it wasn't traditional weaponry. It really looked like some giant monster had gone around and scooped up whatever piece of the earth buffet it wanted, and just cauterized the rest. If I were to guess, probably some sort of sleeping gas was used first, and then harvester's were dropped to clean up. That way they could avoid any 'moral' obligations by claiming death was painless to all those killed. Perfectly valid, actually. Not a bad idea at all. Sounds like my next doomsday project, make everyone fall asleep, release natural predators. Done.&lt;br /&gt;&lt;br /&gt;In more detail, I suspect this was a three stage attack. First was the normal detonations of sleeping gas, then metallic dust as chaff for communications and missile guidance and all other earthly forms of retaliation, and finally some EMP bombs for good measure. Then, drop the harvesters down, scoop up all the goodies, pack up, and leave the planet to fix itself. Sounds like something we could use today, honestly.&lt;br /&gt;&lt;br /&gt;And, sorry John, I dunno why you got such a weird representation, but at least it didn't have a purse.&lt;br /&gt;&lt;br /&gt;Oh yeah, I remember distinctly talking about going back to school, and really wanting too. Must be some sorta premonition.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4044374934526922505-2627719098695320223?l=imaginaryz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://imaginaryz.blogspot.com/feeds/2627719098695320223/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4044374934526922505&amp;postID=2627719098695320223&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/2627719098695320223'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/2627719098695320223'/><link rel='alternate' type='text/html' href='http://imaginaryz.blogspot.com/2009/03/dream-goodbye-tasty-humans.html' title='Dream; Goodbye tasty humans'/><author><name>Imaginary Z</name><uri>http://www.blogger.com/profile/05059116260376007206</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_O5BsOfO48b0/R1n4E03veuI/AAAAAAAAAAc/p0Q4WRLzwj0/S220/GargHead.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4044374934526922505.post-218049595024242005</id><published>2009-03-15T18:01:00.002-05:00</published><updated>2009-03-15T18:04:40.263-05:00</updated><title type='text'>Masao Parody</title><content type='html'>&lt;a href="http://www.youtube.com/watch?v=0ASeYsZEAv0"&gt;Masao Parody Test 1/2&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.youtube.com/watch?v=rWeDJoTub2w"&gt;Masao Parody Test 2/2&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Well, that Masao guy is awesome, so I tried making a parody of his style of videos. This is kind of a test of doing a parody, more or less improvised.&lt;br /&gt;&lt;br /&gt;Enjoy!&lt;br /&gt;&lt;br /&gt;-Z&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4044374934526922505-218049595024242005?l=imaginaryz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://imaginaryz.blogspot.com/feeds/218049595024242005/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4044374934526922505&amp;postID=218049595024242005&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/218049595024242005'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/218049595024242005'/><link rel='alternate' type='text/html' href='http://imaginaryz.blogspot.com/2009/03/masao-parody.html' title='Masao Parody'/><author><name>Imaginary Z</name><uri>http://www.blogger.com/profile/05059116260376007206</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_O5BsOfO48b0/R1n4E03veuI/AAAAAAAAAAc/p0Q4WRLzwj0/S220/GargHead.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4044374934526922505.post-7237407781372820186</id><published>2009-03-05T18:28:00.003-06:00</published><updated>2009-03-05T18:38:01.421-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='data structures'/><category scheme='http://www.blogger.com/atom/ns#' term='quadtree'/><category scheme='http://www.blogger.com/atom/ns#' term='code'/><title type='text'>Quick Post</title><content type='html'>Alright.&lt;br /&gt;&lt;br /&gt;Quadtrees using proxy indicies are too slow (because if you don;t define them carefully, AKA if you don;t enforce data always being in the leaves, well, it goes to hell. Draw it out to see what happens.)&lt;br /&gt;&lt;br /&gt;Quadtrees using leaved index lists seem to do OK, however, their performance is not that good. It certainly costs a lot of memory and speed to handle space, and they are conformal space limiting.&lt;br /&gt;&lt;br /&gt;Thus, we are required to develop a better, more efficient structure. In this case, I choose a interval list. However, you immediately scream "O(n)!" and to that, I say "Balanced Binary Tree"&lt;br /&gt;&lt;br /&gt;Of course, you mutter about "2 log2(n)" but you;d be right for deletions. Additions are worst case log2(n).&lt;br /&gt;&lt;br /&gt;Actually, if you think about it, given a random set of any data, the absolute fastest way to sort and store that list IS clamped at a maximum of log2(n). You might think that hashtables can beat it, but come on peoples, hashtables are application specific optimization. Sure, if you know your inputs are bounded you can hashup your memory and get a hashlist of B-Trees, but is that step actually going to save much? And besides, looks like you still HAVE TO MAKE THE GODDAMN TREE!&lt;br /&gt;&lt;br /&gt;In summary, this is the current problem. If you think you are smart, solve this problem. When you find out you're an idiot, don't complain to me:&lt;br /&gt;&lt;br /&gt;Given a random set of intervals (minimum (float32) and size (float32), create a data structure that can store these intervals sorted by the minimum value, and be able to quickly determine interval queries, AKA stabbing queries. The structure should have as minimum a memory footprint as possible, and you can assume you have Alloc, Realloc, Free working properly. Also, the structure cannot use hidden operations internally (No OOP or C++ tricksies internally), however externally it may operate as a class interface. It must support insert( proxy ), remove( proxy ), and get( float min, float size. ProxyList &amp;amp; ). A proxy contains at least unsigned int user, which contains the user data for what the proxy is in user memory. It cannot leak memory. It must work in practice and be implemented.&lt;br /&gt;&lt;br /&gt;Practical application? Pretend you are building a 2D game that uses edges for level collisions, which can be added and removed every frame, on the fly. (in the editor) Once the user is happy with their setup, obviously we use a static BVH for static data.&lt;br /&gt;&lt;br /&gt;Good Luck!&lt;br /&gt;&lt;br /&gt;-Z&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4044374934526922505-7237407781372820186?l=imaginaryz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://imaginaryz.blogspot.com/feeds/7237407781372820186/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4044374934526922505&amp;postID=7237407781372820186&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/7237407781372820186'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/7237407781372820186'/><link rel='alternate' type='text/html' href='http://imaginaryz.blogspot.com/2009/03/quick-post.html' title='Quick Post'/><author><name>Imaginary Z</name><uri>http://www.blogger.com/profile/05059116260376007206</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_O5BsOfO48b0/R1n4E03veuI/AAAAAAAAAAc/p0Q4WRLzwj0/S220/GargHead.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4044374934526922505.post-152595343811540299</id><published>2009-02-20T17:46:00.006-06:00</published><updated>2009-02-20T18:00:45.311-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='collisions'/><category scheme='http://www.blogger.com/atom/ns#' term='screenshots'/><category scheme='http://www.blogger.com/atom/ns#' term='space'/><category scheme='http://www.blogger.com/atom/ns#' term='code'/><category scheme='http://www.blogger.com/atom/ns#' term='SDL'/><category scheme='http://www.blogger.com/atom/ns#' term='opengl'/><title type='text'>Hey look, a quadtree</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_O5BsOfO48b0/SZ9A8Sykt7I/AAAAAAAAAFA/OXslrGgO5Sg/s1600-h/Quadtree.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 234px;" src="http://3.bp.blogspot.com/_O5BsOfO48b0/SZ9A8Sykt7I/AAAAAAAAAFA/OXslrGgO5Sg/s400/Quadtree.png" alt="" id="BLOGGER_PHOTO_ID_5305030290646022066" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;So what's so special? This is a common data structure that everyone one of you should be able to do from memory. It's extremely simple, and uses recursion. Simply make a tree with each node linking to 4 child nodes that evenly divide space, and let each node store a list of pointers or the data itself.&lt;br /&gt;&lt;br /&gt;The special part, is this is a generic quadtree, so, instead of 'storing' objects, it stores XData::Quadtree::Proxy object POINTERS to a XData::List, which means that Proxy lifecycle is left to the user (working on making it pointeriffic and more auto-delete) but that also means that every node stores a list of those proxy pointers, so that your game object:&lt;br /&gt;&lt;br /&gt;class MyGameObject : public Game::BaseObject {&lt;br /&gt;  private:&lt;br /&gt;    XData::Quadtree::Proxy m_proxy;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Can simply access the quadtree as such:&lt;br /&gt;&lt;br /&gt;qtree.insert( obj.m_proxy );&lt;br /&gt;qtree.remove( obj.m_proxy );&lt;br /&gt;m_proxy.IsValid();&lt;br /&gt;qtree.get( XData::Array &amp;amp;, fptr_to_Collision_Function, collision_function_data );&lt;br /&gt;&lt;br /&gt;So what this means, is in the above picture you can draw arbitrary edges for a odin-sphere style level, which get their proxies put into the quadtree. This is dangerous only if you forget to remove the proxy before deleting the object. But it means that you can query arbitrary shapes against the quadtree and get a quick enough broadphase test for intersection. Insertion is always better than O(log(n)), deletion/update is best case O(1), worst case O(log(n) + 1). Access is linked list, so fast iteration is possible.&lt;br /&gt;&lt;br /&gt;Quadtree's are good for dynamic data, that is if everything is changing quickly. There are other methods for static data that are far superior, like KDTrees or Spaceblocks or even AxisSweeps, but quadtrees are a general good purpose solution that's still good in performance to be viable for many applications. In fact, you probably won't need much more than this, unless you have severe restrictions that force you to use sorted space blocks.&lt;br /&gt;&lt;br /&gt;If you are making a 2D game, please do not use tiles. I will hate you, and you should be competent enough to make a quadtree (think Game Maker) that can handle arbitrary shapes and so forth.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.bit-blot.com/aquaria/"&gt;Go look at this game to see one of these methods in action&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;-Z&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4044374934526922505-152595343811540299?l=imaginaryz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://imaginaryz.blogspot.com/feeds/152595343811540299/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4044374934526922505&amp;postID=152595343811540299&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/152595343811540299'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/152595343811540299'/><link rel='alternate' type='text/html' href='http://imaginaryz.blogspot.com/2009/02/hey-look-quadtree.html' title='Hey look, a quadtree'/><author><name>Imaginary Z</name><uri>http://www.blogger.com/profile/05059116260376007206</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_O5BsOfO48b0/R1n4E03veuI/AAAAAAAAAAc/p0Q4WRLzwj0/S220/GargHead.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_O5BsOfO48b0/SZ9A8Sykt7I/AAAAAAAAAFA/OXslrGgO5Sg/s72-c/Quadtree.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4044374934526922505.post-5060252972939934667</id><published>2009-02-12T16:25:00.005-06:00</published><updated>2009-02-12T16:38:08.101-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GCC'/><category scheme='http://www.blogger.com/atom/ns#' term='SIMD'/><category scheme='http://www.blogger.com/atom/ns#' term='Quaternion'/><category scheme='http://www.blogger.com/atom/ns#' term='assembly'/><title type='text'>SSE Optimizations</title><content type='html'>So I got "My First SSE Optimized Quaternion Rotation Function" today...&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_O5BsOfO48b0/SZSh_6O-QqI/AAAAAAAAAE4/28DC6gbp418/s1600-h/SSETesting.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 310px;" src="http://4.bp.blogspot.com/_O5BsOfO48b0/SZSh_6O-QqI/AAAAAAAAAE4/28DC6gbp418/s400/SSETesting.png" alt="" id="BLOGGER_PHOTO_ID_5302040780657803938" border="0" /&gt;&lt;/a&gt;Note that I have to use GCC asm, which is a bitch compared to other forms, however, it has huge advantages, so just deal with it you pansys.&lt;br /&gt;&lt;br /&gt;The point is, the way VMath works is by:&lt;br /&gt;&lt;br /&gt;   extern void (*SomeFunc)( Vec4 &amp;amp; );                 //In the VMath.h, declare this pointer to be extern so it is not duplicated every time you include igtl_vmath.h&lt;br /&gt;&lt;br /&gt;And then, in the VMath.cpp:&lt;br /&gt;&lt;br /&gt;   void (*SomeFunc)( Vec4 &amp;amp; );                //Function pointer for routine declared ONLY in cpp&lt;br /&gt;&lt;br /&gt;And then, we call Initialize(), which reads your cpuid and sets function pointers to appropriate locations, so that if you have SSE, it can use it on runtime, and if not, it won't. Unfortunately, the calling overhead is the same.&lt;br /&gt;&lt;br /&gt;Also, your project settings need the -mmmx and -msse flags to tell GCC to use SSE.&lt;br /&gt;&lt;br /&gt;This is problem 3/4, I need to reduce the call syntax overhead, but I do not believe this is possible without using some strange compiler __attribute__ or __fastcall for you MS folks. This will be an experiment to run.&lt;br /&gt;&lt;br /&gt;Actually, I do not know of a better mechanism to use; If I need to detect processor type on runtime and switch functions, then I do not see any better way than using a function pointer. Although, this should be fast enough; SSE optimizations do not become apparent in small frame sense. In fact, you will see little gain for most functions, where they shine is parallelism. For example, if all your Game::Object's have a quaternion, then you probably 'update' each one of them independantly, which requires moving a lot of pointers and so on. Instead, if you make a batch_updater() function, then you can pass a pointer to your array of game objects, and store the values used commonly for all those transformations in registers, and thereby signifigantly speed up your application by removing redundant load calls and such...&lt;br /&gt;&lt;br /&gt;More on this as it progresses; The nice part, is since VMath already works, I don't have to f*** with the SSE part until later, because it was DESIGNED RIGHT! That means I can hand that coding task to any other programmer and let them optomize it to hell while I continue building more components into the framework. Hence my title as Developer.&lt;br /&gt;&lt;br /&gt;Peace ya'll!&lt;br /&gt;&lt;br /&gt;-Z&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4044374934526922505-5060252972939934667?l=imaginaryz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://imaginaryz.blogspot.com/feeds/5060252972939934667/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4044374934526922505&amp;postID=5060252972939934667&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/5060252972939934667'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/5060252972939934667'/><link rel='alternate' type='text/html' href='http://imaginaryz.blogspot.com/2009/02/sse-optimizations.html' title='SSE Optimizations'/><author><name>Imaginary Z</name><uri>http://www.blogger.com/profile/05059116260376007206</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_O5BsOfO48b0/R1n4E03veuI/AAAAAAAAAAc/p0Q4WRLzwj0/S220/GargHead.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_O5BsOfO48b0/SZSh_6O-QqI/AAAAAAAAAE4/28DC6gbp418/s72-c/SSETesting.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4044374934526922505.post-5368928495224832200</id><published>2009-02-10T16:27:00.003-06:00</published><updated>2009-02-12T16:43:57.163-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='shaders'/><category scheme='http://www.blogger.com/atom/ns#' term='ARF'/><category scheme='http://www.blogger.com/atom/ns#' term='vertex program'/><category scheme='http://www.blogger.com/atom/ns#' term='SDL'/><category scheme='http://www.blogger.com/atom/ns#' term='opengl'/><category scheme='http://www.blogger.com/atom/ns#' term='BRF'/><category scheme='http://www.blogger.com/atom/ns#' term='lizard'/><category scheme='http://www.blogger.com/atom/ns#' term='fragment program'/><title type='text'>Thumbs Up!</title><content type='html'>Okay, I got it. Matrix Palette exporter works fine now.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_O5BsOfO48b0/SZH_hOnGOrI/AAAAAAAAAEw/E7zG-2VCsms/s1600-h/ThumbsUp.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 234px;" src="http://2.bp.blogspot.com/_O5BsOfO48b0/SZH_hOnGOrI/AAAAAAAAAEw/E7zG-2VCsms/s400/ThumbsUp.png" alt="" id="BLOGGER_PHOTO_ID_5301299182714632882" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Next up is adding in textures in MIF/QIF format (already done, copy paste job), and then deciding the structure for spread-optimized armature/matrix palette, and then keyframes using vertex duplicate's.&lt;br /&gt;&lt;br /&gt;Of course, now that THIS works, it'll be time to shove it onto the iPhone. Imagine that, "Monster Game" for the iPhone! Course it'll be stripped down, but hey, sounds fun.&lt;br /&gt;&lt;br /&gt;Peace ya'll!&lt;br /&gt;&lt;br /&gt;-Z&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4044374934526922505-5368928495224832200?l=imaginaryz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://imaginaryz.blogspot.com/feeds/5368928495224832200/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4044374934526922505&amp;postID=5368928495224832200&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/5368928495224832200'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/5368928495224832200'/><link rel='alternate' type='text/html' href='http://imaginaryz.blogspot.com/2009/02/thumbs-up.html' title='Thumbs Up!'/><author><name>Imaginary Z</name><uri>http://www.blogger.com/profile/05059116260376007206</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_O5BsOfO48b0/R1n4E03veuI/AAAAAAAAAAc/p0Q4WRLzwj0/S220/GargHead.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_O5BsOfO48b0/SZH_hOnGOrI/AAAAAAAAAEw/E7zG-2VCsms/s72-c/ThumbsUp.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4044374934526922505.post-2736212021369786406</id><published>2009-02-07T12:52:00.006-06:00</published><updated>2009-02-12T16:43:46.295-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='vertex program'/><category scheme='http://www.blogger.com/atom/ns#' term='SDL'/><category scheme='http://www.blogger.com/atom/ns#' term='opengl'/><category scheme='http://www.blogger.com/atom/ns#' term='BRF'/><category scheme='http://www.blogger.com/atom/ns#' term='blender'/><category scheme='http://www.blogger.com/atom/ns#' term='lizard'/><category scheme='http://www.blogger.com/atom/ns#' term='fragment program'/><title type='text'>Well, goddamnit, GODDAMNIT! Again, again!</title><content type='html'>Well, still can't get it right. The materials have been fixed, apparently, but only for some models. Others still have trouble??? (Saurosaur model has some trouble when it's subsurfaced, but I believe this is related to the matrix problem at hand)&lt;br /&gt;&lt;br /&gt;At least this picture is a little less boring&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_O5BsOfO48b0/SY3YoVElkqI/AAAAAAAAAEg/oNqsrdfa-FQ/s1600-h/BrokenLizardArm.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 234px;" src="http://2.bp.blogspot.com/_O5BsOfO48b0/SY3YoVElkqI/AAAAAAAAAEg/oNqsrdfa-FQ/s400/BrokenLizardArm.png" alt="" id="BLOGGER_PHOTO_ID_5300130523847692962" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Also, I have a feeling some people don't know what spinal curves are. Actually, if you have studied animation, you might understand these as "Action Lines" or "&lt;a href="http://johnkstuff.blogspot.com/uploaded_images/pbanimation07-749469.jpg"&gt;Line of Action&lt;/a&gt;" or whatever name you want to give them. In fact, if you build your skeleton correctly, you can draw these spinal curves, and it shows you the model's action pose, from which it is WAY easier to tweak that action line than it is to screw with posing bones. I hope that Blender integrates this posing system into it's bones, it would only require an additional flag and some simple bone-blending editing tricks. It's very helpful for bringing things to life. What good is this realtime though? It's helpful if you don't have shaders on your PC, so you can at least see the game sort of. It's also helpful for special effects, and some other 'interesting' deformations... he he.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_O5BsOfO48b0/SY3YsHgLH8I/AAAAAAAAAEo/6wMfMu_2ks4/s1600-h/WhatAreSpinalCurves.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 234px;" src="http://3.bp.blogspot.com/_O5BsOfO48b0/SY3YsHgLH8I/AAAAAAAAAEo/6wMfMu_2ks4/s400/WhatAreSpinalCurves.png" alt="" id="BLOGGER_PHOTO_ID_5300130588924780482" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;I still need help with the exporter. It's not to my QC standards yet.&lt;br /&gt;&lt;br /&gt;-Z&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4044374934526922505-2736212021369786406?l=imaginaryz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://imaginaryz.blogspot.com/feeds/2736212021369786406/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4044374934526922505&amp;postID=2736212021369786406&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/2736212021369786406'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/2736212021369786406'/><link rel='alternate' type='text/html' href='http://imaginaryz.blogspot.com/2009/02/well-goddamnit-goddamnit-again.html' title='Well, goddamnit, GODDAMNIT! Again, again!'/><author><name>Imaginary Z</name><uri>http://www.blogger.com/profile/05059116260376007206</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_O5BsOfO48b0/R1n4E03veuI/AAAAAAAAAAc/p0Q4WRLzwj0/S220/GargHead.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_O5BsOfO48b0/SY3YoVElkqI/AAAAAAAAAEg/oNqsrdfa-FQ/s72-c/BrokenLizardArm.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4044374934526922505.post-5747929438695386140</id><published>2009-02-04T18:55:00.006-06:00</published><updated>2009-02-12T16:43:35.668-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='vertex program'/><category scheme='http://www.blogger.com/atom/ns#' term='SDL'/><category scheme='http://www.blogger.com/atom/ns#' term='opengl'/><category scheme='http://www.blogger.com/atom/ns#' term='lizard'/><category scheme='http://www.blogger.com/atom/ns#' term='fragment program'/><title type='text'>Well, goddamnit again!</title><content type='html'>Still fighting. Hang in there, plastic lizard monster!&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_O5BsOfO48b0/SYo5LFdja1I/AAAAAAAAAEY/5yiuHxKhpJs/s1600-h/FightingLizards.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 234px;" src="http://4.bp.blogspot.com/_O5BsOfO48b0/SYo5LFdja1I/AAAAAAAAAEY/5yiuHxKhpJs/s400/FightingLizards.png" alt="" id="BLOGGER_PHOTO_ID_5299110774162287442" border="0" /&gt;&lt;/a&gt;And yes, you will be fighting against this mo'fo, but as you can see, there are still glitches in the code. I am still lost as to where, it seems that larger models export better (how crazy is that?!) and they work fantastically well, as you can see.&lt;br /&gt;&lt;br /&gt;What is wrong:&lt;br /&gt;Materials are not perfect, there are 1 spots on this model that have incorrect materials&lt;br /&gt;Not all deformation groups are correct, you can see the spike present. On lower res models, it's way uglier.&lt;br /&gt;&lt;br /&gt;I need help.&lt;br /&gt;&lt;br /&gt;-Z&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4044374934526922505-5747929438695386140?l=imaginaryz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://imaginaryz.blogspot.com/feeds/5747929438695386140/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4044374934526922505&amp;postID=5747929438695386140&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/5747929438695386140'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/5747929438695386140'/><link rel='alternate' type='text/html' href='http://imaginaryz.blogspot.com/2009/02/well-goddamnit-again.html' title='Well, goddamnit again!'/><author><name>Imaginary Z</name><uri>http://www.blogger.com/profile/05059116260376007206</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_O5BsOfO48b0/R1n4E03veuI/AAAAAAAAAAc/p0Q4WRLzwj0/S220/GargHead.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_O5BsOfO48b0/SYo5LFdja1I/AAAAAAAAAEY/5yiuHxKhpJs/s72-c/FightingLizards.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4044374934526922505.post-2311196975625151077</id><published>2009-02-03T22:02:00.004-06:00</published><updated>2009-02-12T16:43:19.960-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='dragon'/><category scheme='http://www.blogger.com/atom/ns#' term='vertex program'/><category scheme='http://www.blogger.com/atom/ns#' term='SDL'/><category scheme='http://www.blogger.com/atom/ns#' term='opengl'/><category scheme='http://www.blogger.com/atom/ns#' term='blender'/><category scheme='http://www.blogger.com/atom/ns#' term='fragment program'/><title type='text'>Well, goddamnit!</title><content type='html'>Well. I still am having a hell of a time getting my GRF exporter to cooperate.&lt;br /&gt;&lt;br /&gt;For some reason, it works fine for models with less than 24 bones. However, models that have more than that (all of mine do) it screws up something with the vertex data, or maybe the bones, because suddenly, and irrationally, the bone groups dissociate and the neck will move when you bend the tail.&lt;br /&gt;&lt;br /&gt;I'm at a loss here, as I've checked the algorithms a hundred times, checked and verified the DATA ITSELF, so that I know that the bones are correct, faces, everything is correct... checked the C++ code, which reads it EXACTLY as the file, so I know the C code works since it is general case... so, where is the error?&lt;br /&gt;&lt;br /&gt;My guess is it lies inside of python somewhere.&lt;br /&gt;&lt;br /&gt;Maybe a stupid screenshot will cheer me up:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_O5BsOfO48b0/SYkTkFtOFDI/AAAAAAAAAEQ/Q4a0tulps2Y/s1600-h/WellGoddamnit.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 234px;" src="http://2.bp.blogspot.com/_O5BsOfO48b0/SYkTkFtOFDI/AAAAAAAAAEQ/Q4a0tulps2Y/s400/WellGoddamnit.jpg" alt="" id="BLOGGER_PHOTO_ID_5298787947306161202" border="0" /&gt;&lt;/a&gt;Whoopee... old school poser models. yay.&lt;br /&gt;&lt;br /&gt;Also, I have the fragment program and vertex program working fine. Tested, verified, fun to play with and easy to work with. I'll be much happier when I can GLSL this mess, although these programs are just about as fast as it can get, so not much reason to yet.&lt;br /&gt;&lt;br /&gt;Blender is cooperating fine, I've had no problems from it, aside from this list of annoyances:&lt;br /&gt;1. No bone weight keyframes available, I need to be able to save weights in vertex groups as a keyframe&lt;br /&gt;2. No UV keyframes available, I need to be able to save UV layer keyframes&lt;br /&gt;3. Actions are not tied to anything, and they are still difficult to use for making a movie, most people just use the 'one large action' to do it. Make actions work like actions, not scene animations. Make the NLA mean something, dammit.&lt;br /&gt;4. No support for mesh keyframe animations that makes sense. Why can't I just IPO a list of keyframes, instead of making 1 ipo for each keyframe (which is hell without a script, by the way)&lt;br /&gt;5. More materials. I need more than 16 materials. try 127? or 255?&lt;br /&gt;6. Much improved curve support. I should be able to hook curve verticies ONTO anything, like armatures and objects and verticies, without having to use the vertex hook &lt;-&gt; empty &lt;-&gt; curve thing.&lt;br /&gt;&lt;br /&gt;and so on.&lt;br /&gt;&lt;br /&gt;Hopefully I can get this $@#*( problem solved. This isn't a specialized problem, it's general, so it works for any matrix-palette system, including the coveted iPhone, PS3, and the PC.&lt;br /&gt;&lt;br /&gt;Peace folks,&lt;br /&gt;&lt;br /&gt;-Z&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4044374934526922505-2311196975625151077?l=imaginaryz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://imaginaryz.blogspot.com/feeds/2311196975625151077/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4044374934526922505&amp;postID=2311196975625151077&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/2311196975625151077'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/2311196975625151077'/><link rel='alternate' type='text/html' href='http://imaginaryz.blogspot.com/2009/02/well-goddamnit.html' title='Well, goddamnit!'/><author><name>Imaginary Z</name><uri>http://www.blogger.com/profile/05059116260376007206</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_O5BsOfO48b0/R1n4E03veuI/AAAAAAAAAAc/p0Q4WRLzwj0/S220/GargHead.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_O5BsOfO48b0/SYkTkFtOFDI/AAAAAAAAAEQ/Q4a0tulps2Y/s72-c/WellGoddamnit.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4044374934526922505.post-5153579174403258608</id><published>2009-01-25T22:26:00.007-06:00</published><updated>2009-01-25T22:32:17.862-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='fhdtv'/><title type='text'>F'HDTV</title><content type='html'>So naturally, I bought a HDTV.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_O5BsOfO48b0/SX07lC07sWI/AAAAAAAAAD4/CPUbcNHiC48/s1600-h/FHDTV_1.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 89px;" src="http://3.bp.blogspot.com/_O5BsOfO48b0/SX07lC07sWI/AAAAAAAAAD4/CPUbcNHiC48/s400/FHDTV_1.jpg" alt="" id="BLOGGER_PHOTO_ID_5295454244457656674" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;But this is no ordinary "High Definition Television". This is a 'F'ing HDTV. It says so, right on the box!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_O5BsOfO48b0/SX07oDhlDVI/AAAAAAAAAEA/5MkuptXC1Bw/s1600-h/FHDTV_2.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 166px;" src="http://1.bp.blogspot.com/_O5BsOfO48b0/SX07oDhlDVI/AAAAAAAAAEA/5MkuptXC1Bw/s400/FHDTV_2.jpg" alt="" id="BLOGGER_PHOTO_ID_5295454296184524114" border="0" /&gt;&lt;/a&gt;Not only that, but this TV is WAY more realistic that True Life! I didn't even know I could ascend to a higher state of being simply by purchasing a material good! This changes my entire perspective on reality being merely perception!&lt;br /&gt;&lt;br /&gt;And, of course, what better way to test a new TV than to use the greatest, most awesome of all videogames to test it's stunning reproduction of color and fast-action packed motion than:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_O5BsOfO48b0/SX07qvTYUfI/AAAAAAAAAEI/leJxAhvlT08/s1600-h/FHDTV_3.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 292px;" src="http://2.bp.blogspot.com/_O5BsOfO48b0/SX07qvTYUfI/AAAAAAAAAEI/leJxAhvlT08/s400/FHDTV_3.jpg" alt="" id="BLOGGER_PHOTO_ID_5295454342295867890" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;If you cannot recognize this game, I hate you, and you should play it so I do not hate you.&lt;br /&gt;&lt;br /&gt;-Z&lt;br /&gt;&lt;br /&gt;(P.S. It's called "Tyrian")&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4044374934526922505-5153579174403258608?l=imaginaryz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://imaginaryz.blogspot.com/feeds/5153579174403258608/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4044374934526922505&amp;postID=5153579174403258608&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/5153579174403258608'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/5153579174403258608'/><link rel='alternate' type='text/html' href='http://imaginaryz.blogspot.com/2009/01/fhdtv.html' title='F&apos;HDTV'/><author><name>Imaginary Z</name><uri>http://www.blogger.com/profile/05059116260376007206</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_O5BsOfO48b0/R1n4E03veuI/AAAAAAAAAAc/p0Q4WRLzwj0/S220/GargHead.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_O5BsOfO48b0/SX07lC07sWI/AAAAAAAAAD4/CPUbcNHiC48/s72-c/FHDTV_1.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4044374934526922505.post-6689257461968930296</id><published>2009-01-25T14:49:00.003-06:00</published><updated>2009-01-25T15:14:05.406-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='dream'/><title type='text'>Odd dream; A New Character Approaches!</title><content type='html'>Okay, so get this.&lt;br /&gt;&lt;br /&gt;Me, mike, vanessa (sorry for sp!) and maria (again! sp!) went to a mall, it was sometime in august apparently, and we were at the beach or something. It seemed like the east coast, slightly foggy, the air was humid, enough to make you have trouble breathing. It was warm though, upper seventies.&lt;br /&gt;This being another odd dream of mine, zombies happen. Not normal zombies, just mutated dead people that seemed to be afraid of light. So, we all stick together, watch some people get mauled/eaten, and find that if we stay in the light, they don't attack us. After moving slowly down into the depths of the mall, we find a Foley's or some department store, which is WELL lit, and get everyone in there and barricade the hell out of it (notice those places are well defended? neat.). There were lots of other people with us, but I for some reason had a sawed off double barreled shotgun that I pulled out of nowhere, and went to go see these zombies. Of course, this is a day or two later, and the zombies had upgraded to RE-type monsters, like those damned hunters or whatever. Oddly though, as soon as I left the store, they didn't even get close to me, they were &lt;span style="font-style: italic;"&gt;afraid&lt;/span&gt; of my presence, as if I was one of their leaders. They would approach, snarling, dripping blood and fleshy bits from gnarled stained teeth, glistened over with some sort of slime like a fish, making low gurgling, growling noises, yet only strafing in a circle around me, keeping at least 20 feet from my center. I could move at them. and they would jump back in fright. It was a rather empowering feeling, but right then things began to change.&lt;br /&gt;I was more myself (as in, me the fantasy character, Z) and I could sense it, as if my arch nemesis was going to appear and we would fight to the death.&lt;br /&gt;But this was new. some lacky, who looked like the bond from that new blonde movie (screw that) came at me and talked some shit like "master is going to kill you!", walking around like a zombie igor, but not showing any signs of zombification. Of course, as I walked out to this shipyard/gantry, I saw my foe at the end of the tunnel, the lackey running back to report.&lt;br /&gt;Time froze as we both gave eachother that anime eye-stare, piercing and gauging who would die first. Of course, like any popular anime, the outcome is even, in order to create suspense.&lt;br /&gt;It said only one sentence as I approached.&lt;br /&gt;"I am here to avenge your Brother. *evil laugh*"&lt;br /&gt;Now, if you know any of my villians, like Mr "S" and ect... then you know that this all-black satin mime-style creep is kinda odd. He looked feminine, but had a male voice, somewhat androgynous, but wore a black trenchcoat that seemed like leather, but it was fuzzy so it had a matte finish. It was loose, but belted around the odd garb of that solid black one-piece suit, like an acrobat from Cirque de Solie (sp?), and had a scepter that was tiny in the right hand, a floaty demeanor, and his face, was generic. But, it had white diamonds on the eyes like a mime, but no face paint so you could see flesh color. It also wore a hat over black hair that was like a jesters cap. The trenchcoat had a larger than normal collar, and this thing looked ridiculous. My brother would kill fools like this, not hire them to avenge.&lt;br /&gt;Either way, since now it was determined this was to be a Viewtiful Joe style endurance fight with DBZ elements, the camera switches to game mode, and I get a third person view and begin to play the game.&lt;br /&gt;We both had the same amount of health, and were both insanely tough, so, it was kinda crazy. We both had the same abilities, like shoryuken (fire-dragon punch), this wind-dragon-tornado-hadoken style move, lightning blasts, ice missiles, and I had my wristbands as a physical weapon, this joker had that scepter, and there were plenty of generic kung fu moves. We were both ultra strong, so we could lift tons of mass and chunk em at eachother.&lt;br /&gt;So, I dashed forward, and attacked, it laughed and began toying with me, copying my moves like shadow link, intermittently using a weird crystal move that made these hollow diamonds appear in random places, which then fired quickly at where you were going, forcing you to dance and dodge, but you always took a lot of hits.&lt;br /&gt;So, I learned it' patterns, and got my first hit in after it uses dragon-fire-wave-bullshit, slide kicking through it with an ice attack then using my wristband powered selfe (slow zoom punches + spin kick + uppercut) to inflict almost a 1/2 healthbar (but we each had 12 full healthbars) . then it jumped back, threw shit at me like giant metal cylinders, I used wind attack to move them slightly ot the side, and then we started hadoken-ing our way to victory, blast after blast, but it used the crystal move and I rolled under that fucker and made him get hit with his own attack, then he whipped around trying to backblow me but I shoved a steel pipe through his chest, which barely did any damage so he yanked it out and threw it away.&lt;br /&gt;The beatings continued, some dark matter gravity-beetle style attacks, and some environmental hazards (that idiot got close to the floor where a giant worm was (wtf?) so I knew it by name and called it, it ate the fucker, but well, that did MAYBE 1/10th a bar of damage, before it killed the worm and tried more crystal bullshit. the entire gantry was sinking apparently, so water was slowly filling our arena.&lt;br /&gt;However, during the fight, this was probably the 10th time I got in close and just kicked the shit out of him with 10+ hit combos via wristband, I just woke up cause I had my 8 hours of sleep.&lt;br /&gt;&lt;br /&gt;which sucked, because this was a worthy opponent, and although I was toying with him, it was a good fight, and for being a goofy looking mofo, it was surprisingly fair. No cheap insta-death moves (and yes, if you get eaten in any of my games, it's usually not instantly fatal. Just dodge teeth!) or annoying finishers like "skull pop" or my favorite "hand-through-sternum".&lt;br /&gt;&lt;br /&gt;Actually, there were lots of normally fatal to humans moves delivered, like axes kicks, nose-into-brain punches, hands and fists breaking ribcages. But we weren't human, we were videogame characters in a false representation of the real fight. So anything was possible.&lt;br /&gt;&lt;br /&gt;All I wanted to do was use my summon and end the fight, but mimeclown was too quick for me to pull it off. Oh well.&lt;br /&gt;&lt;br /&gt;Someday, I need to get screencap for my brain.&lt;br /&gt;&lt;br /&gt;-Z&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4044374934526922505-6689257461968930296?l=imaginaryz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://imaginaryz.blogspot.com/feeds/6689257461968930296/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4044374934526922505&amp;postID=6689257461968930296&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/6689257461968930296'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/6689257461968930296'/><link rel='alternate' type='text/html' href='http://imaginaryz.blogspot.com/2009/01/odd-dream-new-character-approaches.html' title='Odd dream; A New Character Approaches!'/><author><name>Imaginary Z</name><uri>http://www.blogger.com/profile/05059116260376007206</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_O5BsOfO48b0/R1n4E03veuI/AAAAAAAAAAc/p0Q4WRLzwj0/S220/GargHead.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4044374934526922505.post-1903498636261408395</id><published>2009-01-24T19:30:00.002-06:00</published><updated>2009-01-24T19:56:20.890-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='emo'/><title type='text'>Power is Agony</title><content type='html'>In summary,&lt;br /&gt;&lt;br /&gt;I'm sorry, &lt;insert&gt;&lt;insert name="" here=""&gt;&lt;br /&gt;&lt;br /&gt;In detail,&lt;br /&gt;&lt;br /&gt;I got to see parts of the beginning of 'Spirited Away'. Looks like a great movie, buuuut...&lt;br /&gt;When I see things that remind me of how I treated someone, and how I treated them badly, it makes me really sad. My only existing defense to avoid crying like a damned baby &lt;/insert&gt;&lt;insert name="" here=""&gt;is to distract myself with work. If I can be tasked, I can usually forget and ignore those kinds of severe pains.&lt;br /&gt;&lt;br /&gt;However, this one seems different, it is hard to explain. It's as if I, in a past life or even an alternate universe really hurt someone I cared about; it would be something similar to killing your mother in front of your little sister whom you made watch, and telling her it was okay, and everything was going to be fine as you burned the corpses. You knew what you did was right, at least at the moment, but as time passed, it became obvious how horrible and sadistic of a person you were, not only to things that deserved it, but directly translated to all things. Lost in a world where no one can either stop or control you, with no guidance or correct answers, there is nothing left you can do, nowhere to escape your apparently assigned fate.&lt;br /&gt;&lt;br /&gt;&lt;/insert&gt;&lt;insert name="" here=""&gt;Let me put this another way, if you have a gray area, like so many of life's decisions are, how do you rationalize your choice? The correct answer, is you can't. There ARE right answers, but you can't always see or even choose them. In the mind of a killer, like me, taking someone else's life is not wrong, because nothing IS wrong unless you define it as such. Other people trying to tell me that murder is wrong are not thinking about it correctly; There is no ambiguous, universal good or bad, those are merely ideological representations of what we have decided as a sentient society to obey in order to preserve order, and ourselves. Knowing this is critical, so I restate it simpler:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;"There is no right or wrong. There is only do."&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;So back to what bothers me, apparently, my alternate self hurt a friend that I care abou&lt;/insert&gt;&lt;insert name="" here=""&gt;t today, but, well, circuimstances have changed, and due to things beyond my control I can never talk to that friend again, and as a result I can never apologize or atone for my sins. Now I have the rest of my entire life to live and bleed this curse, professing it to any who will listen.&lt;br /&gt;&lt;br /&gt;It's even more confusing to me, as I investigate the lifecycle of one of my own characters; A powerful being allowed to do nearly anything, chained to a simple job, and eventually, thanks to external forces, caused him to fail, and he, single handedly, was responsible for the murder of all the people on his homeworld, his entire family, and himself. I, however, WAS that external force. It was decided, outside of this small bump in the road, that it was to be this way, and nothing could ever stop it. I tried to stop it, since it was a friend of mine, but, ultimately, what I did was load the gun and point it, and made my friend pull the trigger.&lt;br /&gt;&lt;br /&gt;This kind of manipulation is downright evil; But what are you to do about it? If you have the power to change the fate of an entire univese, do you do it at the cost of all the others? Does billions of people suffering and dying in a flaming hell bother you? Does it even matter, since that would happen ultimately anyways? Where is this fence? Where are the bounds to this situation we are in? What is keeping these powers from exploding outward, and collapsing in on themselves? Who is in control?&lt;br /&gt;&lt;br /&gt;The answer is simple. No one. Everything is only physical. All existence and perception is merely emergent behavior from a simple and well defined system. This is the way it began, and this is the way it will end. No matter how many people, creatures, machines, or even galaxies there are, everything is made of the exact same rules. The rules allow lots and lots of interesting variations, and all things can be explained by them. If you want the quick explaination, Chaos does not exist, it is a modeling tool only.&lt;br /&gt;&lt;br /&gt;But, as you may know by now, when you are really powerful, like me, you can lie to yourself.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;There's no extra charge to be happy!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Cheers to you, buddy.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/insert&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://i103.photobucket.com/albums/m160/shadowmaster187516/Spirited%20Away/Haku2-1.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 300px; height: 557px;" src="http://i103.photobucket.com/albums/m160/shadowmaster187516/Spirited%20Away/Haku2-1.gif" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;insert name="" here=""&gt;I'm sorry.&lt;br /&gt;&lt;br /&gt;-Z&lt;br /&gt;&lt;/insert&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4044374934526922505-1903498636261408395?l=imaginaryz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://imaginaryz.blogspot.com/feeds/1903498636261408395/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4044374934526922505&amp;postID=1903498636261408395&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/1903498636261408395'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/1903498636261408395'/><link rel='alternate' type='text/html' href='http://imaginaryz.blogspot.com/2009/01/power-is-agony.html' title='Power is Agony'/><author><name>Imaginary Z</name><uri>http://www.blogger.com/profile/05059116260376007206</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_O5BsOfO48b0/R1n4E03veuI/AAAAAAAAAAc/p0Q4WRLzwj0/S220/GargHead.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://i103.photobucket.com/albums/m160/shadowmaster187516/Spirited%20Away/th_Haku2-1.gif' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4044374934526922505.post-5171775069253134656</id><published>2009-01-18T11:47:00.007-06:00</published><updated>2009-02-12T16:42:32.466-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Curetis Siva'/><category scheme='http://www.blogger.com/atom/ns#' term='vertex program'/><category scheme='http://www.blogger.com/atom/ns#' term='SDL'/><category scheme='http://www.blogger.com/atom/ns#' term='opengl'/><category scheme='http://www.blogger.com/atom/ns#' term='lizard'/><title type='text'>GL_ARB_vertex_program II</title><content type='html'>I toyed with it a bit after rock banding it out with "Curetis Siva", the hottest new group to hit the pretend rock band scene.&lt;br /&gt;&lt;br /&gt;More results:&lt;br /&gt;&lt;br /&gt;This is 35 x Delgadosaurus's, which, he consists of 3700 verticies and 3800 polygons apiece.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_O5BsOfO48b0/SXNso_Th00I/AAAAAAAAADw/2Mrm141RE7Y/s1600-h/Delg_35x_3700.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 245px;" src="http://2.bp.blogspot.com/_O5BsOfO48b0/SXNso_Th00I/AAAAAAAAADw/2Mrm141RE7Y/s400/Delg_35x_3700.png" alt="" id="BLOGGER_PHOTO_ID_5292693438534374210" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Now, like the Asty demo, here's some frightening numbers:&lt;br /&gt;129,500 fully deformed verticies ( 4 x weighted matrix deform + texture + lighting + cell shading) runs at 50 FPS, but only 13 IFPS. Note that the asty demo only had ~30000 verticies, so comparing the 17 / 13 ratio, you can see how linear the addition of verticies is to the GPU load.&lt;br /&gt;&lt;br /&gt;Also, the collision in this one is taken out (VA/VBO's only) from this screenshot, yet the CPU load remained high, which is something to investigate. It must have to do with the bus transfer rates from system ram to GPU.&lt;br /&gt;&lt;br /&gt;Point is, this kinda opens up the floor for high-poly models, which are nessecary for decent looking games (take a screenshot of Oblivion, it pushes at least 80,000 polygons per frame, all with multiple textures AND a fragment program)&lt;br /&gt;&lt;br /&gt;But I care about animations more than textures, at least till I get my artists trained.&lt;br /&gt;&lt;br /&gt;More technical notes:&lt;br /&gt;&lt;br /&gt;since you have to break up verticies into groups for deformations, each vertex can only be deformed by a set maximum number of bones (4, in this case). You only have 28 bones to play with in the shader, however, if you want anything cool in your shader as well, you are knocked down to about 24 bones maximum. This might be a more useful practical limit anyhow. Storage cost is linear with each matrix used to deform, technically, there is no bone maximum limit, however, imposing one helps alignment constraints. In the ARB shaders, you can have a maximum of 128 instructions (excluding empty lines and comments), so your shaders have to be designed carefully. Only 96 local and 96 environment parameters are allowed in the shaders. Only 12 temporary values are allowed. A infinite number of ALIAS commands are allowed and they do not count against the instruction count (pretend they are #define statements). Loading shaders should be minimized. Switiching shaders should be minimized.&lt;br /&gt;&lt;br /&gt;Things to determine:&lt;br /&gt;Does using 4x matrix deform cost less than switching shaders?&lt;br /&gt;Does updating params cost anything signifigant? (think per armature)&lt;br /&gt;How viable is vertex keyframing? (per vertex, you have to load per keyframe switch per model)&lt;br /&gt;How viable is Armature Relative Vertex Keyframes? (weight/offset positions)&lt;br /&gt;Does the iPhone let me use n matricies? How slow is it's matrix palette?&lt;br /&gt;&lt;br /&gt;Peace out till next time.&lt;br /&gt;&lt;br /&gt;-Z&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4044374934526922505-5171775069253134656?l=imaginaryz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://imaginaryz.blogspot.com/feeds/5171775069253134656/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4044374934526922505&amp;postID=5171775069253134656&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/5171775069253134656'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4044374934526922505/posts/default/5171775069253134656'/><link rel='alternate' type='text/html' href='http://imaginaryz.blogspot.com/2009/01/glarbvertexprogram-ii.html' title='GL_ARB_vertex_program II'/><author><name>Imaginary Z</name><uri>http://www.blogger.com/profile/05059116260376007206</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_O5BsOfO48b0/R1n4E03veuI/AAAAAAAAAAc/p0Q4WRLzwj0/S220/GargHead.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_O5BsOfO48b0/SXNso_Th00I/AAAAAAAAADw/2Mrm141RE7Y/s72-c/Delg_35x_3700.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4044374934526922505.post-5768240090479027914</id><published>2009-01-17T19:45:00.004-06:00</published><updated>2009-02-12T16:42:54.698-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='shaders'/><category scheme='http://www.blogger.com/atom/ns#' term='IK'/><category scheme='http://www.blogger.com/atom/ns#' term='vertex program'/><category scheme='http://www.blogger.com/atom/ns#' term='GLSL'/><category scheme='http://www.blogger.com/atom/ns#' term='SDL'/><category scheme='http://www.blogger.com/atom/ns#' term='opengl'/><category scheme='http://www.blogger.com/atom/ns#' term='FPS'/><category scheme='http://www.blogger.com/atom/ns#' term='assembly'/><category scheme='http://www.blogger.com/atom/ns#' term='lizard'/><title type='text'>GL_ARB_vertex_program</title><content type='html'>As the title states, I've been hardcoring this useful tool in order to combat the 'Dancing Lizards' demo performance ratio of 98% CPU / 16 lizards. Now,&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_O5BsOfO48b0/SXKJ7diVbFI/AAAAAAAAADo/PW3dP7h-fY0/s1600-h/Asty_x_35.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 257px;" src="http://3.bp.blogspot.com/_O5BsOfO48b0/SXKJ7diVbFI/AAAAAAAAADo/PW3dP7h-fY0/s400/Asty_x_35.png" alt="" id="BLOGGER_PHOTO_ID_5292444166747679826" border="0" /&gt;&lt;/a&gt;We have 35 x Asty's (Asty is just another fat lizard monster, with 800 verts and 1200 poly count. The original dancing lizard was 300 verts with 400 polys.).&lt;br /&gt;&lt;br /&gt;The crazy note is, this is a 10% CPU / 35 fully animated characters, including cell shading, deformers, AND whatever else the hell I want to do. This is plenty of performance.&lt;br /&gt;However, if you actually look at this ugly screenshot, you'll notice the statistics in the upper left seem to contradict me; be patient, the IFPS is what is important (~16) which are how many inter-frames there are (1 ms) between render frames. Since all my apps are capped to exactly 50 FPS internal, thi
