LovePosted by Eskil Sat, October 15, 2011 00:48:00
I'm currently playing Rage and I must say I'm really enjoying it, but please John, don't ever make a game like Rage again.
Long before I was ever a programmer I was a big fan of you. Doom2 and Quake are among my favorite games ever. Even today I play through them every other year or so. They are fluid, fast and not bogged down with cut scenes or story. I don't even feel the need to save my progress when I play because I know rather just replay it next time.
From a technical point of view, the great thing about the id games from the 90s was that every other year a new game would come out it would be full of new ideas, and interesting solutions, that while not always pointing to a mainstream future made them unique and worth exploring.
With Doom3 something happened. It took 4 years. I don't blame you, I blame arist's. Artists don't want 40 characters on screen, they want 10,000 polys per character. Artists don't want you to run fast, they want you to enjoy the scenery. Artists don't want slow projectiles you can dodge, they want realism. The thing with artists is that they so easily can become perfectionists and just like programmers can lose themselves in the whirlpool trying to write the optimal code long after any reasonable performance optimization is left to be made, they get stuck refining every texture pixel by pixel. The truth is that single line drawn by Picasso can (and most often is) more aesthetically pleasing then the meat-head character someone spent six months sculpting in Z-brush. By creating Mega Texture (Really cool by the way) you gave in to your artists desires. There is a Swedish saying that goes something like "Give the bear honey, and it will take you entire arm off". It feels applicable.
I think everyone who makes something is battling this problem: should I sink all time and resources in to one big thing, or should I try many smaller things? God knows I am. If I do something big maybe I will spend all my time on the wrong thing, and if I do something small maybe it will be too small for anyone to take notice. The big decisions always come at the beginning so the longer you work on something the more trivial your impact on it becomes.
Many games designers think its their job to tell stories, but games isn't a story medium, they should go write books or make films. Many artists think that games are about attention to graphical details and in extension to proving how ambitious they are. They should go make art. No, games are about mechanics, they are about feedback, and that is something that programmers provide. Games are not a contest where the developer who spends the most money and time wins either. The greatest legacy of id, is inventing the first person shooter, and things like mouse look. The greatest stories created by id, was not something written, but something that emerges in gameplay. You did that.
If it was all about implementing megatextures, and not about your artists spending years using it, you could have made a game in 18 months not 6 years, so it could be argued that your artists stole 3 Carmack games from us, by demanding perfection.
Some time ago a stumbled on a video interview, where you said that rockets are too complicated to simulate, and that is why Armadillo aerospace builds at least one new rocket every 6 months. Real artist ship. That's what I would like you to do. Get a team of no more then ten people, purposefully don't have more then 2 artists and maybe one level designer on that team and make something in 12-18 months, and dont make it perfect, make it different. Build an engine based on Raytracing, Voxels, particles, Signed Distance fields, vorenoi patterns, or something else we haven't seen. Make something that requires 16 cores, or what ever, just push the envelope in some way. Don't tell a story, don't make a world, make a Descent or a Conterstrike something that doesn't live on content. With a fourth of the time and a tenth of the staff, ill bet you it will be a better investment then Rage.
The thing is you don't have to make something big to get noticed, you are John freakin' Carmack.Edit:
I find it interesting how people read things on the Internet. Sometimes I think they don't read it at all, they just scan to try to find out as quickly as possible if something is a Flame or Praise, so that they can go ahead and either Flame or Praise it in turn. The world is less binary then that.
Trying to clarify things for people who read the Internet like that may be a lost cause, but hey, here I go:
The story most of you are talking about is story telling
in text, cut scenes, voiceover, and machinima. None of that is a game, its other media squeezed in between what is a game. Games have emergent stories, or what I prefer to call drama. That's the thing that happens when you are the last counter terrorist trying to defuse the bomb in counterstrike. Quake, and Doom had drama, modern AAA games have Story telling.
I think that each studio, should make the kind of game that fits them best. I hate the idea that all games that comes from a major studio has to be the same. (currently a realistic, or semi-realistic scripted FPS with cut-scenes). Why cant we let X-Com be a turn based game? Why cant we let Syndicate be a top down RTT game? The problem with Rage is that its trying to be a "modern game" instead of being the kind of game that fits John Carmack. Only one studio in the world can have John Carmack as its lead engineer, so why cant that studio make games based on tech rather then art and design? I'm fine with them being tech demos, as tech demos go, Doom and Quake where pretty great. If it takes Carmack a year and a half to make an engine and then he has to wait 4 and a half years for the art department to finish the game, then clearly id isn't utilizing their greatest asset by the type of games they make.
LovePosted by Eskil Tue, September 13, 2011 07:34:17
Back in January I had a dream of something I wanted to do this year. 12 projects. After working so long on one project I really wanted to do as many things as possible. The first month of any project is always the best, its when you are the most creative and its when you get to experience something being created out of nothing. The drawback is that nothing gets finished...
I wont make 12 projects this year, but the last few months Ive been dabbling in a few different things. I used a month to learn web tech and write my own HTTP server API. I have finally gotten started writing a proper version of my Texture generator tool that I wrote a prototype of well over a year ago, and yes, I have been dabbling with a new game too. I wouldn't say that I'm prototyping it, because when you prototype something the code usually looks horrible. This might be among the pretties code I have ever written.
Thats what I'm enjoying doing right now, writing pretty things. Love has always been a test bed for ideas, and as anyone know, a good lab or skunkworks never remains pretty since you keep randomly adding things. In the end it never looks like it would have if you would have know where you were going. Starting fresh feels very nice after a while.
Earlier this year I started understanding games in a way that i never have before. In my mind I have built a model for how to do what i set out to do with love, make a game with a dynamic story. Love was designed to find this answer, but now that i think i have the answer, not everything in love follows this model. I now know that to make Love be what it needs to be, some rather big changes has to be made. When I first started trying to apply this model to Love I found Love to present some problems that forced me to go back and revise the entire model. I'm still polishing my ideas, but soon I will go in and make some pretty big changes.
Love needs more polish, and the obvious thing would be to polish it, but there are things that aren't polished and nobody cares about not being polished, so there is something else going on, and I'm starting to understand what is. I will rearrange many things in love, even add a few things, but most of all i will try to answer the question, why?
Ive been planing and writing on a blog post about this new model and what it will mean for love, but the more I think about it the ground keeps shifting, so I will keep quiet about it for now and just focus on figuring it out. Thats what I will do from now on, be quiet. But know this, I'm working on things, and some day you will see it all.
LovePosted by Eskil Tue, August 23, 2011 22:08:07
The value of money doesn't scale linearly with how much you have. You see, some dollars are worth more then others. Having more gives you more negotiation leverage, it gives you economy of scale and means that the things we all have to pay can be covered by a smaller part of your income. The plane ticket to go to a city to sign a million dollar deal, is not any less expensive then a plane ticket you needed to go sign a billion dollar deal. The natural state of any unregulated economy is to give the rich a slight advantage proportionally to the poor. Sure, any one can win or loose, but like in a casino, this slight advantage will over a long enough time scale make sure the house always wins. You could say that "fair" as in equal for all, isn't fair at all. A worker earning half as much as an other will have less then half the financial freedom since they both need to pay for the same number of meals each day.
For a brief point in time in the 20th century, this imbalance was reversed and it led to the greatest development our history has ever seen. With the industrial revolution, the rich needed people to fill the factories, and that empowered the poor. Threw legislation, strikes, unionization, and the fear of communist revolt, the poor where able to negotiate a bigger peace of the cake and become richer. This new middle class created a vast new group of consumers that made it even more profitable for the rich to start more companies and hire more people. Everyone benefited.
However, the rich took a good look at their books and found that their main expenditure was the workers. Using machines, effectivization, and out sourcing they where able to cut that costs significantly. If one or a few companies do this it wont matter much, but if all of them do, there will not be enough consumers. Everyone wants someone else to pay their workers enough to buy the stuff we make, but no one wants to pay their own. Every country wants to export their way out of any problem hoping there is some other country who still pays their people enough to buy what ever we make. With such effective means of production, and with so few who can buy, all attention has turned to sales through marketing, branding, and PR. Making stuff is easy, its finding someone who wants it that is hard. Sales is the bureaucracy of capitalism, and our level of bureaucracy has long past any other system.
With no one to buy, what are the rich to do? If there aren't enough people to buy what is already made, why make something new? The only people who can afford to buy something expensive enough, for a rich person to bother to get out of bed is someone else who is rich. But what can you sell to someone who already has everything? The answer is value. Increases in value, side steps the messy business of actually doing something, and requires only that you can find others who agree that what you own is worth more then what you bought it for. Since nothing "real" can be worth enough to fulfill the trading needs of the very rich, they will eventually either invent something to trade, or over value real assets, leading to a value bubble.
It makes sense to invest in something large rather then something small, so the very existence of the ability to buy stock in an existing enterprise discourages investment in new ones. Who in their right mind would bet on something unproven and small, when they can just as well push a button to buy in to something already proven to be the most successful venture ever? And just to be clear, buying stock is most of the time not to invest in the company, but to give your money to the previous owner of the stock. Venture capital becomes fringe pet projects rather then the back bone of investment. As all rich fight over the few and large we get yet another bubble.
The last three decades, the rich have also tried to make up for the consumer defect by lending the money they can not spend to the government and the poor, to keep them consuming, but now Its leading to a disaster for the rich as well as the poor. Like any other bubble, it does eventually burst.
The further the gap between the few and the many, the inherently less stable the economy gets.
Can we repeat the success of the mid 20th century? Can we uninvent our effectivization? No, Why should we? The fact that increases in productivity has made a significant portion of our population redundant, is a huge victory for mankind. We just need a economic system that recognizes this victory and no longer requires everyone to justify their right to a dignified life through work. The economic system should not try to create business, but rather create customers for the things we need. Then business will flourish by it self. And lets be honest, the work deficit, has never been about things not needing to be done, but rather our economic systems failure to support what needs to be done. Why are we all fighting to make customers happy, when most customers already are? Shouldn't we solve problems that haven't bean solved? We don't need yet another home appliance, in fact out planet can hardly afford the ones we have, but that doesn't say there are no things left to do.
A recognition of the fundamental economical imbalance and what it leads to, should inform our political action. Corporations should have a progressive tax code just like people, and investment that goes to fund actual development, should be taxed lower then asset profits. We should not let the rich have any more then what they know what to do with, because beyond that point bubbles will emerge. The awesome computational power we have today, should make it possible to create a substantially more complex tax system without making it harder to use. Lets fill the customer deficit, by getting done the things we need to make the world a better place, rather then trying to make us buy things we don't need. Our victory over production should afford us to embrace everyones well being.
Some say we shouldn't punish success, but who says the future success will come form the rich? The future may not require the masses, but we will only find the few we need in the masses. Giving as many people as possible the chance to try and fail, is therefor paramount through education, encouragement and financial security for all.
LovePosted by Eskil Sat, May 28, 2011 17:45:44
When Elvis appeared on stage in the 50s with his music and hip movements where positively shocking and parents everywhere saw in horror as their kids got swept up in vice. Things couldn't possibly get worse, until the Beatles showed up and started to sing about LSD. Then came Hendrix and that guy couldn't even play straight. And then came hard rock, and some of the people who where in to that didn't even pretend to be nice, they called them selves things like "Prince of darkness". Then came Punk and that was even nosier. It as now so noisy that it was hard to imagine less melodic music, that was until Rap came along and did away with melody all together. Just when parents all agreed that civilization could not possibly go any lower, somebody suggested even removing the lyrics to create Rave, and the final circle of hell was complete.
A few weeks ago I saw a girl, she was probably around fifteen and she was wearing a bag that said "Punk is not dead". It was a sad moment. Because Honey, Punk is dead, and it died long before you where born. Cry on its grave for a while and then move along, dear.
For the first time in modern music history, old people are horrified by the music young people listen to, not because its loud and obnoxious, but because its timid and pathetic. Have we come to a time when parents storm in to their kids rooms to demand they turn the volume UP? You think you are rebellious for listening to hip-hop? Well, if you are listening to Public enemy, Ice-T and 2 Live crew maybe but that was 20 years ago! Don't steal your parents revolt! Get your own!
Why are we awash with Pixel graphics? Isn't the joke "Look it looks like an old game but its really not, funny huh?" kind of played out by now? Same as the "look at the ugly 70s glasses I'm wearing" joke. Its referencing something old and not bringing anything new.
And its all a joke, a few minutes of shaky youtube footage of a cat falling on or out of something, or a comic strip about some sad characters life that is sooo "funny because its true", or why not one of thous door mats with a funny pun. In fact you can now build your entire home completely out of things that look like other things because its funny. If you look for a potato peeler in some design store you can bet its disguised as and a tooth paste tube, a hot dog or something else at most mildly amusing. Its as if Q, became a pacifist and got a job at Ikea.
Some time ago I found this image:
We think we live in a time of development, but looking at this, it feels like a hundred years ago people developed thoughts on a much grander scale then today. What would a chart like this look like for the last ten years? Would it mention the innovation of wheel rims that looks like they spin even when they stand still and would trucker caps be seen as a major new esthetics's movement?
I love Kraftwerk, The Beatles, Hendrix, Led Zeppelin and a lot of other music that was made before i was born, and that's great, but I'm not trying to re-create what they did or try to pretend that i live in that time. I'm trying to define my own time.
Albums like Sgt. Pepper, The Wall, and even Music for a jilted generation where more then just a random collections of good songs, they constituted a hole that told us something new, They allowed us to enter a new world. We still reference 2001 a space odyssey, Blade runner, and 1984 to define our future. We still consider The Godfather, Casablanca and A clockwork orange master peaces. We still read Homer, Shakespeare, and Kafka not because they where just funny but because they expanded or minds. It takes more then a clever pun or a youtube clip to move human thinking forward like that. It takes a vision, and to be create something like that it requires you to question what has come before, not just recycle it, or reference it. That is the core that you need before you do any thing great, you need to have something to say, a point of view, a new idea. What is your idea? Only when you have that, can you upset your parents properly.
LovePosted by Eskil Fri, December 31, 2010 00:21:22
The thought of writing a manifesto, has
always been attractive to me, because I like consistency, I like the
idea of stating ones very basic philosophy and let everything else flow
For years and years I have considered writing down my very basic
thoughts on life, but for a long time I thought they were of no interest
to anyone but me. About a year and a half a go I got a mail from
someone in distress asking me all these questions, questions about life,
truth and direction. This mail convinced me to write mine.
People don't write manifestos anymore, I think that is a loss. I imagine
that Karl Marx, and many others who have attempted to write one would
be pretty appalled by how their messages have been misinterpreted, but i
still think its a worthy pursuit. So I have spent a year and a half
writing just a few pages, treading very carefully. The result is not
what I expected.
I don't know how long i will be able to write whatever I want on this
page, but for now I can, so I have decided to publish them here
them, share them, argue about them, or disagree with them.
LovePosted by Eskil Sat, December 25, 2010 02:43:01
I read an article with an archaeologist bemoaning that Jerusalem was the
most hopeless place on earth to conduct archeology in. You would think
the rich history of Jerusalem would be a goldmine for any one interested
in archeology, but No. Why? Because everyone who lives there is already
convinced of a version of history before they even put the shovel in
the ground. The only evidence they find is the evidence supporting what
they already believe.
I read a fair bit of financial news and the stupidity or lack of basic
understanding of economics that exists in finance is staggering. The
idea of capitalism is that the profit motive, will motivate people to do
good things. Its clear that it does motivate some people, but no one
seems to care much what it motivates them to do.
If a bank manager gets a cut from the profit of the bank, will he or she
give the customers the best advice how to keep their money, or try to
make the bank take their customers money?
Is a private school likely to engage parents in order to deal with
bullying if it may means the parents may move their kids to another
school once they find out the school has a bullying problem?
If you give money to private hospital, its their prerogative to spend as
little as possible of that money on health-care and keep as much as
possible in profits. They may even not want people to get better because
without patients, how will they make their money?
I'm being told that competition in an open market leads to the best
products winning, but if that was true advertising wouldn't exist. Yes,
the best products would win if every one had the all information, but to
think that is the case is ludicrous. How am i suppose to choose the
best doctor? I'm not even remotely qualified to say if a doctor is good
or bad, because I haven't gone to medical school, that's why i go to a
They tell me I should be a "educated" consumer, but I cant go to china
to check the worker conditions every time i buy a pair of sneakers, no
It takes a 2 year old to figure out that everyone cant know everything,
yet we build our entire financial system on this premise. The entire
stock market is built upon the idea that its fair because everyone has
the same information, (proving that it isn't fair at all). We have a
system where its not important to do good things, but to make people
think you are going good things.
Another theory economists talk about is "trickle down economics"; the
idea that if we let people with a lot of money keep their money they
will stimulate the economy by buying stuff. Coincidentally, people with a
lot of money has put this theory forward (go figure...). Well, the very
definition of rich is someone who takes in more money then they spend,
making them, well, rich. So isn't rich people then the very definition
stagnation rater then stimulation? Giving someone who is poor 100$ will
always stimulate the economy better then giving it to someone already
has got so much money that they have chosen not to spend it all. With
higher gaps in income, fewer people will get opportunities and therefor
we as a society will have less success. Its a big problem for society
and ignoring it is like standing on the titanic and saying "Why should I
care about a leak on 3rd class deck, I ride 1st class."
We have millions of economists, yet very few managed to predict the
crash. Why? -Because they are believers. They have a vested interest in
proving that what ever serves them is true. It is very scary to have the
majority of this planet be runned on this very shaky ground. The Euro
was not nearly thought through, the US has no ability to be honest about
them selves and what needs to be done, and china has massive housing
bubble and no previous experience of managing a financial crisis.
I have resorted to think that the best financial advice you can get, you
get from cab drivers. When they tell you to buy gold, IT stocks, or
real-estates, then you know a crash is near.
Any one who says that capitalism has had no virtues, clearly is
delusional, on the other hand it has been poor at solving issues like
health care, and education while creating massive environmental
problems, and failing to see that is equally delusional.
The Soviet union had 0% unemployment, and provided education, health
care and housing for all. Numbers that should be the envy of any nation.
So why did it fail? Because its leaders where believers, They believed
so strongly in their systems successes, that they failed to recognize
its failures; lack of freedom, innovation, and accountability. They
thought that one solution, one system would fix all problems. Lets not
make the same mistake.
LovePosted by Eskil Sat, December 18, 2010 00:24:55
Betray is an easy to use portability library that lets you build single window OpenGL applications. It can be compared to GLUT or SDL, but has a more streamlined interface and supports a few more things. A very important feature of Betray is that it lets you write a single application that supports many different modes of input and outputs. The idea is not just to make it easy for application developers to write portable applications, but also for people who either make, or have access to special hardware to write their own versions of betray, so that all existing betray applications will support the hardware. It makes it much easier for hardware or interface developers, to test out their hardware with existing software. Closed source applications like Betray will soon be released with an Open source betray DLL so that anyone can rewrite it to work with any kind of input and output devices. The file b_test.c is a simple example program using much of the Betray API.
I invite anyone who wants to, to use, test, debug or help me to port betray to other platforms or hardwares to do so. If you are interested E-mail me at eskil at obsession dot se
While its good for Betray implementations to support as much as possible of the Betray API, this isnt always possible. A particular hardware may lack features such as pointer device of multi touch. Even if a feature is not implemented it still needs to be present in terms of API entry's, and should return reasonable default values, to make it easier to support. By using the functions betray_support_context and betray_support_functionality you can ask the implementation functionality is active in the implementation.
To initialize betray and create a screen you call the following:
void betray_init(BContextType context_type, int argc, char **argv, uint window_size_x, uint window_size_y, boolean window_fullscreen, char *name);
Currently Betray only supports OpenGL contexts, but in the future it may be extended to support other rendering contexts too. Once betray has been initialized you can use the functions, betray_action_func_set to give betray a function pointer to the action function that will act as the programs main loop, then call betray_launch_main_loop to start the applications main loop. The Main loop function will be called with a pointer to the structure BInputState that contains useful input state. In this structure you will also find the member "mode" that can be set to either, BAM_DRAW, BAM_EVENT, or BAM_MAIN. This member indicates why the main loop has been called, to either redraw the screen, handle input or compute (the compute call is where time should be advanced, and will be called even if the program has been minimized and is therefor useful to keep things like network connections alive that are not dependent on either being displayed or requires input form the user). The reason for having a single entry point for all three is that you can build nice libraries of interface functions that can handle all 3 modes. Consider this function:
boolean my_button(BInputState *input, float pos_x, float pos_y, char *name)
This function can now handle both drawing and handling input, independently, and the user only have to add it once to the code base, even if it gets called multiple times for different reasons.
While betray_init immediately gets you a screen to draw to, you can at any time modify the screen mode using betray_screen_mode_set. By setting x_size and/or y_size to zero in either betray_screen_mode_set or betray_init betray will revert to the size of the desktop. To find out the current size and state of the draw surface you can call betray_screen_mode_get that will also return the aspect ratio of the screen. In order to support head tracking and stereoscopic (3D) programs should use betray_view_vantage betray_view_direction to retrieve the position of the eye in relation to the screen and any camera rotations or movements.
Betray has a few OpenGL specific functions like betray_gl_proc_address_get to get access to extension function pointers, and betray_gl_context_update_func_set where the user can give betray a function pointer that will be called if the current OpenGL state is lost (this usually happens when screen modes are changed). To make it possible for a Betray implementation to render the entire application to a texture using FBOs, the function betray_gl_screen_fbo_get exists. When ever the betray application is using FBOs and would like to reset the draw target to 0 (the screen) it should instead reset it to the value returned by betray_gl_screen_fbo_get.
The input is divided in to 3 different category's, pointers, axis and buttons and Betray can support any number of each. Pointers are 2 dimensional screen pointers with one or more buttons. You can read out their position, delta position and the position of their last primary click. The later can be very useful when implementing buttons since a button can check both if a pointer is on a button and if it was at the tim of the click, and that means buttons does not need to store state. Using betray_set_mouse_warp the application can hide and continually warp the mouse pointer to the center of the screen in order to avoiding hitting the edges, something very useful for first person mouse controls. Buttons on pointing devices show both their current state and the state they were in the last frame, and it is therefore possible to know if the button is being pressed, released or held. For all buttons you can use the betray_button_get_up_down to store your own state for any button you want. If the user is expected to type in text, it is good to call betray_button_keyboard to enable betray to show a on-screen keyboard on platforms without physical keyboards. Axis are essential any 1, 2 or 3 dimensional input such as joysticks, pedals, accelerometers and so on.
Betray also has a API for 3D sounds that lets you load sounds (using betray_audio_sound_create), set a listener (using betray_audio_listener) and then play the sounds (using betray_audio_sound_play). Once a sound has been started it can be modified using betray_audio_sound_set and betray_audio_sound_stop.
To help betray applications better integrate with the operating system it also supports accessing text strings from the clipboard, and the ability to launch open and save file requesters.
Finally betray supports basic thread functionality that lets you create threads and create, lock and unlock thread safe locks.
Betray has just been rewritten and I have yet to port over Love or any other applications to the new API. Seduce will be the first library that will be ported over to the new version of betray. At the moment Betray is only implemented for Win32, but other operating systems will soon follow. I hope to get as many developers as possible to use and contribute to Betray so that we can make multi platform development easier for everyone.
The library can be downloaded from http://www.quelsolaar.com/quel_solaar.zip
Or you can view the betray.h file at http://www.quelsolaar.com/betray.h
LovePosted by Eskil Sat, November 20, 2010 00:37:39
Lately I have found that there has been more interest in my code base and all my applications. Over the years I have ammased a great deal of code to make game and application develoment far easier, like asset management, portable platform code, text rendering, file storage, networking, performance messurment and so on. I realize this will be fairly geeky stuff for many readers, but as there are some people who are interested in just seeing how I do things and others that are interested in using some libaries, I will start publishing a series of guides to the different modules as update them. These posts will then eventiualy end up in a revamed developer section of this site.
Forge is a set of very basic functions and definitions that are used in all Quel solaar applications. They define such basics as "TRUE" "FALSE" and "uint". Beyond uint it also defines a number of bit specific types.
Forge is assumed to be included in to all files of a project and that makes it very useful for debuging purposes. By defining F_MEMORY_DEBUG macros will replace malloc, free and realloc with debug funtions that will keep track of each allocaton, and then by calling f_debug_mem_print Forge will print out a list of all file names and lines where allocations have been made, how many allocations have been made, freed, and the ammount of memory taken up by each allocator. This is obviusly a very useful tool for tracking down memory leaks. The memory debug system also does some other useful things like over allocating every allocation with 1024 bytes and filling it with a "magic number", it then checks that this portion of the allocation remins untouched to spot if any code inadervenly over writes its allocaion. Some modern operating systems (Like Linux) clears all memory beeing alocated to zeroes, to protect against programs that migh try to allocate large chunks of memory in order to try to find passwords and other sencitive data left by applcations that previously occupied the memory. This can be a bit unfortunate, since it likely to hide some programmer misstakes like failiure to initialize values and pointers to zero. Even if you are running on an operating system that does clear the memory, this is a bug since they usualy dont clear memory that has been freed by the same application as the one allocating it. Therfore the memoy debug system in Forge clears the memory with non NULL grabage to make these misstake easier to find.
The functions f_rand, frandn and frandi are fast and resonably good functions for random number generation. They are based on formulas recomended by mataematisians for use in computer gaphis such as stochastic sampeling.
Forge contains a range of basing vector math functionality that are very similar to many of he funtions found in shading languages. Each have diffent versions for 2 or 3 components and form single and double pressision floating point units. Forge has a long range of generated functions (see f_matrix_operations.c for the code used to generate the code) for constructing 4*4 martices. To construct the 3*3 rotational matrix, you need two vectors (the third can be derived using a cross product), and one of thouse will be dominant if the two vectors arent perfectly perpendicular. There is therefor many ways of constructing a matric, since one of the X, Y and Z vectors can be the dominant and the secondary again can be any of the 3 vectors. Forge therefor defines all possible combinations form both single and double pressission floatiing point values. If the origo argument of any of theese functions is NULL the origo is assumed to be at 0, 0, 0.
f_spline, f_spline2d and f_spline3d are simple b-spline implementations, and f_wiggle, f_wiggel3d and f_wiggel3d creates infinit randomly generated curves with a 3rd degree of continuity ther motion can be described as similar to a wasp flying around a light source. They are very useful for animation and diffent types of noise funtions. Speeking of noise, there is also a fairly fast implementation of Perlin noise, in one, two and three dimentions. The noise funtions are eithe of a single frequency (of one), or multiple recursive frequencies that create a fractal brownian motion.
When engaging in image prosessing it is often good to use a different colorspace then RGB and that is why Forge offers a few conversion funtions for different color spaces. HSV (Hue, Satturation and Value) is a very common color space for color picker interfaces, but has some very bad propperties from a strict color science prespective and should therfor not be used for image prosessing. XYZ is a transformed version of RGB that scales for how diffent colors have different brighness. (R=1 G=1 B=0 Equals a yellow that appears brighter then the Purpule given by R=1 G=0 B=1) Finaly "Lab" is a color space that atempts to create a color space where movement in any direction of the same distane should apperar to yeald the same amount of change in color. Lab is a prefered color space by many to do color corrections.
Almost all math functions have a single and double presision version, but what if you want to make an application that may be compiled in to both (Like Loq Airou)? Well all these funtions are defined without their "f" and "d" postfizes using macros. By default they are defined as float but by defining the symbol F_DOUBLE_PRECISION they get redefined as double. Forge also provides the type "freal" that will be defined to float or double with the same symbol.
Forge can be downloaded here: http://www.quelsolaar.com/quel_solaar.zip