Subscribe to GameFromScratch on YouTube Support GameFromScratch on Patreon
13. August 2013
SDL_logo

 

If you thought SFML took a long time to reach 2.0 you’ve not seen nothing yet!  Today SDL 2 was finally released, after being in development for about a decade.  If you have never heard of it before, SDL is a cross platform game development library that gives access to graphics via OpenGL or DirectX, as well as low level access to audio, keyboard, mouse and joystick.  It is written in C, works in C++ and has bindings for about every language ever invented.

 

 

 

 

Here is the list of major new features:

   - Full 3D hardware acceleration
   - Support for OpenGL 3.0+ in various profiles (core, compatibility,
   debug, robust, etc)
   - Support for OpenGL ES
   - Support for multiple windows
   - Support for multiple displays
   - Support for multiple audio devices
   - Android and iOS support
   - Simple 2D rendering API that can use Direct3D, OpenGL, OpenGL ES, or
   software rendering behind the scenes
   - Force Feedback available on Windows, Mac OS X and Linux
   - XInput and XAudio2 support for Windows
   - Atomic operations
   - Power management (exposes battery life remaining, etc)
   - Shaped windows
   - 32-bit audio (int and float)
   - Simplified Game Controller API (the Joystick API is still here, too!)
   - Touch support (multitouch, gestures, etc)
   - Better fullscreen support
   - Better keyboard support (scancodes vs keycodes, etc).
   - Message boxes
   - Clipboard support
   - Basic Drag'n'Drop support
   - Proper unicode input and IME support
   - A really powerful assert macro
   - Lots of old annoyances from 1.2 are gone
   - Many other things!

 

Android and iOS support is pretty huge, as of course is full 3D hardware acceleration.  You can read the full announcement here.

 

One other major change with the move to 2.0 is the switch from the GNU GPL license to the much more friendly zlib license.  This means you can now statically link to SDL.

 

You can download SDL here.

News


12. August 2013

 

So today on Safari Books Online came a book that was a complete flash from my past.  Computer Graphics: Principles and Practices 3rd edition has been released.  What’s so special about this book?

cgpap3

Three things… 

 

First, it was the textbook I used to learn computer graphics a very long time ago.

Second, it was one of the only ( incredibly expensive ) books I had to purchase for school that I actually found valuable.  ( Code Complete was the other book, if you were curious )

Third, it’s one of the only dead tree books I have kept.  I am almost entirely digital these days, so you have to be a good book for me to keep you around, especially given the size of a few of the condos I’ve moved into over time, I’ve gone through a lot of book purges!  When you consider how incredibly out-dated it had become, the world of graphics has changed a great deal since the second edition of the book was released in 1990!  On top of that, all of the code examples where in Pascal, using a library I’d never heard of at the time, or used since.

 

Fortunately with the release of the 3rd edition, I now have one less piece of dead tree fighting for space in my house!  There are a few things to know about this book, it’s has no code for OpenGL or Direct3D, it’s not really about that.  The book actually uses WPF for it’s examples, but don’t worry, the concepts are easily applied elsewhere. The entire point of this book is to teach graphics programming concepts, not really about the implementation.  If you don’t already know one of those APIs, you are going to want to pick up an additional book on your graphics library of choice ( if needed. )  That said, this will make you **understand** what you are doing with either of those graphics libraries.  You will find when reading this book, it doesn’t really matter what programming languages or library you use, you will be able to digest and adapt to your tools of choice without a lot of effort.  This book has been almost completely re-written at this point, and does cover the modern graphics pipeline.

 

What does it cover?  Well, just about everything actually.  That’s why I kept it around all these years.  For example, here is the Table of Contents:

  1. Introduction
  2. Introduction to 2D Graphics Using WPF
  3. An Ancient Renderer Made Modern
  4. A 2D Graphics Test Bed
  5. An Introduction to Human Visual Perception
  6. Introduction to Fixed-Function 3D Graphics and Hierarchical Modeling
  7. Essential Mathematics and the Geometry of 2-Space and 3-Space
  8. A Simple Way to Describe Shape in 2D and 3D
  9. Functions on Meshes
  10. Transformations in Two Dimensions
  11. Transformations in Three Dimensions
  12. A 2D and 3D Transformation Library for Graphics
  13. Camera Specifications and Transformations
  14. Standard Approximations and Representations
  15. Ray Casting and Rasterizations
  16. Survey of Real-Time 3D Graphics Platforms
  17. Image Representation and Manipulation
  18. Images and Signal Processing
  19. Enlarging and Shrinking Images
  20. Textures and Texture Mapping
  21. Interaction Techniques
  22. Splines and Subdivision Curves
  23. Splines and Subdivision Surfaces
  24. Implicit Representations of Shape
  25. Meshes
  26. Light
  27. Materials and Scattering
  28. Color
  29. Light Transport
  30. Probability and Monte Carlo Integration
  31. Computing Solutions to the Rendering Equation: Theoretical Approaches
  32. Rendering in Practice
  33. Shaders
  34. Expressive Rendering
  35. Motion
  36. Visibility Determination
  37. Spatial Data Structures
  38. Modern Graphics Hardware

 

… so as you may be able to tell, this isn’t a short book.  In fact it’s 1264 pages in length, which would be why this isn’t a proper review, I am not done the book.  In fact, it’s one of those book I will probably never read entirely front to back.  Instead I jump in to the areas I need, unless of course I struggle with the concepts being taught, then I tend to read the entire chapter until I’ve gotten the subject down.  Of course, I read chapters from time to time just for something to do.

 

That’s another great part of this book.  I am no math wiz, I have forgotten far too much, so with many pure math texts I struggle.  This is why this book is very good.  It’s not simple by any means, but it doesn’t just throw an equation at you and leave you scratching your head.  Things are introduced in escalating difficulty, but if you have a late high school or first year university math education, you should be OK.

 

The math is fully explained over the course of the book.  If you have trouble parsing out equations, they are explained fairly well in the book including how to decipher them.   The book doesn’t magically make math easy, but it does do an effective job of explaining it, so that even a non-genius can make sense of things.  Here for example is the excerpt on Euler Angles, and is typical of how things are explained:

 

Example taken from book:


 

11.2.2. Euler Angles

Euler angles are a mechanism for creating a rotation through a sequence of three simpler rotations (called roll, pitch, and yaw). This decomposition into three simpler rotations can be done in several ways (yaw first, roll first, etc.); unfortunately, just about every possible way is used in some discipline. You’ll need to get used to the idea that there’s no single correct definition of Euler angles.

The most commonly used definition in graphics describes a rotation by Euler angles (φ, θ, ψ) as a product of three rotations. The matrix M for the rotation is therefore a product of three others:

1

Thus, objects are first rotated by angle φ in the xy-plane, then by angle θ in the zx-plane, and then by angle ψ in the yz-plane. The number φ is called pitch, θ is called yaw, and ψ is called roll. If you imagine yourself flying in an airplane (see Figure 11.1) along the x-axis (with the y-axis pointing upward) there are three direction changes you can make: Turning left or right is called yawing,pointing up or down is called pitching, and rotating about the direction of travel is called rolling.These three are independent in the sense that you can apply any one without the others. You can, of course, also apply them in sequence.

jet

 

Figure 11.1: An airplane that flies along the x-axis can change direction by turning to the left or right (yawing), pointing up or down (pitching), or simply spinning about its axis (rolling).

Writing this out in matrices, we have

2

3

With the proper choice of φ, θ, and ψ, such products represent all possible rotations. To see this, we’ll show how to find φ, θ, and ψ from a rotation matrix M. In other words, having shown how to convert a (φ, θ, ψ) triple to a matrix, we’ll show how to convert a matrix M to a triple (φ′, θ′, ψ′), a triple with the property that if we convert it to a matrix, we’ll get M.

The (1, 3) entry of M, according to Equation 11.14, must be sin θ, so θ is just the arcsine of this entry; the number thus computed will have a non-negative cosine. When cos θ ≠ = 0, the (1, 1) and (1, 2) entries of M are positive multiples of cos φ and – sin φ by the same multiplier; that means φ = atan2(–m21, m11). We can similarly compute ψ from the last entries in the second and third rows. In the case where cos θ = 0, the angles φ and ψ are not unique (much as the longitude of the North Pole is not unique). But if we pick φ = 0, we can use the lower-left corner and atan2 to compute a value for ψ. The code is given in Listing 11.1, where we are assuming the existence of a 3 × 3 matrix class, Mat33, which uses zero-based indexing. The angles returned are in radians, not degrees.

Listing 11.1: Code to convert a rotation matrix to a set of Euler angles.


  1  void EulerFromRot(Mat33 m, out double psi,
  2                             out double theta,
  3                             out double phi)
  4   {
  5    theta = Math.asin(m[0,2]) 
//using C# 0-based indexing!
  6    double costheta = Math.cos(th);
  7    if (Math.abs(costheta) == 0){
  8       phi = 0;
  9       psi = Math.atan2(m[2,1], m[1,1]);
10    }
11    else
12    {
13       phi = atan2(-m[0,1], m[0,0]);
14       psi = atan2(-m[1,2], m[2,2]);
15    }
16
  }


It remains to verify that the values of θ, φ, and ψ determined produce matrices which, when multiplied together, really do produce the given rotation matrix M, but this is a straightforward computation.


Inline Exercise 11.3:

Write a short program that creates a rotation matrix from Rodrigues’ formula (Equation 11.17 below) and computes from it the three Euler angles. Then use Equation 11.14 to build a matrix from these three angles, and confirm that it is, in fact, your original matrix. Use a random unit direction vector and rotation amount in Rodrigues’ formula.


Aside from the special case where cos θ = 0 in the code above, we have a one-to-one mapping from rotations to (θ, φ, ψ) triples with –π/2 < θ ≤ π/2 and –π < φ, ψ ≤ π. Thus, the set of rotations in 3-space is three-dimensional.

In general, you can imagine controlling the attitude of an object by specifying a rotation using θ, φ, and ψ. If you change any one of them, the rotation matrix changes a little, so you have a way of maneuvering around in SO(3). The cos θ = 0 situation is tricky, though. If θ = π/2, for instance, we find that multiple (φ, ψ) pairs give the same result; varying φ and ψ turns out to not produce independent changes in the attitude of the object. This phenomenon, in various forms, is called gimbal lock, and is one reason that Euler angles are not considered an ideal way to characterize rotations.

 



If you can make sense of the above, you will be good with this book.  This sample is pretty typical of how things in this book are covered.  So if you are looking for a text for learning or brushing up on computer graphics Computer Graphics: Principles and Practices is probably one of the best.  With the exception of Physics, and library specific instructions, this book has pretty much everything you might need to know.

General Programming


30. June 2013

 

Some time back I purchased Codea for my iPad.  Codea is a Lua based game programming kit for creating iOS games on the iPad and frankly it’s really kinda cool.  That said, actually typing code on the device is a bit of a pain, so I looked coming up with an alternative.  It worked, but it certainly wasn’t ideal.  Today I was on the AppStore and I noticed Codea had an update and added something called Air Code, which allows you to connect to Codea using your web browser.

 

Using Air Code is really easy, in Codea on your iPad, open the side menu and select AirCode:

1

 

Then it will tell you the address to open in your browser.  Your computer and iPad need to be on the same network for this to work:

2

 

Open that address in your desktop browser and a list of your available projects will be displayed:

image

 

You then select the code file to edit and the editor appears:

image

 

As you code in the browser, it updates live on the iPad:

3

 

That is very very very cool.

Right now the editing functionality in the browser is quite limited.  It’s basically a text editor only now.  Hopefully in the future they add intellisense support and possibly debugging.  This is a very nice start though, and easily gets around the lack of keyboard support.  Nicely, this process doesn’t require a Mac either, any web browser should work fine.  Coding on one screen and seeing the changes reflect live on the other is actually a very intuitive way to code.

I did run into a small bug, in that focusing away from Codea to check email, when returning I could no longer connect via browser.  Shutting down and restarted Codea fixed the problem.

So, if you have an iPad and another PC and want to create games, Codea is a very cool product and worth checking out!

Programming News


28. June 2013

I have been following the Loom Engine since it was first publicly released.  I even did a five part guided tour of Loom Engine functionality, so this is one that I've been keeping an eye on.  One of the major aspects of Loom was it was layered over top of Cocos2D-x, for better or worse.

Loom
(Sadly, not that Loom)

 

In this release, that has has changed.

 

Loom Engine

The Loom Engine saw a huge amount of work this sprint. You will notice substantial gains in performance and stability.

We shifted to the new bgfx-based renderer this sprint, improving Loom2D performance substantially and setting the stage to support DirectX and other graphics APIs. Cocos2DX is now unsupported.

We have extended Loom2D with some new features and filled in some missing features: 
* You can specify z-sorting mode to have C++ sort large numbers of sprites for you. This is demonstrated in IsoVille.
center() method on DisplayObject to set the pivot point to the center of the DO.
* Keyboard input now works.
* Touch handling is much better.
* TMX loading/rendering works (now implemented in LS).
loom2d.animation package is ported.
* Text rendering/text input works!
* Hierarchical alpha works.

All package names are lower case now. If you run a sprint27 project under sprint28 you will see a lot of errors due to this; we recommend doing a replace-in-files to replace all your import Loom2D.Display. with import loom2d.display. and so on - this will get you up and running within minutes. Don't do it by hand unless you like menial labor! :)

Loom projects now inherit from loom.Application and do not require a main.ls any longer. Cocos2DApplication and Cocos2DGame and Application are all combined now.

Feathers is now a standard Loom library and available to use in your projects!

The profiler works, and also reports a lot of object allocation statistics. Use profilerEnable and profilerDump in the Loom console to start it and have it report results.

Porting Feathers (50,000 lines of AS3 code) drove major improvements to LoomScript. Wins include:
is/as/instanceof now are compliant with AS3/JS standards.
* Allow {foo: "bar"} style Dictionary literals.
* Added NaN and isNaN, and some useful constants on System.Number.
* Convenience for porting: try/catch/finally parse, but the catch/finally blocks are never run. throw triggers a Debug.assert. Vararg type specification is now allowed (but does nothing). new <String>[] syntax is now supported for initializing Vectors.
Array is now an alias for Vector.<Object>.
* Fixed crashes related to printing too-long strings with trace().
Vector.push() is now much more efficient for pushing a single item.
* You may reference properties via super, ie, super.x.
trim/split work properly now, and are much faster.
* Added Number.fromString.
* Added a Base64 utility class.
* ByteArray gains uncompress and the position property.
Stage gains a method to dump the DisplayObject hierarchy; it also has a bunch of nice new methods for dealing with scaling/native size.

Loom CLI

Loom CLI's loom new template was updated to use the new Loom2D APIs as well as package naming convention. Also the default Curse Font color was changed to Blue, as the white font tended to disappear on the default background.

We added new commands:
loom gdb Launches the current Loom project under gdb to help debug runtime crashes.
loom gdb compile Compiles the current Loom project under gdb to help debug compiler crashes.
loom android release Prepares a release-ready APK! It has options to set the keystore and signing settings.
loom init Set up the current directory to be a Loom project. Mostly useful for tool developers.
loom build android --unsigned was removed

You can add --verbose to any CLI command to get more log output.

CLI now explains why it asking for your system password to update on OSX.

So, Cocos2D is out and a custom C++ renderer is in.  Additionally they added support for the feathers UI library as well as TMX loading/rendering.  There are other changes as well as numerous bug fixes, mentioned in the release post.  Loom is no longer completely free, although they offer a free option and quite reasonable pricing.  Of course, if you signed up when I first linked it, it's still free for you.

News Programming


17. June 2013

Dreemchest, the Lua based cross platform 2D game engine (and GFS sponsor!) have just released RC147.  The biggest new feature has to be the ability to publish your game to the Flash player.  That said, there were a number of additional improvements including support for ads and in-app purchases, two features that are basically a game engine must have these days.  The complete list of announced new features is:

  • Composer preferences dialog
  • Built-in updater
  • Properties of type StageObject
  • Exporting iOS apps to IPA
  • iOS small icon inside project settings
  • InApp purchases
  • iAds advertisements
  • GameCenter
  • Cryptography
  • HTTP requests
  • Samples for Ads, GameNetwork, InAppStore, Swipe
  • Compressed bundle option for command line packager
  • Asset browser filters
  • OTF font extension
  • Breakout sample game
  • URLRequest sample project
  • Crypto sample project

Dreemchest is currently available as a free download for MacOS and Windows.  You can download RC147 right here.

News


GFS On YouTube

See More Tutorials on DevGa.me!

Month List