I Haven't had as near as much time as I thought I would, which is not even close to the amount of time I wish I had, but I have got a few small victories here and there. My animation editor is coming along nice, the bones are working peachy, though I've yet to add a mesh to the skeleton. The interface is also quite clunky atm, and I was really getting tired of playing around with it for the time being.
So I stopped, and moved on to another project, adding texture splatting to my terrain editor(4 textures, 1 splat map) and am quite happy with the results so far.
I keep making these tools to help learn new techniques. Nudging and tweaking my framework making it a little cleaner and more productive each time. The big issue I have with this is that I've yet to toss everything into a single .exe and see what comes out of it. One day, hopefully sooner than later we shall see.
In the mean time, does anyone have any good book recommendations/links on tool/app development?
Busy as a jazz solo again this week. But as of yesterday, I am officially finished the academic year, and can spend a bit more time working on personal projects. I worked in small spurts on lots of things, optimizing some math functions, cleaning up some source files, a bit of win32 ui work, etc. Nothing major to report, but I remembered a picture this time.
Well, it was a slow week. Actually a frantic one, without a lot of free time to work with. Coupled with a camping trip to the beautiful Jasper National Park, I didn't get much of anything accomplished. Which is fine, because I think Gaiiden is missing this journal on purpose ()
I worked a bit on getting skinned animations up and running, and since I only got part way before the crash of '14, it is still quite a new topic for me. So far it's just a quaint viewer, but I have the bone orientations showing up from my DIY skeleton/animation format. Before I was able to get to the hierarchy in motion, I had to beef up my math library a bit, adding missing functions for quat->matrix conversions and viceversa, which went alright.
Next up was Euler, or should I say, Tait-Bryan angles. I had never heard the second term used before, but after some browsing through wikipedia, and trying to find out where the code I was working from went astray, I was set straight. For the curious, and uninformed like me, Tait-Bryan angles are the traditional yaw,pitch,and roll rotations typically referred to as Euler angles. According to wiki, Euler angles actually rotate around the same axis twice, once as a first rotation, and again as the third. Coupled with the difference between intrinsic(relative to the local space) and extrinsic(relative to a fixed system) there are a lot of options with which one be confused between. Such was my dilemma, as the neat code snippet I had found was not working with Tait-Byran angles at all, which I now understood, but was using x-z-x intrinsic Euler angles. So after some fussing around with +/- operators and straining my eyes at all the possible permutations of c s y p r, I finally had the one I was looking for. And now I have all the needed functionality to move one.
Looking ahead, I will likely continue on the path of animation in the next week, or perhaps finally get dirty with some sse/sse2 optimizations, which would be another first. Then again, seeing all that beautiful scenery got me thinking about terrain again, so there's that too.. lots to do so, until next time.
[EDIT] : I gave Gaiiden a hard time, but some of the blame rests on me. I guess it would help if I PUBLISH the journal, rather than just save as a draft. WHOOPs!
It's been a slow slog this week. I'm currently landscaping the back yard in preparation for Mother's day, which is when the wife traditionally starts her garden. Bricklaying is hard work, but it's nice using the mathematical means I have acquired through game dev to ensure my bricks run straight and true(for the most part). As a result, I've not had alot of time for programming, and am quickly approaching the deadline laid down by the woman in charge. She is stressed, and that is not good for anyone.
Now, myself, I tend to handle stress alright. Pile it on, and it may get under my skin, but I manage. My significant other on the other hand, does not fare so well. I don't want to say anything that would upset her, so I'll stop there.
I bring this up because I think It's important to recognize stress, and deal with it in a healthy way. I was quite stressed out while working with MRT's in DX9 for the first time this past week. No matter what I tried, I couldn't get anything drawn on my main view window, and I was at my wits end. I decided to take a break, and after a 2 day hiatus, I realized that the RT layouts were not bound in the same registers that the pixel shader was expecting. With that out of the way, and a bit of mixin' code to draw the light sources, I ended up with this, and am excited to see how far I will go until I need to break away again.
I spent quite a bit of time this past week with GD user Cozzie, who was having issues understanding the logic behind OBB plane collisions. It's always a great sense of accomplishment when I can help others to understand something that seems a mystery to them. In the real world I'm a tradesperson, and have been teaching apprentices at a post secondary institute for the past 6 years. In retrospect, trading a higher paying job in the field for more time for myself and family was one of the best decisions I ever made, because I get to experience this fervor on a regular basis. I think my instructor at the time, and my coworker now, could see that spark in me. I'm sure he knew that I would both enjoy a career in teaching, and also excel at it, that fateful night when I received an offer to interview for the position via email.
Some days are better than others, however. The same can be said about certain classes, and even individual students. On occasion I have students who have experienced much more of the trade than I have, be it from the choice of employer, or time in the trade, and I can get caught up with feelings of inadequacy. I'm sure many of the GD members can relate, seeing other peoples projects advance quickly, perhaps being greenlight on steam( Congrats again Riuthamus), while we toil through our own work in what seems like a exercise in futility.
That being said, we'll never catch up if we don't try, amirite? So after helping Cozzie, I brushed the dust of my math lib, and deduced that It still has some work to be done, both to regain some the functionality lost in the crash, as well as add some more functionality that I previously neglected. (I also have some functions that would be much more useful if they were implemented in a different way.)
One of these neglected functions was Perlin noise. I had implemented 1d noise before just to understand the theory, but more useful to me currently are the 2d and 3d varieties. Removing the free function noise(x), and moving to a class based implementation went swimmingly, though I may revert back to free functions at some point in time. It's always a decision I struggle with, and anytime I decide one way or the other, I'm again left wondering if my choice was the correct one... oh well, here are the results.
I keep telling myself that this will be a weekly journal, but of course I am slightly behind schedule. and it seems more and more this is the position i find myself in when it comes to programming. So much to do and so little time.
I have made quite a bit of progress on things, but am working on many projects at once, so each is well, slightly behind schedule. I know I should stop and focus on just one, but variety is the spice of life, and it's doing wonders for my code base, poking holes and exposing weaknesses. It's also doing a lot for my own coding habits, as bouncing from project to project makes it hard to remember what i'm doing. So all my new work is getting nicely documented as I go, and I'm getting quite proficient at rereading my own old code and sussing it out quickly.
That being said, I am still not great at understanding others code. Take for example what I have been working with lately. One of the features of the project in the Image is determining draft based on displacement and hull form. The hull is a triangle mesh, and I can assign a displacement, though eventually this will be calculated from a structural drawing. I take the displacement, and starting with the entire hull, calculate the volume of the mesh(closed, but not necessarily convex) and then the mass of seawater that volume would hold(1.035g/cm[sup]3[/sup] for the curious). this is checked against the given displacement. if it is more than the displacement we step out, cut dy in half, and try again. if it is less, then it and the dy are accumulated until we are within either the draft tolerance or the displacement tolerance. It is working quite well ,as the text in the pictures show. The shader is not getting fed the correct draft to shade with, hence the cube doesn't look like it should. I'm going to fix that soon I'm just slightly behind schedule in regards to that.
The code for clipping against the plane was based on this paper by Dave Eberly. Reading though it now, the capping of clipped meshes appears to be incorrect, as the plane normal would be opposite of the normal of the close face if the mesh is in the positive space of the plane. after flipping a couple of -/+signs around, and rewriting it to use std::vector and my math library, I have it working but it *reads* wrong to me. for instance, the plane convention of ax+by+cz+d doesn't work because the plane is backwards from what was written in the article. I'm sure with enough coffee and scratch paper i could figure it out, but I'm slightly behind schedule as it is...
PS: if anyone cares to read that paper and tell me what is going on with the plane and close face feel free to reply or PM me
Well, I have made back most of what i have lost, although I'm not 100% sure I like what I have, it is working for the most part. I started working on a deferred rendering demo, but since I had never used textures as render targets, I have a bit of infrastructure to build up. Juggling resources between 2 levels(soon to be 3) of direct x, as well as OGL, is a huge pita. If anyone has tips feel free to comment.
I've also been working on a test level in blender, that will be a larger platform to display the techniques I've been working on, Including shadow maps, mirrors, deferred shading, as well as test physics interaction. I should have more on this in the coming weeks.
Over the weekend I spent quite a bit of time converting a project previously using GDI to use my framework, and while It fails in someways to my previous version(which was lost in the memory stick incident) I'm optimistic about some new ideas I had for it. One thing that currently has me buggered is wireframe drawing. I've cleared the depth after drawing the mesh solid, because I was having Z fighting with some of the lines, but I think I need to adjust depth bias instead, as clearing the buffer results in pixels that should be occluded being drawn(front facing sections of concave areas of the hull)
Well, still working away at the rebuild. And speaking of rebuilds, my poor truck gave up the ghost. A faulty seal caused my transmission to bleed dry, albeit with little indication of a problem until it was too late. 3800$ later and I have a rebuilt transmission and new clutch and the beast is back on the roads.
The hit on the finances is doubly strong, as I still haven't been paid for some extra work I did 5 weeks ago, and only learned today that my employer has restructured the special payment system, so I have to reapply to get paid, which will likely take another 2-4 weeks.
"Be patient, you'll get your money!" I was told. I wonder how many of our suppliers allow net 63 payment terms. I guess they can find someone else to spend 8 weeks of their life in a hotel next time.
Currently working on multiple swapchains. I had everything working the way I wanted to before, what am I doing wrong this time? windows not clearing to proper colors, present not failing but not drawing, blah! piss on it for now.
Just to keep form, I'll include a picture of something that is working again, my normal mapping demo.
It's definitely a Monday. I'm tired, and there is not enough coffee in the world to fix that...
I spent most of the weekend reimplementing functionality that I had had working previously before my lapse in judgement cost me 6 months of work. It seems odd to me now how reliant we are on digital suitcases that can carry much more then a typical jumbo jet. And how much the lose of this intangible stuff leaves it's scar on our consciousness much the same as if I had had a loved on on the aforementioned jet.
Yet all is not unwell. What took me about 2 months previously ( Fixing old tests that had been broken by more recent updates to my code base) has only taken the span of a week. 8:1 time compression, how's that for efficiency? It points in favor of reiteration, which is a good lesson for everyone.
We should take a cue from nature. Nature doesn't strive for one perfect organism. It works towards multitudes, and so should we. We should not try to write perfect code, but lots of code. A plethora of programs, all refining their predecessor's DNA becoming more streamlined for the task at hand.
With that in mind, here is a screen of one of the first 3d programs I had ever made, and the first to be resurrected from the past.
Well after a massive oversight by me, and a short lived usb stick by ____________, It seems I've lost my previous 6 months work or so. I should be quite devastated, but in reality most of that time was spent mucking around and not getting too much work done. The downside of course is that any improvements I have made are lost, and i am stuck trying to remake them with a code base that is somewhat unfamiliar to me.
I'm not dead, though it would be hard to believe if you had been waiting for an update(hah). Life seems to find a way to fill up my time more than I would wish, although I'm sure the alternative would be worse . Long story short, 2 vehicles died, 1 has been resurrected. My easy job as a trade instructor is done for another year and it's back to long days on a roof. But with the money I make I should not complain. I had a student who runs a business and was desperate for some depth in his ranks, so I've agreed to work there for the summer, to the tune of 35/hour to help get his company and crews organized.
On the code side of things, I've been busy busy. I was sucked up into curling fever during the tourney of hearts, the brier, and the worlds, and have resigned myself to making a curling game to push myself along this journey. It's coming along, but without a laptop at arms reach and 4 spare hours a day, progress is comparable to the flow of molasses in February.
I've got the sheet and rocks modeled, and with a few tweaks they will be good to go. My current focus now is pairing down the code from the demo, moving what I can into the engine proper. Since I've never really talked about how it is all structured I'll lay down a brief synopsis:
The engine core is divided amongst several libs so that parts maybe interchanged, or used in other projects without a large string of dependencies.
Capacitance: One of the most stable projects I have right now is my Math library, consisting of vectors, matrices, and some computational geometry functions. All of it is based off of a Real number class, which allows a float, or a double version of the lib to be built. I remember EvilSteve telling me that this was a terrible idea, though I've never really had an issue with it yet. At some point I'd like to use templates for this but am still a bit shy of templated code.
Luminance: I've spent more time playing with lighting and shading then I care to admit, and I've ended up with an OK graphics library out of it. It's lacking in MANY areas, such as animation, but has so far allowed me to put stuff to screen as I like so I'm ok with it.
Resonance: My first attempt at any audio resulted in a likely naive attempt at recreating the equipment that I'd use in my studio. A mixer class, which handles a pool of tracks, buses, and mastering, can be setup for 5.1/stereo/mono. Currently no effects, or 3d audio but it's will be easy to add IMO. Along with the mixer a sampler class, which allows .wavs to be loaded and stored in banks. In reality I think I've recreated a shitty version of Xact from XAudio2, but I was another great learning opportunity.
Naturance: This has got the most benefit so far from the curling tangent I'm on. Classes for point masses, rigid bodies, soft bodies, and fluids for 2 and 3d, as well as euler, verlet, rk2 and rk4 integrators. I've only implemented the rigid3 class and a simple euler so far, but the architecture is clean and it will be easy to add the rest as it's needed. Though easy is perhaps not a good adjective.These are used by the Origin engine which acts as the nerve center of the system. It currently has a very immediate mode feel to it, which means every demo i've produced has a ton of code repeated through it to handle communication from the project to the engine and subsystems. My current focus is to move to an entity system, hopefully allowing the sub systems to do a little more of their own work and free up some white space in the demo projects.
So I'm still kicking, any comments are appreciated, especially ideas on who actually owns position/transform data, or the physics of curl on a curling stone.
After a bout with salmonella, I've regained my health and went back to work, debugging the normal mapping code I was working on previously and banging my head against a wall in frustration. It seemed like no matter what I did, I could not get per pixel lighting to work on all faces. After realizeing it was only the floor/ceiling i was having issues I tracked down the problem. Long story short, it was the old Garbage in = garbage out equation at work, and after realizing that I am quite happy with the results. I'm now at the point of integrating the various techniques I've worked on over the past few months into my current engine.
Well, GD, I must say I am impressed. The new layout is pretty slick, and I'm digging the GDNet Black theme.
I've always thought about blogging before, and keep a private dev journal of my own anyway. It is composed of random musings about what I've done and what I'd like to work on, a kind of checklist to keep me focused on tasks instead of staring idly at my IDE. With New Year's still fresh in my head, and the changes to GD, I find it is time to make some changes myself. With any luck, this blog is just the first of many.
I first got into programming long ago, and when I say long, I mean QBasic on a 286. I had strolled through the isles of the library, picking up anything I could find about programming, specifically games, but it was really a black art at the time. Sure I could write goto statements here and there, but never really "got it". This theme continued while i moved to pascal, with Borland's fancy colored IDE. I was exposed to loops, structures, and a slew of other fundamentals. I read everything I could find on FIDONET. BSP trees, Mode 13h, 3D... You name it, I read it. But alas, I still didn't "get it".
I moved to c, then c++(though it was still 'c' I was writing). I started making small console programs, but still had no idea about the alchemy that was game programming. I read the forgers win32 tutorials and got some experience with windows. I studied transforms, coordinate spaces, Lambert and Phong, And even joined GD( and I think my Alias at the time, Cerian, still exists). I should point out that I've always been considered quite smart, a MENSA candidate, I've since learned. But still I didn't get it. I fully and completely gave up. Moved on.
I got outside more, enjoyed the sun. Grew up. I love to hike, camp, be in the woods. But even 30 miles away from the nearest highway, I felt the call. I began working on web stuff in my spare time. Moving quickly from HTML to HTML/CSS, and then onto serverside scripting. I leared enough about PHP/SQL to get myself into trouble. I even successfully created a decent site with user log-ins, a home brewed forum, and local messaging. It was hard, but I kept seeing progress, and kept at it for a long time. I read an article about creating .bmp files on the fly with PHP and GDI. I could draw lines, polygons to my hearts content.
I found all my old notes, and wrote a matrix class, and finally "got" how they are multiplied. Being able to code without worrying about having a working .exe was great. I finally realized something... it started making sense. I started to get it. I made a triangle in object space. The idea of Left vs Right handed coordinates started to sink in, as I watched my triangle rotating the wrong way. I rotated X, Y, and Z. I saw gimbal lock. I made a "camera" and moved from world to view space. I learned once more about projection, and did it. I had a working, rasterized 3d program. I rejoined gamedev(and could not remember the pass/email I had used before), and dove into direct x. It was hard, but I got it. A triangle, in win32. Then a quad, A cube. I read books. I still couldn't get other people's code to compile(mostly due to outdated books), but I could see what was going on, and could even implement some of it myself. Reflection... Shadow Volumes... Normal mapping( a work in progress) In the past year and a half I've moved from greenhorn to novice. I find I post more answers then questions now. I still don't understand everything. But, I've learned It takes time, An honest love of what you do, persistence and tenacity. I get it now.