Tuesday, November 30, 2010

Website is up

Alright! The website at www.renalicious.com is live again! I'll be updating it with what I can over the holidays :) It's been busy busy working on Captain America, but I hope to be able to post some of my recent work if I can.

Monday, November 29, 2010

New server, v4.0

After many months I finally have a new server for my website. It is up and running, and will be accessible through www.renalicious.com as soon as the DNS serves catch up with the changes :)

More to come, stay tuned!

Sunday, September 12, 2010

Survival horror in STALKER

Ok so I just had the coolest zombie survival horror style moments in Stalker Call Of Prypiat! Here is a picture to go along with it, taken during the actual gameplay (during a lightning strike, otherwise it was almost pitch dark) :)

It was a dark and stormy night (seriously, it was raining cats and dogs, and the lightning was going nuts!) and after being side tracked into a tower to escape an emission blowout, I continues towards the cement factory. The blowout had lit up the sky like a bright full moon, so I ventured forth, hoping there weren't too many zombified stalkers around; those who didn't make it to a shelter before the emissions destroyed their minds.

Leaving the tower I set out on foot to the east along the road, and immediately spotted a couple of zombies shambling towards my destination. Armed with my newly acquired, and upgraded, semi automatic rifle they were swiftly dispatched with a few well aimed head shots. Easy as pie!

About 15 seconds into my journey the emissions blowout died down into silence taking with it all remaining light. It was then that I realized I was in unfamiliar territory, dead of night and in a heavy rain storm. Still, as long as no pseudo dogs were around I should be fine. I pointed my compass at the cement factory and stalked closer to my goal.

The towers of the factory were dim, barely distinguishable in the storm. It wasn't until the lightning flashed that I got a sense of what I was looking at; old rusted metal structures around decaying concrete buildings. "Beep!" went off my compass alerting me to the presence of other dwellers in the area. One... two, then three, but they didn't show up on the radar, meaning they had to be hostile. Were they bandits or mercs? I couldn't tell.

Crouching down in the wet underbrush and grass I turned off my flashlight and scanned the buildings from afar, hoping to see any signs of life. After a few moments of peering through the darkness aided on occasion by the lightning, I spotted my targets high above on a steel tower, stumbling around... zombies!

As I attempted to get closer I saw a figure through the darkness at the bottom of the stairs, leading up to the tower and the two zombies. "Ah hah!" I thought, the third one is already on the ground, and moving out of cover.

I repositioned myself to get a better shot, and moved out of the thick bushes into the open and peered though my scope. The sad creature stumbled off of the staircase and proceeded shambling forward. In the darkness I could barely make out its figure and position, but through the lightning flashes it was an ominous back lit silhouette moving ever closer in my direction. I bided my time and took aim, waiting patiently for the next strike of lightning, the next crash of thunder. Bang Bang! A couple of shots crackled through the night, only to be drowned out by the thunder in the sky.

No more movement did I see in my scope, confirmed by the compass, I had eliminated one threat. I now set my sights on the two remaining zombies up on the tower.

There they were, unmoved by the commotion below, unaware that their former comrade had just received a sudden brain enema. Not that they could know since the emissions from the blowout fried their minds like an egg.

Bang Bang! A couple more shots rang out into the darkness, but this time luck was on their side. While the shots hit their mark, the zombies were still able to function, and function well enough to know I was down there. They proceeded to hunt me down.

“Hmm, not big deal” I thought to myself “They might have the higher ground, but I doubt they know how to use it”. Requiring a more direct firing position I proceeded forwards towards the complex, closer to the base of the stairs.

As I approached one of the buildings something stirred. Screeeeech! A high pitched voice screamed out from the entrance of one of the concrete towers. Quickly I spun around and turned on my flashlight to see what I had startled.

The figure I saw was small, stringy and twisted; scurrying into a hole as it hissed. “Rats!” I thought, “I better watch my back, no telling when they’ll try to swarm me” With zombies descending from the tower I needed to be extra careful not to get torn to shreds.

A few moments had passed and the zombies were in low enough for me to take a few shots. Nothing too difficult here, their own shots at me managed to wound them allowing me to take them out a ways up. I stood for a few more moments and scanned the area, all clear, and the compass confirmed it.

The storm was still in full swing, unyielding in the night. The constant flashes of lighting illuminating the bleak landscape below me as I stood on the steel tower. The rain was never ending, as though the clouds were attempting to wash away all traces of what had happened to this land. Beep, Beep, Beep chirped the compass. “What’s this?” I said to myself as I looked around, a cluster of red dots had appeared; interlopers approaching from the road.

The lightning flashed again and again, as though begging me to take notice of those who come near. At last I see them, more shadowy figures slowly moving towards the cement factory. This time I had the high ground, and I did know h0w to use it!

Bang! One by one the shots rang out, Bang Bang Bang! One after another, and one by one in the darkness they fell unaware, unknowing, uncaring. One by one the numbers died down to zero. A moment’s repose to rest once again in the darkness, in the rain. But wait, something not right anymore.

The unrelenting storm which had offered me flashes of light to see my way was now bringing its anger upon this land. The air began to taste foul, bringing a metallic taste into my mouth. My eyes began to sting, my skin began to burn and itch. No, this wasn’t just rain anymore, this was chemical fallout!

I had to find shelter and fast! Holstering my riffle I began searching the structure on top of the tower hoping for an entrance or an opening I could sneak into. The south side, nothing. The east side, nothing. The north side, nothing! “I have to get into the factory and find a shelter before the chemicals burn me inside out!” I panicked as I sprinted towards the stair case, hoping I could get down in time.

The air was getting thicker with each passing second. The taste, the smell, the burn! It was becoming almost too much! But at last I had made it off the tower. Not breaking my stride I ran towards an opening in factory building, but the chemicals were still two strong! I needed to get deeper.

Frantically looking around for a safe haven I noticed a set of rusty stairs to my left, leading down deeper into the building, but mercifully away from the outside. Clunk clunk clunk clunk boof, echoed my boots on solid ground again as I careened into a tunnel.

I made it! The air was still foul but at least it was breathable enough to let me take shelter until the fallout passes. Suddenly…

Screeeeeech! “Oh no!” I though “If it’s this close, that means…” the rat is back, and it brought it’s pack with it!

Not wasting any time I fumbled for my gun as the sickly mutant rodents scurried towards me. I’m backed into a corner, but at least they only have one way to come at me now.

Bang bang! Flashes of light and thunderous noises started filling the tunnels. Bang bang! The bullets tore through the malicious creatures effortlessly, but they kept on coming. Bang bang! My clip was starting to run low. Bang! The last shot fired, the last rat dropped to the ground, motionless. My ears ringing, my heart pounding.

Outside the lighting continued to flash its might. Thunder continued booming across the land. The air was foul and thick, but in my little corner deep in the tunnel I was still alive and that’s what mattered.

“Whew” I sighed “Times like these I wonder why I ever came here”. Cold and wet I popped in a fresh clip. Beep, Beep, Beep went the compass. Not a moment too soon.

All of this took a minute or two in game time, but man, it was awesome! :D

Until next time!

Thursday, August 12, 2010

Path deform transfer

Here is a quick script that will transfer animation from an object using the path deform modifier, to an object using the Path Follow positional constraint.

timeCounter = 0
maxTime = 380 --End of animation

---
for int = 0 to maxTime do
(
sliderTime = timeCounter
$TargetObj.pos.controller.percent = $SourceObj.modifiers[#PathDeform].Percent_along_path

timeCounter = timeCounter + 1
)

---
The script is a bit raw and requires the objects to be named "TargetObj" and "SourceObj", as well as all necessary modifiers put in place, but it works :)

Thursday, June 24, 2010

Props, dynamic objects, and radifications

Been a while since I posted anything, but there is a good reason! Over the past few months I've been working at Next Level Games on "A project" as a prop artist, or technical prop artist. So far it's been an interesting venture and I've really been able to get in touch with my art side, making both low and high poly objects, then integrating them into the game.

Obviously I can't mention anything about this project, yet... No art styles, settings, time periods, etc. sorry ;) But I can talk about the props objectively, and some of the various tools I've been thinking about writing to help me out.

One thing I've noticed that I can't do is animate an object using modifiers, such as using path deform, with object space or world space. At least make an animation that will transfer to the game. The motion path constraint does work, but I can't change the type of key framing, so all motion is linear from one key frame to the next.

While this works, it's no ideal. So I've started thinking about a script that will look at the percentage-along-path of the modifier Path Deform, and apply it the object with the path constraint motion every frame. In this case there really will be a need to brute force my way through.

While something like this would definitely work for one object, it becomes more difficult to apply the same motion to objects ahead and behind the target, which are suppose to share the same animations. An example would be a roll up door, or a tank tread where each segment is a unique object.

In this case I think I may just settle for manual tuning of values, and once I find the appropriate offset it becomes a simple case of multiplying the offset for each object.

Quick, easy, simple :) Now I just need to find some time to write this ;)

Tuesday, February 16, 2010

3D textures and Voxels part 2

After much delay I finally sat down and wrote the 3D texture generator maxscript. Surprisingly it went faster than anticipated, and after about a day I had something that generator usable results.

The basic premise behind generating 3D textures from geometry in 3dsmax is similar to how a CT scan generates images from real world object: a bunch of slices. Luckily 3dsmax has the ability to boolean objects with planes, and although the materials aren't necessary accurate it is possible to set the scene up in such a way that a flat plane can be booleaned with all relevant geometry to create the depth portion of the 3d texture.

The script goes as follows:
  1. Check the extents of all selected objects. This is to calculate how far the slicer needs to move in total and between each iteration. Additionally, the size slice plane can be made to match the objects as well.
  2. Make all original objects not visible to the camera
  3. Start slice loop
  4. Find any objects that intersect the slice plane and make a copy of them. Make these copies visible to the camera.
  5. Create a slice plane object at Z
  6. Boolean (intersection method) all copies of objects
  7. Render the results
  8. Delete all sliced objects and slice plane as well
  9. Move to next iteration
  10. End of slice loop
  11. Make all original objects visible to the camera.
It's as simple as that :) And the nice thing is I figured out how to test the bounding box much more efficiently in this new script. This change can be propagated back to the older scripts that need it, like the convex mesh creator.

The biggest draw back of booleans in 3dsmax is that any UVW coordinates essentially get destroyed. So any object that is fully textured will not end up looking as it should. At the moment there doesn't appear to be a catch-all-quick-fix for this problem, at least not that I've seen. It's definitely worth looking into as it would be a shame to have such a handy script that can only be used with untextured geometry.

As further exercise for myself I'm writing a c++ console app that will take the existing Z axis 3d texture and resave it in another axis :) While it may not be the most useful tool seeing as renderers may not necessary care how a 3d texture is laid out, I'm learning lots about dynamic arrays and pointers.

What's inside this cheap barrel??

Lets find out!

Sunday, January 31, 2010

Moving part2

Looks like my server died in the move, or something else went wrong. But I have it running on laptop for now until I can find a more permanent solution. Yay for backups ;)

Wednesday, January 27, 2010

Moving....

For anyone trying to access my website in the upcoming week, please be aware that I'm in the process of yet another move. So it'll take a few days for Shaw to get everything setup, and the all the DNS tables to update with my new IP, etc.

Thanks for tuning in :)!

Wednesday, January 20, 2010

3D textures and Voxels

One of the more interesting elements of CG are 3d textures, volume textures, or voxels. Outside of medicine, geological studies, and terrain, are there any practical uses for 3d textures? Some games have attempted to use them, particularly the more modern BUILD engines by 3D Realms (And by modern I'm talking about Shadow Warrior, etc :) hehe) for primative 3d objects such as keys and wall switches. While it certainly looked cool at the time, with the advent of 3D models I think using 3d textures for objects fell away pretty quickly.

So to what end can the gaming industry use 3D textures? One significant use is lighting, as demonstrated in Unreal 3 / 3.5 with lighting importance volumes. This volume defines a 3D array of points that help light dynamic objects and characters in open spaces. So where a shadow would be cast from a far away object will still affect the object without the need to cast an enormous shadow map. Definite bonuses here.

Cryengine 3 also has a novel use of 3d textures in the form of in editor concave terrain formation. The editor gives the designers and artists the ability to create terrain formations via painting, similar to z-brush. The benefits are immediately evident in that there is no need to go back and forth between the editor, and 3dsmax to create / test / iterate concave terrain geometry.

So beyond these two major implementations, what other uses could there be? Basically the single biggest use of volume texture is the ability for us to see INSIDE of an object, hence its benefits for medicine and science. A couple of novel ideas spring to mind.
1) x-ray vision without sorting issues
2) thermal vision that doesn't rely on polygon viewing angles for colouring
3) Nifty construction or deconstruction effect. Think TRON :)
4) Nifty teleportation effect, kind of like TRON

Of course these could be considered gimmicks because would people playing Splinter Cell really care if the thermal vision was more accurate or not? And what about x-ray, if in Metroid Prime everything x-ray-able was built from 3D textures would people really know the difference? Maybe, maybe not, but aren't games built on gimmicks and trying new things?

Naturally for best performance these things would need to be controlled to avoid potentially serious performance issues.
1) x-ray visor where only objects within a limited field of view and distance are actually x-rayed and displayed as 3D textures.
2) With thermal vision, smaller cylindrical and ellipsoid 3D textures bound to major body parts create the illusion of animation.
3) A 3D object is posed then "digitized" into a lower resolution alanogue, then pixel by pixel removed from the world.
4) Similar to point #3, but quicker and in reverse.

In part 2, I will detail some ideas I have about creating 3D textures from modern 3D models.

Sunday, January 10, 2010

Shaders

In the past week or so I've been playing around with HLSL and learning about shaders, DX10 / shader model 4. What I'm noticing, apart from the fact that the syntax is different, is that shaders are much more complex than I originally anticipated. I thought "Oh gee, I'll just do this and that and presto!" but nope! What is in fact the case is that unless the engine has a very well written, and almost intelligent renderer, there is quite a lot of communication that needs to happen explicitly between the render code and the shader.

It came as a surprise to me because the change I made to the shader which should have worked fine, they weren't making any difference what so ever. Upon talking with the person who wrote it he explained what I need to do in order for the shader to work like I intend it to.

The simple answer is that I wasn't actually doing anything with the pixels I was altering. They were using up GPU cycles and simply being discarded because I wasn't writing them to a render target. So the final pass, which was reading the same frame buffer was the only pass that was displaying any changes... being the final pass and all. That and the fact that I wasn't even calling my passes had something to do with it as well ;)

All in all I'm still hard at work updating this shader with some simple bloom, but it's so interesting! I know I'll have it figured out sooner or later. And then I'll actually PLAY deus ex again. After all, that's why I installed it again in the first place after all this time.

Yet, what a strange coincidence that I found this DX10 renderer because I thought the old renderer was causing the game to crash. And this new renderer happen to use shaders, something I've been wanting to learn for some time now. Funny how life turns out sometimes :)

Wednesday, January 6, 2010

Technical artist's 2009 review

2009, hmm, what a year! Instead on focusing on all the bad things that have happened, I would like to take a moment and comment on all the great things that were accomplished, and lessons learned.

From the day that 2009 started I knew I had a long road ahead of me, although I wasn't prepared for quite how long the road would become. Since I suddenly had more free time on my hands than I knew what to do with I decided to fill it with learning and self improvement to make myself all the better candidate for when I would eventually return to the industry of choice and continue my career.

Starting off with what I knew best, I threw myself at my then nonexistent portfolio to at least show the world that, yes, as a technical artist I could in fact make art. And the more I worked on it the better I got. Of course it was sometimes hard to find the motivation to work on something that I had very little direction on, but I forced myself to overcome that one polygon at a time. While some of the earlier efforts may not exactly be the most stellar looking, I do like the originality of the content, and sometimes that's what matters most.

As the months went by and I was talking to some of my friends in the industry, I began to learn more and more about what it is to be a technical artist. Sure I could do art, but what about all the other technical aspects OTHER than art integration and problem solving? Could I write an animation exporter for 3dsmax or other tools to speed up production? Did I know enough programming to potentially pass as a junior programmer? Time to switch gears!

I remembered that many years ago I was introduced to Python as the tool for rapid prototyping and development of tools, but I never really looked into it very much because I was more focused on art and learning technology. But since I didn't have new technology to learn, I decided to take my C++ knowledge and apply it to other engines.

"Wow" is what I tell people, "Why didn't I pick up python earlier?" Seriously, why didn't I? It's great! After a few trial runs porting over some of my old console applications I was amazed at how much quicker and simpler the development process went. And what about C#? That too I never gave much thought because it "Wasn't c++", heh well, that too went out the window.

These two languages really are perfect for technical artists because they don't require innate knowledge of the deepest inner workings of C++, and because these languages are almost higher level than c++ as well. With so much functionality that happens behind the scenes it becomes easier for a non programmer to jump in and get things up and running quickly. And as for the speed, well, unless there is something critically important that needs to happen to thousands of files ever couple of hours, there really isn't any need to make simple tools and scripts run as though they were assembly optimized.

Now that I had a handle on some of the popular languages out there, what about making something for the tools that artists use? Programs like 3dsmax. Once again I toyed around with max scripts a few years back but never to any great extent, but the time had come to learn it and make something usable by artists all over the world. Enter "Ren Tools".

From simple beginnings of the gear creator, to my proudest achievement yet: the Convex Mesh Generator. For many years having worked on games with physics I had wanted a tool that would create a convex mesh for my physics chunks. Of course the options were almost non existent save for John Radtcliff's old plugin. Working a temporary contract back at Threewave I decided that a new solution needed to be made, and having developed a couple of scripts for my tool set in the previous months, I tacked my greatest challenge yet.

I ended up spending at least a week writing this script and learning more about max script and 3d math on the fly.The end result was something that worked the way I wanted it to, and other artists all round the world could use as well. Just install the script, select some chunks, and voila! At the push of a button each object has it's very own convex collision mesh, properly named and all :)

With so many programming languages in my head now, I decided to focus a bit on the art again, especially with the release of the Unreal Development Kit. Packed with many great new features I took my antenna scene and started importing it in to get familiar with a state of the art engine. It was a very nice change of pace to go back to pushing polygons around. Having learned the ins and outs of the engine just weeks earlier in the temporary contract, I thought what better way to put the knowledge to the test than to make my own scene again. Slowly I will be adding to it over the coming months to keep my art skills sharp.

As the year came to a close, I was once again wanting to learn something new, so I picked up XNA and had a go. "Neat!" C# makes game development easy! Within a couple of weeks I was already controlling my own creation around the screen and realizing a 5 year old dream of making a proof of concept the game I had been pitching around.

Again, for a technical artist XNA and C# are a great resource because of how quickly we are able to prototype and get things off the ground. Sure I spent quite a while learning and rewriting parts of the game as I was learning the wisdom of how and why games are made. Class inheritance for example, and tiling backgrounds, collision detection, etc. All integral to how games work, and lessons that could be used elsewhere in tools and scripts if need be.

But aside from all the necessary technical and creative skills I've acquired this year, it was also a year of personal growth as well. Working jobs out side of the industry with a lot of human contact and stressful situations are quite useful for learning much needed skills such as customer service, and how to manage people effectively. Skills that are ultimately transferable to the industry for dealing with deadlines, and writing documents that people will need to read, and just keeping an over all positive deportment no matter what the situation. Because hey, it could always be worse!

So now we're in 2010, and what's left to learn? Plenty!! Just recently I've felt the urge to play through Deus Ex again, and wouldn't you know it I came across a direct x 10 renderer that someone wrote. While not interesting in itself, what caught my attention was the fact that the author used fx shaders! Woot! not only have I been wanting to learn HLSL, but what a better way to do it than a new renderer for an old game? The renderer itself is bare bones, so it gives me the perfect platform for adding additional functionality. I'm starting small and simple by adding bloom. But from there, who knows!

With so much under my belt this past year, I know I am a MUCH better person because of all my experiences. I'm not sure how much longer this road of growth is, and there are many personal trials that I'm facing, but I just can't give up and settle for anything less than awesomeness. I need to learn more, do more, and be the best at being diverse. As a technical artist, I need to understand what is going on if I'm gonna be responsible for fixing it. And fix it I will, for myself, for the team, for the company, even for the industry!

They say that luck is when preparation meets opportunity. I'm more prepared now than I've ever been, and I'm looking out for any opportunity coming my way! :D Yay 2010!