I've spent this last weekend in a stand ( booth? ) together with Sergi at the GameStorming event in Barcelona as part of the game creation competition, showing our game to everyone interested. I had much more fun than I expected and met lots of people from other development teams.
I'd like to congratulate the Agedya team on wining the competition. Totally deserved. They've put a lot of effort in this project, and it's very nice that they get some recognition from it. I already had played the game before the event and liked it a lot, but it was great getting to learn how the combat mechanics work... although I died miserably lots of times until I got the hang of it...
And of course I also want to congratulate my good friends at Izanami for wining the prize from the public with their game The End Of The World, for making a great and fun game, and just for being as awesome as they are!
I'm leaving with an image of the poster we made for the event, to maintain my policy of at least a picture per post.
Wednesday, December 10, 2008
Tuesday, November 18, 2008
Zen
Truth be told, I had a very lengthy post about presentations, Powerpoint, and how horrible crammed slides with lots and lots of bullet points are.
But, thinking it through, instead of boring you to death I rather show you some of the slides I made for The Teddy Incident presentation.
Good visuals are the best way to communicate messages, and even the most mundane enumeration ( a list of technologies used for example ) can be made a little bit more entertaining and memorable if you spend more than a minute thinking...
I'll leave you with two inspirational resources on the topic.
Presentation Zen
Art of Innovation ( Presentation by Guy Kawasaki )
But, thinking it through, instead of boring you to death I rather show you some of the slides I made for The Teddy Incident presentation.
Good visuals are the best way to communicate messages, and even the most mundane enumeration ( a list of technologies used for example ) can be made a little bit more entertaining and memorable if you spend more than a minute thinking...
I'll leave you with two inspirational resources on the topic.
Presentation Zen
Art of Innovation ( Presentation by Guy Kawasaki )
Monday, November 10, 2008
Photoshop Madness
A contest is a great time to flex those Photoshop muscles.
I'm taking part in the Crestock Photoshop contest this year again, because last year I had lots of fun and I learned lots of new things about photo manipulation. This year has been no exception, and I feel I'm improving a little.
The idea of the contest is that you're given a number of source stock photographs, and a theme, and you have to use the source images and combine them in original ways to come up with a new image.
The theme for this round is extreme makeover, and the source images can be seen in the contest page.
Here is a link to my entry for this round of the contest.
I'm taking part in the Crestock Photoshop contest this year again, because last year I had lots of fun and I learned lots of new things about photo manipulation. This year has been no exception, and I feel I'm improving a little.
The idea of the contest is that you're given a number of source stock photographs, and a theme, and you have to use the source images and combine them in original ways to come up with a new image.
The theme for this round is extreme makeover, and the source images can be seen in the contest page.
Here is a link to my entry for this round of the contest.
Sunday, October 26, 2008
ArtFutura 2008: Best Art Direction!
Today was the last day of ArtFutura show, and the winners of the videogame development competition were revealed. We are very happy to have been able to go back home having won a prize.
Here is the complete list of winners:
Best technology: Number 6
Best sound: KuKoo Kitchen
Best art direction: The Teddy Incident
Best design: Magical Gloves
Best graphics: Number 6
Most polished (?): Kukoo Kitchen
And finally, the Grand Prize was for Invasion of the Granny Snatchers.
Here is a photograph of the ecstatic Teddy Incident team rejoicing.
Of course, I post the nice team photograph, because to post a photograph in which no one is looking at the camera there's always Sergi around...
Here is the complete list of winners:
Best technology: Number 6
Best sound: KuKoo Kitchen
Best art direction: The Teddy Incident
Best design: Magical Gloves
Best graphics: Number 6
Most polished (?): Kukoo Kitchen
And finally, the Grand Prize was for Invasion of the Granny Snatchers.
Here is a photograph of the ecstatic Teddy Incident team rejoicing.
Of course, I post the nice team photograph, because to post a photograph in which no one is looking at the camera there's always Sergi around...
Thursday, October 23, 2008
ArtFutura 2008
According to this source here we have been chosen as finalists in the ArtFutura 2008 game competition!!
Here is the complete list with the 13 finalists and links to some videos I've been able to find:
2 Ash too Furious
Acheron
Agedya
Chickenball
Farm Games
Invasion of the Granny Snatchers
Kukoo Kitchen
Magical Gloves
Maldoror: la MansiĆ³n de las Siete Torres
Number 6
Sword Fighters
The Squad
The Teddy Incident :)
The final results: Revealed this Sunday.
Congratulations to everyone!
Edit: The official list has been made public, and there are 13 finalists instead of 12. Updated the list.
Edit: Found videos for all games.
Here is the complete list with the 13 finalists and links to some videos I've been able to find:
2 Ash too Furious
Acheron
Agedya
Chickenball
Farm Games
Invasion of the Granny Snatchers
Kukoo Kitchen
Magical Gloves
Maldoror: la MansiĆ³n de las Siete Torres
Number 6
Sword Fighters
The Squad
The Teddy Incident :)
The final results: Revealed this Sunday.
Congratulations to everyone!
Edit: The official list has been made public, and there are 13 finalists instead of 12. Updated the list.
Edit: Found videos for all games.
Sunday, October 19, 2008
Bottled Water..?
It's the same video that was shown on The Teddy Incident presentation, so it's very short as I didn't want to devote much time to talk about the animation system. The presentation was about the game after all :)
A higher resolution video can be downloaded by going to the vimeo page.
Thursday, September 25, 2008
Finishing the Master
Yesterday ( actually the 23d ) we finally presented the game we've been working on for the master's.
The room was packed with people ( how many? 100+ for sure ), and the level of all the other projects was also great, so congratulations to everyone who worked hard. Sadly that doesn't mean everyone, as every group can have parasites, but I really don't want to taint my good mood with that.
From the thoughts I gathered after the talk, I think our game had a very good reception. People liked it, they thought it looked fun to play, and that is very important. But don't trust me on this one as I'm clearly biased, go make your own opinion about the game by downloading and playing.
I'll be happy to receive opinions, critics, suggestions... any feedback will be very nice!
I've learnt lots this year. Mostly numerous ways of how NOT to do things. But that's the way to learn.
I must confess that I haven't slept as well as last night for months :)
The room was packed with people ( how many? 100+ for sure ), and the level of all the other projects was also great, so congratulations to everyone who worked hard. Sadly that doesn't mean everyone, as every group can have parasites, but I really don't want to taint my good mood with that.
From the thoughts I gathered after the talk, I think our game had a very good reception. People liked it, they thought it looked fun to play, and that is very important. But don't trust me on this one as I'm clearly biased, go make your own opinion about the game by downloading and playing.
I'll be happy to receive opinions, critics, suggestions... any feedback will be very nice!
I've learnt lots this year. Mostly numerous ways of how NOT to do things. But that's the way to learn.
I must confess that I haven't slept as well as last night for months :)
Thursday, August 28, 2008
In Between Lines of Code
Saturday, August 23, 2008
Harder, Better, Faster, Stronger
Actually none of those, just a little less dumb, but it's a step forward I say.
Enemies are now able to surround the player and impale him at will... the bastards will even start celebrating when they finish you off!
Sometimes it takes a little time for the last enemy to reach that final open spot though, but I think I can improve that.
Enemies are now able to surround the player and impale him at will... the bastards will even start celebrating when they finish you off!
Sometimes it takes a little time for the last enemy to reach that final open spot though, but I think I can improve that.
Friday, August 22, 2008
AI improvements: GO beware!
The evil empire of the teddy incident game ( I'm sorry, the bad guy's faction has no official name yet ) is proud to inform you that enemy IQ is steadily raising among their lines.
Now and again a couple of enemies with lemming complex will appear, and decide they rather wander around and jump off a ledge than patiently patrol their assigned area and wait to be slaughtered by a sociopath kid with an axe. Will have to teach them not to do that!
The ones that don't jump though are quite fun to kill.
Some glitches here and there of course. Mainly when finding obstacles in their way: There's absolutely no pathfinding going on. Might want to address that sometime soon...
Also, when in large numbers they can obstruct each other, but it only affects when many are trying to go to the same place
E.g. When trying to surround a player only the front line of enemies will reach him. The rest will probably get stuck behind the first line.
I'll probably need steering behaviours or something like that. We'll see what I have time to come up with.
All that aside, did I mention that the game is starting to be fun?
Here is a test screenshot of the main character being pursued by a bunch of standard bad guys.
By the way, AI is one of those things I dread the most working on: it's a never-ending stream of little tweaks... and immensely difficult to get juuust right.
And difficult as hell to debug sometimes!
Now and again a couple of enemies with lemming complex will appear, and decide they rather wander around and jump off a ledge than patiently patrol their assigned area and wait to be slaughtered by a sociopath kid with an axe. Will have to teach them not to do that!
The ones that don't jump though are quite fun to kill.
Some glitches here and there of course. Mainly when finding obstacles in their way: There's absolutely no pathfinding going on. Might want to address that sometime soon...
Also, when in large numbers they can obstruct each other, but it only affects when many are trying to go to the same place
E.g. When trying to surround a player only the front line of enemies will reach him. The rest will probably get stuck behind the first line.
I'll probably need steering behaviours or something like that. We'll see what I have time to come up with.
All that aside, did I mention that the game is starting to be fun?
Here is a test screenshot of the main character being pursued by a bunch of standard bad guys.
By the way, AI is one of those things I dread the most working on: it's a never-ending stream of little tweaks... and immensely difficult to get juuust right.
And difficult as hell to debug sometimes!
Saturday, August 16, 2008
Busy Busy Busy
I've been working non stop on the masters game: It's due in less than a month, and that's very little time.
Anyway, I'm really glad that at the start of the project I spent a good amount of effort working on tools.
For example, the animation system is proving invaluable time and time again.
Just for fun, two screens of the editor with the animation trees we are using.
This enemy's animation tree is a very simple one, it just has a parameter to change the current animation.
But that's the beauty of it, you can complicate it as much as you want, that it won't affect much your final application code.
The player animation tree is a little bit more complex, but not all that much.
All the animations of the player are controlled by 5 parameters.
There is a main parameter to control the current animation, while the other parameters are for miscellaneous stuff to breathe life into the character ( e.g. Two parameters control the head orientation ).
By the way... somewhere between concept art and animation the main character lost its brows... eerie!
Anyway, I'm really glad that at the start of the project I spent a good amount of effort working on tools.
For example, the animation system is proving invaluable time and time again.
Just for fun, two screens of the editor with the animation trees we are using.
This enemy's animation tree is a very simple one, it just has a parameter to change the current animation.
But that's the beauty of it, you can complicate it as much as you want, that it won't affect much your final application code.
The player animation tree is a little bit more complex, but not all that much.
All the animations of the player are controlled by 5 parameters.
There is a main parameter to control the current animation, while the other parameters are for miscellaneous stuff to breathe life into the character ( e.g. Two parameters control the head orientation ).
By the way... somewhere between concept art and animation the main character lost its brows... eerie!
Saturday, August 9, 2008
A Necessary Post
I keep visiting this post to remember the XSI script I wrote to discard the W coordinate in explicit UVW texture projections, so here it is.
Now I hope won't have to search for it again in the Ogre forums.
The projection object must be selected for it to work.
I almost forgot: A picture to appease my non technical friends...
Now I hope won't have to search for it again in the Ogre forums.
The projection object must be selected for it to work.
set projection = Selection( 0 )
set objects = projection.parent
TranslateUVW objects, projection, 0, 0, 0, siAbsolute, siW, true
FreezeObj
I almost forgot: A picture to appease my non technical friends...
Wednesday, August 6, 2008
PhotoBot
This is an image I created some time ago for an online photo manipulation contest.
The idea with this type of contests is that you are supplied with some images that you use in any creative way you can come up with to make a new piece of artwork. Lots of fun.
On this page you can see the source images used.
The idea with this type of contests is that you are supplied with some images that you use in any creative way you can come up with to make a new piece of artwork. Lots of fun.
On this page you can see the source images used.
Monday, August 4, 2008
Drawing Lines
Been working on my tools lately. I've added path creation and editing ( add, move and remove points ) capabilities to The Teddy Incident level editor.
It comes from the recent addition of movable platforms to the game. About time some might say, it's a platform game after all...
Using the same path infrastructure, enemies can have an associated path that their AI scripts can use as they see fit.
Being able to visually manipulate path points around is a great time saver.
Here's an image of how it looks in the editor ( Click for a larger image ).
It comes from the recent addition of movable platforms to the game. About time some might say, it's a platform game after all...
Using the same path infrastructure, enemies can have an associated path that their AI scripts can use as they see fit.
Being able to visually manipulate path points around is a great time saver.
Here's an image of how it looks in the editor ( Click for a larger image ).
Monday, July 14, 2008
Look At Me
My first post was about the blend tree animation system and editor I'm working on.
Since then, I haven't talked much about that, as I really haven't had the time to seriously work on it.
It's sad, but at the moment it's just a side project.
Nevertheless, its state is advanced enough that we're using it in our game. It's an improvement on using raw Ogre animation states directly, and has many useful features and potential, but that's my very subjective opinion.
Even if it is yet nowhere near what I envision, it's already easy to fake some IK controllers.
Here is an image of our player character looking at some random point in space.
This is done by mixing one-frame animations of the player looking up, down, left and right with the current animations.
The bulk of the work of setting how the animations blend can be done in the editor by an artist, by setting nodes that tell how the animations blend, and he can preview the end result there. This is in my opinion the true strength of the system.
If anyone is interested in checking it out, here it is, open source and all that.
Sorry that the blend-tree editor is not up there, but I'm hoping on being able to work on it once the master is over ( mid September ). In the meantime, I'll gladly share the binaries with anyone who asks.
Since then, I haven't talked much about that, as I really haven't had the time to seriously work on it.
It's sad, but at the moment it's just a side project.
Nevertheless, its state is advanced enough that we're using it in our game. It's an improvement on using raw Ogre animation states directly, and has many useful features and potential, but that's my very subjective opinion.
Even if it is yet nowhere near what I envision, it's already easy to fake some IK controllers.
Here is an image of our player character looking at some random point in space.
This is done by mixing one-frame animations of the player looking up, down, left and right with the current animations.
The bulk of the work of setting how the animations blend can be done in the editor by an artist, by setting nodes that tell how the animations blend, and he can preview the end result there. This is in my opinion the true strength of the system.
If anyone is interested in checking it out, here it is, open source and all that.
Sorry that the blend-tree editor is not up there, but I'm hoping on being able to work on it once the master is over ( mid September ). In the meantime, I'll gladly share the binaries with anyone who asks.
MaxScript to the Rescue
Here is the Softimage XSI UV editor:
And here is the 3D Studio Max 9 UV editor:
It's just a matter of taste which one you prefer. The artists in my current project use XSI for UVW unwrapping, but I just like the neater user interface in MAX better.
One thing I like very much from the XSI Texture editor and that I haven't been able to find in Max are these fellows here:
They can be used to collapse UV coordinates in the X and Y axis respectively, and not being able to find this feature in Max was haunting me.
So I set out on a journey to my first MaxScript. Here it is, and as dumb as it may seem, I've already found it very useful.
I don't even bother with finding the selection centre, as all I really care about is that they share the same value for the coordinate.
The next step: Add it somewhere in the user interface and rejoice.
And here is the 3D Studio Max 9 UV editor:
It's just a matter of taste which one you prefer. The artists in my current project use XSI for UVW unwrapping, but I just like the neater user interface in MAX better.
One thing I like very much from the XSI Texture editor and that I haven't been able to find in Max are these fellows here:
They can be used to collapse UV coordinates in the X and Y axis respectively, and not being able to find this feature in Max was haunting me.
So I set out on a journey to my first MaxScript. Here it is, and as dumb as it may seem, I've already found it very useful.
MacroScript CollapseX category:"CustomUVW" buttonText:"Collapse X"
(
sel_vert = $.Unwrap_UVW.getSelectedVertices()
sel_vert_array = sel_vert as array
if ( 0 < sel_vert_array.count ) then
(
v1 = sel_vert_array[1]
sel_pos = $.Unwrap_UVW.getVertexPosition 0 v1
$.Unwrap_UVW.moveX sel_pos.x
)
)
MacroScript CollapseY category:"CustomUVW" buttonText:"Collapse Y"
(
sel_vert = $.Unwrap_UVW.getSelectedVertices()
sel_vert_array = sel_vert as array
if ( 0 < sel_vert_array.count ) then
(
v1 = sel_vert_array[1]
sel_pos = $.Unwrap_UVW.getVertexPosition 0 v1
$.Unwrap_UVW.moveY sel_pos.y
)
)
MacroScript CollapseZ category:"CustomUVW" buttonText:"Collapse Z"
(
$.Unwrap_UVW.moveZ 0
)
I don't even bother with finding the selection centre, as all I really care about is that they share the same value for the coordinate.
The next step: Add it somewhere in the user interface and rejoice.
Wednesday, June 25, 2008
Stay a while and listen!
Do yourselves a favour and spend the next 20 minutes of your life watching the gameplay video at the diablo3 website
Now we just have to wait until the game comes out... aaargh!
Now we just have to wait until the game comes out... aaargh!
Tuesday, June 3, 2008
The Update Incident
The past weeks I've been working on a level editor for our game, because it soon became pretty clear that hand editing xml files is too tedious.
There's no way in hell our artists will ever touch a text editor, and it's a good thing, because hand editing levels without any visual feedback would only lead to crappy levels.
Now we have a good enough level editor for our needs. Probably the most difficult part to get right is the transformation gizmos. I believe it's basic that artists are comfortable with the tools, and sometimes the 'it just feels right' sensation is hard to get. A little extra effort in the usability area goes a long way.
And here a WIP shot of our game. Hand-editing this level is what led to the decission to halt development on the game and focus on a level editor for a while.
There's no way in hell our artists will ever touch a text editor, and it's a good thing, because hand editing levels without any visual feedback would only lead to crappy levels.
Now we have a good enough level editor for our needs. Probably the most difficult part to get right is the transformation gizmos. I believe it's basic that artists are comfortable with the tools, and sometimes the 'it just feels right' sensation is hard to get. A little extra effort in the usability area goes a long way.
And here a WIP shot of our game. Hand-editing this level is what led to the decission to halt development on the game and focus on a level editor for a while.
Sunday, March 30, 2008
Kim's Adventure
This is Kim, or his pixelated alter ego at least.
We studied Computer Science together for some time until he had an epiphany and decided to change computers for chicks, and left to pursue a degree in economics.
Since then we haven't seen or heard much from him, but that hasn't stopped his old comrades from working on a game with him as the main character, revolving around his unique way of seeing the world.
It will be a graphic adventure in the traditional Lucasarts style at 320x240! I really miss those games.
Progress is slow, as it's nothing else than a fun little side project, but from time to time we enjoy juggling pixels around and getting it somewhere nearer to a playable game.
Here is one of my favourite backgrounds that belongs to the first act of the game ( click the on image for a better view )
I'll leave you with a a nice song that I believe has a very interesting title to say the least.
We studied Computer Science together for some time until he had an epiphany and decided to change computers for chicks, and left to pursue a degree in economics.
Since then we haven't seen or heard much from him, but that hasn't stopped his old comrades from working on a game with him as the main character, revolving around his unique way of seeing the world.
It will be a graphic adventure in the traditional Lucasarts style at 320x240! I really miss those games.
Progress is slow, as it's nothing else than a fun little side project, but from time to time we enjoy juggling pixels around and getting it somewhere nearer to a playable game.
Here is one of my favourite backgrounds that belongs to the first act of the game ( click the on image for a better view )
I'll leave you with a a nice song that I believe has a very interesting title to say the least.
Tuesday, February 5, 2008
Ultimapped
By far, one of the nicest features I've used in XSI is the Ultimapper tool. I've been able to normal map my zombie friend quite easily. The next step is to export it to an Ogre mesh and see how it looks there. It should be quite straightforward.
Here is the result from the directx realtime viewport in XSI. It looks nicer with a moving light :)
And here he is with the normal map applied as a diffuse texture.
By the way, XSI is a very nice program once ( and if ) you get used to its weird user interface.
3D tools are inherently complex, I don't know why some developers attempt to obscure them even further by using non standard interfaces whenever possible.
For example, what's so bad about using the standard OS open file dialog... is there a real need to implement a custom crippled version of it? And this is but a drop in the sea...
Oh well, I believe anyone who uses XSI for the first time feels my pain.
I suppose you can get used to it and learn all these non standards workflows, but the real question is: Why should you have to?
Here is the result from the directx realtime viewport in XSI. It looks nicer with a moving light :)
And here he is with the normal map applied as a diffuse texture.
By the way, XSI is a very nice program once ( and if ) you get used to its weird user interface.
3D tools are inherently complex, I don't know why some developers attempt to obscure them even further by using non standard interfaces whenever possible.
For example, what's so bad about using the standard OS open file dialog... is there a real need to implement a custom crippled version of it? And this is but a drop in the sea...
Oh well, I believe anyone who uses XSI for the first time feels my pain.
I suppose you can get used to it and learn all these non standards workflows, but the real question is: Why should you have to?
Sunday, February 3, 2008
Good Head!
Friday, February 1, 2008
Michael, The Vegetarian Zombie
Wednesday, January 30, 2008
The Road to Normal Mapping
I started to work on this guy today, and think it has turned out pretty decent. I wanted a cleanly modeled object to try normal mapping on, and just using a cube seemed lazy and boring.
Next step is take it to Mudbox and sculpt all the details there. I have only created normal maps for simple flat surfaces with Photoshop before, so I'm viewing all this as a workflow learning experience.
I have no idea what to do with his face, maybe I'll leave it as it is. I'm hoping to get inspired once I'm sculpting the detail in.
For those with a 3D fetish just like me, here's a wireframe screenshot ( the model ended up at 2588 triangles ).
It was my first time trying to keep everything as quads, and it can be a frustrating experience sometimes. It sure looks more tidy though :)
Bonus image:
This is the face of the main character of our game ( The Teddy Incident ). You can see some concept art featuring him in previous posts.
I've been working on the character head together with one of our artists ( he has done the whole body too, but I don't have images on that ).
...I can't wait to see the little dude alive with animations, running and jumping and chopping off heads.
Next step is take it to Mudbox and sculpt all the details there. I have only created normal maps for simple flat surfaces with Photoshop before, so I'm viewing all this as a workflow learning experience.
I have no idea what to do with his face, maybe I'll leave it as it is. I'm hoping to get inspired once I'm sculpting the detail in.
For those with a 3D fetish just like me, here's a wireframe screenshot ( the model ended up at 2588 triangles ).
It was my first time trying to keep everything as quads, and it can be a frustrating experience sometimes. It sure looks more tidy though :)
Bonus image:
This is the face of the main character of our game ( The Teddy Incident ). You can see some concept art featuring him in previous posts.
I've been working on the character head together with one of our artists ( he has done the whole body too, but I don't have images on that ).
...I can't wait to see the little dude alive with animations, running and jumping and chopping off heads.
Friday, January 25, 2008
Dead Sketchbook Back to Life
I was looking for some pictures to post here, and I've noticed that I haven't been drawing much lately... Pretend you've never seen the following drawing before :)
Bonus picture:
It's a concept sketch of the main character of the game mindlessly slaughtering zombies ( He's such a sweet child ). I doubt the zombies will make it into the final game version, but it was a fun drawing to do.
I promise that next drawing will be something new and original ( at least new ).
Bonus picture:
It's a concept sketch of the main character of the game mindlessly slaughtering zombies ( He's such a sweet child ). I doubt the zombies will make it into the final game version, but it was a fun drawing to do.
I promise that next drawing will be something new and original ( at least new ).
Thursday, January 24, 2008
Serialize Me
I've been updating the animation system editor lately. More precisely on the saving/loading of nodes and connections.
The first thing that came to mind for the job was to use C# default xml serialization to do the work for me.
The animation engine has a diagram that contains all of it's nodes stored in a list of generic nodes. All nodes inherit from a base node class. I thought that the serializer would choose to write the subclass by default, but it has proven a little bit more complicated than that.
Disclaimer: Maybe I'm missing something out and doing it wrong. If anyone knows a better way to do this I'm really interested in knowing, so please contact me.
As it seems, a class that has subclasses that you may want to serialize needs to use the XmlInclude attribute and define what other classes it may represent...
e.g.
Any OO programmer should be running in circles, screaming and trying to pull out his eyes by now. Since when a superclass should have knowledge of all of its subclasses!?!
That's why I think I may be approaching this the wrong way. C# is too nice a language to have a shortcoming such as this one.
I'd also like to point out that my base node class resides in a separate assembly than my node subclasses, so even using that horrible solution is tricky.
In the end, I was wasting more time trying to get around this than doing real work, so I've used XmlReader and XmlWriter to save and load the node diagram manually.
How have I've solved the node type instantiation then?
When saving nodes I write a string with its type name.
And when reading them I use that string to instantiate the correct subclass dynamically. The only assumption I'm making here is that it has a default constructor.
As nodes can have custom data, I've also created virtual functions in the base node class that subclasses can override to deal with that data. It may not be the most elegant solution, but it's quite flexible (and it works).
I think that the editor will soon be in a distributable (although feature limited, and nowhere near final) state and I'll be able to get some real feedback.
Next post I'll put some pretty drawings for my nonprogrammer friends :)
The first thing that came to mind for the job was to use C# default xml serialization to do the work for me.
The animation engine has a diagram that contains all of it's nodes stored in a list of generic nodes. All nodes inherit from a base node class. I thought that the serializer would choose to write the subclass by default, but it has proven a little bit more complicated than that.
Disclaimer: Maybe I'm missing something out and doing it wrong. If anyone knows a better way to do this I'm really interested in knowing, so please contact me.
As it seems, a class that has subclasses that you may want to serialize needs to use the XmlInclude attribute and define what other classes it may represent...
e.g.
public class SubClass : SuperClass
{
//blah blah blah
}
[XmlInclude( typeof( SubClass ) )]
public class SuperClass
{
//etc etc etc
}
Any OO programmer should be running in circles, screaming and trying to pull out his eyes by now. Since when a superclass should have knowledge of all of its subclasses!?!
That's why I think I may be approaching this the wrong way. C# is too nice a language to have a shortcoming such as this one.
I'd also like to point out that my base node class resides in a separate assembly than my node subclasses, so even using that horrible solution is tricky.
In the end, I was wasting more time trying to get around this than doing real work, so I've used XmlReader and XmlWriter to save and load the node diagram manually.
How have I've solved the node type instantiation then?
When saving nodes I write a string with its type name.
BaseNode node = ( BaseNode ) diagram.Nodes[ nodeId ];
String type = node.GetType().ToString();
...
writer.WriteStartAttribute( "type" );
writer.WriteString( type );
writer.WriteEndAttribute();
And when reading them I use that string to instantiate the correct subclass dynamically. The only assumption I'm making here is that it has a default constructor.
reader.MoveToAttribute( "type" );
String typeString = reader.Value;
Type type = Type.GetType( typeString );
BaseNode node = ( BaseNode ) Activator.CreateInstance( type );
As nodes can have custom data, I've also created virtual functions in the base node class that subclasses can override to deal with that data. It may not be the most elegant solution, but it's quite flexible (and it works).
I think that the editor will soon be in a distributable (although feature limited, and nowhere near final) state and I'll be able to get some real feedback.
Next post I'll put some pretty drawings for my nonprogrammer friends :)
Wednesday, January 23, 2008
The right side of my brain
Because I've scared some of my friends with my first post, I'll try to bring equilibrium to this blog.
Let me introduce you some of the characters that will be part of the game I'm working on.
Although I'm mainly programmer on the team, I enjoy working on art. The picture above is taken from my current sketchbook and is a little bit old.
I wish I was good at painting, but I never seem able to choose the right colours... for a confirmation on that you'll have to wait for another post :)
Drawing is a part of who I am as much as the programming work I like to do. I'll try to touch both subjects often.
Let me introduce you some of the characters that will be part of the game I'm working on.
Although I'm mainly programmer on the team, I enjoy working on art. The picture above is taken from my current sketchbook and is a little bit old.
I wish I was good at painting, but I never seem able to choose the right colours... for a confirmation on that you'll have to wait for another post :)
Drawing is a part of who I am as much as the programming work I like to do. I'll try to touch both subjects often.
Monday, January 21, 2008
The Beginning
It's about time I started this blog, and at the expense of alienating some of my friends by showing my geekier side, I'll begin with a screenshot from a project I'm working on:
It started out as a "learn C# project", but things like this tend to snowball and before long you're working on something quite big.
So, for all of you not into 3D or who I haven't been boring to death lately with the topic: It's a tree based high-level animation blender engine for my favourite 3D engine ( + Editor!! ).
After the Google Summer of Code project that was to provide some higher level animation support to Ogre failed without much to show for it except some interesting comments, I thought that it would be nice to contribute to the community.
This will be a simple implementation of some of the topics discussed there though. No IK, sorry. Just an implementation with blend ( or mix ) nodes and transition nodes ( e.g. State Machines ). This Gamasutra article is probably closer to what I'm trying to achieve.
Currently I have a very simple working version for the editor, but does everything that it should, like create different kinds of nodes, connections, etc. You can also watch the results in a viewport as you interactively update the parameters. It's quite nice really.
My main objective is to be able to control a character animation via a reduced set of parameters. For example, in the screenshot above the whole animation tree can be controlled by only two values.
The C++ implementation will start soon( ish ). It will be a cleaned up version of the C# code. A prettier version that doesn't have to deal with user screw ups.
So, when a usable C++ implementation is available, and I write code to save and load animation trees, I will be releasing everything.
It started out as a "learn C# project", but things like this tend to snowball and before long you're working on something quite big.
So, for all of you not into 3D or who I haven't been boring to death lately with the topic: It's a tree based high-level animation blender engine for my favourite 3D engine ( + Editor!! ).
After the Google Summer of Code project that was to provide some higher level animation support to Ogre failed without much to show for it except some interesting comments, I thought that it would be nice to contribute to the community.
This will be a simple implementation of some of the topics discussed there though. No IK, sorry. Just an implementation with blend ( or mix ) nodes and transition nodes ( e.g. State Machines ). This Gamasutra article is probably closer to what I'm trying to achieve.
Currently I have a very simple working version for the editor, but does everything that it should, like create different kinds of nodes, connections, etc. You can also watch the results in a viewport as you interactively update the parameters. It's quite nice really.
My main objective is to be able to control a character animation via a reduced set of parameters. For example, in the screenshot above the whole animation tree can be controlled by only two values.
The C++ implementation will start soon( ish ). It will be a cleaned up version of the C# code. A prettier version that doesn't have to deal with user screw ups.
So, when a usable C++ implementation is available, and I write code to save and load animation trees, I will be releasing everything.
Subscribe to:
Posts (Atom)