MaxCoderz

for your 1 bit pleasure!

All times are UTC




Post new topic Reply to topic  [ 30 posts ]  Go to page 1, 2  Next
Author Message
PostPosted: Sun 21 Jun, 2009 9:55 am 
Offline
Maxcoderz Staff
User avatar

Joined: Thu 01 Dec, 2005 9:04 am
Posts: 227
Location: Melbourne, Australia
This is something I have been piecing together over the past few of weeks. It started off as a 2D vector graphics engine but now is evolving into a more generic game of engine, taking care of keyboard input, etc.

The graphics side of things is very Open GL-ish, albeit with one fewer dimension! The matrices are 3x3, so technically it can do 3D, but none of the code is really set up for that.

Here's an example of a piece of code to draw a box:

Code:
            .glBegin(GL_POLYGON)

                .glTexCoord(0, 0)
                .glVertex(-40, -20)
               
                .glTexCoord(63, 0)
                .glReflect(GL_REFLECT_Y)        ; +40, -20
               
                .glTexCoord(63, 31)
                .glReflect(GL_REFLECT_BOTH)     ; +40, +20
               
                .glTexCoord(0, 31)
                .glReflect(GL_REFLECT_X)        ; -40, +20
               
            .glEnd()


I told you it was Open GL-ish! :mrgreen:

The macro's beginning with a period are just for convenience when the arguments to the routines are immediate values. They can be rewritten using manual LDs and CALLs.

.glReflect() is an optimisation for symmetrical shapes, although I need to implement vertex lists before it becomes really useful.

Keyboard input is done using a slightly modified version (to allow it to work in an interrupt routine better) of the event-driven keyboard handler in the Programming Help section.

I have also been working on some code for a C-style printf routine (this is why it's becoming a generic library!). It's not yet finished, so not in the demo, but at the moment I have the raw code to produce decimal representations of 32-bit integer values and also arbitrary x.y fixed point values. I just can't work out the best way to put this in a format specifier! The best I can come up with is: "%03.6dw[24.8]" (a 32-bit 24.8 fixed point value, using at least 3 decimal digits for the integer part - left padded with zeros - and 6 digits in the fractional part).

You can download a zip file containing the current source and a pre-assembled binary. The source is written for TASM (why do I get the feeling I'm the only one still using this!), so good luck!

There is also an animated GIF (caution - almost half a megabyte).

The keys are:

Left/Right - rotate
2nd* + Left/Right/Up/Down - translate
Plus/Minus - scale
Enter - cycle drawing mode
Clear* - toggle texture mapping (affects polygons only)
Mode - exit

* In PindurTI, left shift is [2nd], right shift is [clear].

_________________
"I don't know why a refrigerator is now involved, but put that aside for now". - Jim e on unitedti.org

avatar courtesy of driesguldolf.


Top
 Profile  
Reply with quote  
PostPosted: Tue 23 Jun, 2009 11:31 am 
Offline
Maxcoderz Staff
User avatar

Joined: Thu 16 Dec, 2004 10:06 pm
Posts: 3064
Location: Croydon, England
Nice going. :) Do you have any plans for a game with this? Or would you consider turning it into a Flash application library (as you did with Aether?)


Top
 Profile  
Reply with quote  
PostPosted: Wed 24 Jun, 2009 11:16 am 
Offline
Maxcoderz Staff
User avatar

Joined: Thu 01 Dec, 2005 9:04 am
Posts: 227
Location: Melbourne, Australia
benryves wrote:
Nice going. :) Do you have any plans for a game with this? Or would you consider turning it into a Flash application library (as you did with Aether?)


The plan at the moment is to use it in a 2D space flight game revolving around the Apollo project (think Lunar Lander, but you have to fly to the moon, too!). In order to get there, I'll have to turn it into a flash library, since there would be no room left for the program code. Plus, it gives me the freedom to use ridiculous amounts of lookup tables :)

_________________
"I don't know why a refrigerator is now involved, but put that aside for now". - Jim e on unitedti.org

avatar courtesy of driesguldolf.


Top
 Profile  
Reply with quote  
PostPosted: Sun 28 Jun, 2009 9:16 am 
Offline
Maxcoderz Staff
User avatar

Joined: Thu 01 Dec, 2005 9:04 am
Posts: 227
Location: Melbourne, Australia
I've added a bit of stuff to the engine this weekend.

The first is vertex lists, although they are done a bit differently from OpenGL. Here is an example of how they are used:

Code:
            .glBegin(GL_VERTEX_LIST)
               
                .glVertex(0, -30)
                .glReflect(GL_REFLECT_X)
                .glVertex(-30, 0)
                .glReflect(GL_REFLECT_Y)
               
            .glEnd()
               
            .glBegin(GL_POLYGON)

                .glTexCoord(0, 0)
                .glIndex(0)
               
                .glTexCoord(31, 0)
                .glIndex(3)
               
                .glTexCoord(31, 31)
                .glIndex(1)
               
                .glTexCoord(0, 31)
                .glIndex(2)
               
            .glEnd()


At the moment GL_VERTEX_LIST uses AppBackupScreen to store the transformed co-ordinates. When I convert it to an app-library it will use dynamically allocated memory.

There is also a new function which I wish was in OpenGL: glCircle. It can draw outlined or filled circles of radius up to 65535 pixels, positioned with 16-bit signed co-ordinates. It still needs a bit of work - huge circles are really slow because it calculates all the pixels, even the ones that are off-screen. This needs to be fixed. On the other hand, it at least goes to the trouble of doing a bounding-box check before drawing the circle. This is evident in the screenshot below when the framerate jumps 5-6 fps when the circle goes off-screen.

I've also written a program to semi-automate the creation of a jump table when making the app library (something I never did for aether - which I really should have). Hopefully I can test it as an app sometime in the next week.

Also, can someone point me in the right direction to find some info on grayscale? I've never tried it before and wouldn't mind seeing if it is at least feasible to include it, but I can't seem to find anything in the Grayscale forum.

Image

_________________
"I don't know why a refrigerator is now involved, but put that aside for now". - Jim e on unitedti.org

avatar courtesy of driesguldolf.


Top
 Profile  
Reply with quote  
PostPosted: Sun 28 Jun, 2009 11:00 am 
Offline
New Member

Joined: Sun 09 Nov, 2008 1:56 pm
Posts: 67
impressive :o


Top
 Profile  
Reply with quote  
PostPosted: Tue 30 Jun, 2009 3:36 am 
Offline
Calc Master
User avatar

Joined: Fri 04 Mar, 2005 12:52 am
Posts: 1069
Location: NW Wisconsin
What the?!!? So that's what it does!! :shock: :o

_________________
My diet consists of nails, code-stealers, and HP fans.
Projects:

Robot War [TI-82, TI Flash App]
Sonic the Hedgehog [Multiplatform]


Top
 Profile  
Reply with quote  
PostPosted: Sat 04 Jul, 2009 8:29 am 
Offline
Maxcoderz Staff
User avatar

Joined: Thu 01 Dec, 2005 9:04 am
Posts: 227
Location: Melbourne, Australia
More progress today! This one is a problem I am glad is finally out of the way.

The problem with allowing really large circles (radius up to 65535) is that big circles were really slow (ie: several seconds). This problem has now been overcome using a wrapper routine to check the circle against the clipping window and calculate initialise the variables of the circle drawing loop so that only the parts which are potentially visible are calculated.

The result is that large circles are now almost as fast as small ones. There is some overhead, since two 32-bit square roots need to be taken, but this is negligible compare to the alternative!

The screenshot isn't too interesting, though. It's a trip around the perimeter of a large circle, but I like it since this is the kind of effect I want to use in the lunar orbiter game - with the circle standing in for the Earth/Moon.

Image

_________________
"I don't know why a refrigerator is now involved, but put that aside for now". - Jim e on unitedti.org

avatar courtesy of driesguldolf.


Top
 Profile  
Reply with quote  
PostPosted: Sun 12 Jul, 2009 9:22 am 
Offline
Maxcoderz Staff
User avatar

Joined: Thu 01 Dec, 2005 9:04 am
Posts: 227
Location: Melbourne, Australia
I've begun the tedious process of porting the code to an app library. I've got the dynamic memory handling sorted, so that's the big hurdle out of the way.

Code has been added to copy the contents of the LCD at startup, so you can draw over what's already there:

Image

The keyboard stuff has been coming along nicely, too. The ON key can now be treated like any other key, with event handlers, etc. There are also 4 additional routines: glReadKey, glWaitKey, glReadChar and glWaitChar.

The difference between the glXKey and glXChar routines is that the former returns the key scancode (including a new one I made up for the ON key ;) ), and the latter returns the key mapped to a corresponding ASCII character, if their is one. So if you pressed the minus key, glReadKey would give you GL_KEY_MINUS, while glReadChar would give you "-" or "W" depending on a mode flag.

"Colours" have also been implemented. The filled drawing routines can take a colour value from 0 - 255 and map it to a set of built in dithering patterns. I like this idea because it gives me the option to make an attempt at Gouraud shading for polygons, and also try and do something funky with grayscale (and thanks, tr1p, for that excellent description of grayscale in the programming help forum!).

Hopefully by next weekend I can get the rest of the code working in App form and then I can take a look at these more interesting things.

_________________
"I don't know why a refrigerator is now involved, but put that aside for now". - Jim e on unitedti.org

avatar courtesy of driesguldolf.


Top
 Profile  
Reply with quote  
PostPosted: Sun 12 Jul, 2009 1:47 pm 
Offline
Maxcoderz Staff
User avatar

Joined: Thu 16 Dec, 2004 10:06 pm
Posts: 3064
Location: Croydon, England
Very nice! What are your RAM requirements?


Top
 Profile  
Reply with quote  
PostPosted: Tue 14 Jul, 2009 12:04 am 
Offline
Maxcoderz Staff
User avatar

Joined: Thu 01 Dec, 2005 9:04 am
Posts: 227
Location: Melbourne, Australia
benryves wrote:
Very nice! What are your RAM requirements?


It's just over 1kb of dynamic memory at the moment, plus appBackUpScreen for static variables/interrupt handler. If I keep the texture mapping the way it is, it will also need 512 bytes per texture for lookup tables.

_________________
"I don't know why a refrigerator is now involved, but put that aside for now". - Jim e on unitedti.org

avatar courtesy of driesguldolf.


Top
 Profile  
Reply with quote  
PostPosted: Tue 14 Jul, 2009 9:33 am 
Offline
Regular Member

Joined: Sun 13 Nov, 2005 2:42 am
Posts: 76
Location: A cold cold land filled with snow
This looks great, I can't wait to see a demo of the actual game but it might be a little early for that. :)

_________________
Wright Studios.org the place for calculator graphics.


Top
 Profile  
Reply with quote  
PostPosted: Fri 24 Jul, 2009 11:04 am 
Offline
Maxcoderz Staff
User avatar

Joined: Thu 01 Dec, 2005 9:04 am
Posts: 227
Location: Melbourne, Australia
ninja_master wrote:
This looks great, I can't wait to see a demo of the actual game but it might be a little early for that. :)


Just a little :)

Actually, I've spent the last couple of weeks working on some actual game code. It's been quite fun because I had this stupid idea of keeping everything to scale - so the moon has to be 384,400,000 meters from the Earth, which means I needed some bloody big numbers!

The main thrust over the past week has been on the physics code. I managed to some Newtonian integration working (at least I think it works, but there are problems). The equations needed are:

v1 = v0 + a0 * T
p1 = p0 + v0 * T + a0 * 0.5 * T * T

Where p0, v0 and a0 are the previous position, velocity and acceleration; p1 and v1 are the new position and velocity; and T is time.

I'm using fixed point math - 6.10 for acceleration, 22.10 for velocity and 30.18 for position. In addition to that, the Mass of the Earth * gravitational constant needs to be stored as a 64-bit integer and divided by another 64-bit number (distance squared) at run-time to calculate gravitational acceleration! At least they are both unsigned.

The good news is that I wrote a "big integer" division routine which can divide any two integers from 1 to 256 bytes in length. I should probably incorporate that into the library, along with some other big integer code.

There is a bug somewhere which is causing orbits to slowly spiral outwards. I'll need to investigate that this weekend. In the meantime, here are two screens showing 1) a circular orbit around the (invisible) Earth and 2) a weird precessing elliptical orbit.

Image

Image

_________________
"I don't know why a refrigerator is now involved, but put that aside for now". - Jim e on unitedti.org

avatar courtesy of driesguldolf.


Top
 Profile  
Reply with quote  
PostPosted: Fri 24 Jul, 2009 11:14 am 
Offline
Maxcoderz Staff
User avatar

Joined: Thu 16 Dec, 2004 10:06 pm
Posts: 3064
Location: Croydon, England
Very impressive, as ever. I'm not sure if there are all that many games with impressive physics (Acelgoyobis springs to mind) so it's an interesting direction to go in. Despite the size of these "bloody big" numbers, it seems you're still getting decent speed!
qarnos wrote:
The main thrust over the past week has been on the physics code.
Heh :P


Top
 Profile  
Reply with quote  
PostPosted: Fri 24 Jul, 2009 12:06 pm 
Offline
Maxcoderz Staff
User avatar

Joined: Thu 01 Dec, 2005 9:04 am
Posts: 227
Location: Melbourne, Australia
benryves wrote:
Very impressive, as ever. I'm not sure if there are all that many games with impressive physics (Acelgoyobis springs to mind) so it's an interesting direction to go in. Despite the size of these "bloody big" numbers, it seems you're still getting decent speed!
qarnos wrote:
The main thrust over the past week has been on the physics code.
Heh :P


Unintentional puns are the best ones! :P

I just checked out Acelgoyobis on ticalc. I love pinball games, so I'll have to give it a try!

The speed is OKish, but it's not doing a lot graphics-wise. Once I know the acceleration, the integration only takes 9000cc, so I'm happy with that, but the 64-bit division required to calculate the acceleration is a killer: ~55000cc

I could certainly get that down. The G acceleration will hardly change from frame to frame, so I could just calculate it every now-and-then, or even try to integrate it along with everything else. There's lots of opportunities, but I'm not going to follow them until I work out what's causing the spiralling-out problem.

Here's the thing: If I hard-code the acceleration at the value I know it's supposed to be, it all works a lot better - there's still a little spiralling, but nowhere near as much. But when I calculate it, it goes awry. But the G calculation is the most accurate part of the whole thing! It doesn't make much sense. Even stepping through it in the debugger and following the calculations manually, it's getting the right answers.

I have a feeling there might be some kind of problem with rounding signed numbers. It could be that the errors on the negative side are biased one way, and biased the other on the positive side. Anyway, I hope I can get it figured out, because I want to try to get that 64-bit division out of there.

_________________
"I don't know why a refrigerator is now involved, but put that aside for now". - Jim e on unitedti.org

avatar courtesy of driesguldolf.


Top
 Profile  
Reply with quote  
PostPosted: Sat 25 Jul, 2009 3:33 pm 
Offline
New Member

Joined: Sat 25 Jul, 2009 3:29 pm
Posts: 3
I think that this project is amazing!!! Do you have a current release?


Top
 Profile  
Reply with quote  
Display posts from previous:  Sort by  
Post new topic Reply to topic  [ 30 posts ]  Go to page 1, 2  Next

All times are UTC


Who is online

Users browsing this forum: No registered users and 1 guest


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
cron
Powered by phpBB ® Forum Software © phpBB Group | DVGFX2 by: Matt