SHDR : Online OpenGL Shader Editor

I had to post about this amazing tool I found, now when I am writing my 3D games, I basically pray every time I play with a shader in case I brake it.

I know the basics but using either xCode or Android Studio (now has a tool), there is no syntax highlighting or easy way to see errors!

SHDR allows you to paste in your fragment and vertex shader and tells indicates any issues, and renders the results if it can!

BRILLIANT!

 

Virtual Worlds : Progress so far

What? a? Virtual Worlds? What a sh*t name?  Your probably right but its just better than Android 3D mmo thingy!

Progress so far?  I would of liked to give it more time but some times I am not in the mood, sometimes I can’t get out of the mood which also leads to lack of sleep!  Last night I had beer! (not a usual thing sadly)

What can you do so far?

  • Register, login
  • Navigate the main world, which will allow you to enter player zones and create your own zones.
  • You can see other players (as cubes) move about
  • Once in your own zone, you can place cubes to make structures (see below) this has been vastly improved.
  • You can climb your structures to make bigger structures (I had to make a stair case to to make the archway)
  • You can enter delete mode in your zone and delete things with ease
  • Started adding back in the voice engine, sound effects etc
  • There are now system text messages to show you important information
  • Players and zones have text above them showing their username

device-2014-11-15-231021

 

 

 

 

 

 

 

Whats next

So to get it to the point where I can alpha test it I would like to do the follow

  • Create a 3D model for players as they are currently cubes
  • Make a 3D object for a zone, this should grow as the zone gets more popular / better in some way
  • Find a wider range of textures snow, grass, wood, etc
  • Create a control help screen to list gamepad controls
  • Make all commands voice activated (may get dropped)
  • Allow you to send messages to users (may be text or voice)
  • Create some sort of reason to play the game, prices, score boards etc.
  • Implement GCM (push notifications)

The aim is to have a demo zone thats setup for xmas when I release alpha:)

Off to bed!

GLKIT Object Picking

For anyone who has played with OpenGL ES, its really hard work (iOS or Android). I have spent many hours on OpenGL ES 1.0 and 2.0, making my own frameworks etc.

Apple introduced GLKit in iOS 5 if I remembered correctly and it was designed to make the maths side easier. One of the things I struggle with is object picking, this is touching the screen and turning that in to a 3D position in the OpenGL world. Generally there is 2 ways to do this, Colour picking and Ray Picking.
Colour picking is when the user touches the screen, every object is rendered as a different colour and then you detect what colour that person touched to work out where they touched.

Ray Picking, is where you fire off a ray and work out what the first object is that it hits. This requires quite a bit of maths which people have already done for you but in different programming languages.

However, the point of this article is that I discovered that Apple have added functions to help with Ray Picking namely GLKMathUnproject

Code based from this StackOverFlow post http://stackoverflow.com/questions/20214498/updating-opengl-es-touch-detection-ray-tracing-for-ipad-retina

This works out when you touch the floor (self.plane) and then puts self.cube at that position

- (BOOL)didTouchObject: (CGPoint) tapLoc
{
tapLoc.x *= [UIScreen mainScreen].scale;
tapLoc.y *= [UIScreen mainScreen].scale;

bool testResult;

GLint viewport[4];
glGetIntegerv(GL_VIEWPORT, viewport);

GLKVector3 nearPt = GLKMathUnproject(GLKVector3Make(tapLoc.x, (tapLoc.y-viewport[3])*-1, 0.0), _baseModelViewMatrix, _projectionMatrix, &viewport[0] , &testResult);
GLKVector3 farPt = GLKMathUnproject(GLKVector3Make(tapLoc.x, (tapLoc.y-viewport[3])*-1, 1.0), _baseModelViewMatrix, _projectionMatrix, &viewport[0] , &testResult);

//farPt = GLKVector3Subtract(farPt, nearPt);

float xDif = (farPt.x – nearPt.x) / 1000;
float yDif = (farPt.y – nearPt.y) / 1000;
float zDif = (farPt.z – nearPt.z) / 1000;

for (int i = 0; i < 100; i ++)
{
if ((nearPt.x + (xDif * i)) > self.plane.position.x – self.plane.scale.x && (nearPt.x + (xDif * i)) < self.plane.position.x + self.plane.scale.x &&
(nearPt.y + (yDif * i)) > self.plane.position.y – self.plane.scale.y && (nearPt.y + (yDif * i)) < self.plane.position.y + self.plane.scale.y &&
(nearPt.z + (zDif * i)) > self.plane.position.z – self.plane.scale.z && (nearPt.z + (zDif * i)) < self.plane.position.z + self.plane.scale.z)
{

NSLog(@”Hit cube”);
self.cube.position = GLKVector3Make(nearPt.x + (xDif * i), nearPt.y + (yDif * i), nearPt.z + (zDif * i));
return YES;
}

}

return NO;

}