Reconfigure is available right now!

I just hit publish on the Amazon Kindle site, I was expecting it to take a few days but it seems Reconfigure, my first novel is live and available for purchase right now.

The UK link is here, but it will direct you to the relevant territory as it is available globally.
It feels a somewhat odd experience to have let Roisin Kincade out into the wild along with all the wonderful tech and adventures she has had.
I hope, if you choose to buy the book, that you enjoy it. It has been a wonderful experience to create it.
rccover3small
Reconfigure!

Shady Maths for Shaders

I like a good tech challenge and I decided to look a bit more into the world of shaders. I had not fully appreciated how many competing languages there were for these low level compute systems. I had used shaders in Unity3D and I knew we could do fancy things with them. They are wonderfully complicated and full of maths. As with all code you can go native and just write the code directly. There are also tools to help. Things like shadertoy let you see some of the fun that can be had. It reminds me of hacking with the copper process in the old Amiga days. Low level graphics manipulation, direct to the pipeline.
In Unity3d there is a tool I bought a while back called ShaderForge. It allows for editing of the shaders but in a visual way. Each little node shows the results of the maths that is going on in its own area. It is common to have this sort of material editing in 3D applications. There is a lot of maths available and I am only just skimming the surface of what can be done.
I was trying to create a realistic wood ring shader. I wanted to do something like that demonstrated here in normal code (not any of the shader languages).
I ended up with something that looked like this.
ShaderForge Unity3d
It was nearly the concentric rings, but I can only get it to start from the bottom left corner. I have yet to work out which number I can use for an offset so I can get full circles. I have worked out where to put in variance and noise to make the lines wobble a little. So I am a little stuck if anyone has any suggestions I would be very grateful 🙂 I want a random shader texture, slightly different each time which is why I am not using images as I normally do. I am not worried about the colour at the moment BTW. That is a function of scaling the mapping in the sin sweeping function that creates the ripples. I stuck a few extra value modifiers (some set to 0) to see if I could tweak the shader to do what I wanted, but no luck yet. Shaderforge has its own meta data but the thing can be compiled into a full shader in native code.
Just look at what it generates, its fairly full on code.
So it looks like I have quite a lot of learning to do. With code there is always more, always another language or format for something 🙂

***Update Yay for the internet. Dickie replied to this post very very quickly with an image of a very much simpler way for generate the concentric rings. This has massively added to my understanding of the process and is very much appreciated.


// Compiled shader for Web Player, uncompressed size: 14.0KB

// Skipping shader variants that would not be included into build of current scene.

Shader "Shader Forge/wood3" {
Properties {
_Color ("Color", Color) = (0.727941,0.116656,0.0856401,1)
_node_4617 ("node_4617", Color) = (0.433823,0.121051,0.0287089,1)
_node_1057 ("node_1057", Float) = 0.2
}
SubShader {
Tags { "RenderType"="Opaque" }

// Stats for Vertex shader:
// d3d11 : 4 math
// d3d9 : 5 math
// opengl : 10 math
// Stats for Fragment shader:
// d3d11 : 9 math
// d3d9 : 15 math
Pass {
Name "FORWARD"
Tags { "LIGHTMODE"="ForwardBase" "SHADOWSUPPORT"="true" "RenderType"="Opaque" }
GpuProgramID 47164
Program "vp" {
SubProgram "opengl " {
// Stats: 10 math
Keywords { "DIRECTIONAL" "SHADOWS_OFF" "LIGHTMAP_OFF" "DIRLIGHTMAP_OFF" "DYNAMICLIGHTMAP_OFF" }
"!!GLSL#version 120

#ifdef VERTEX

varying vec2 xlv_TEXCOORD0;
void main ()
{
gl_Position = (gl_ModelViewProjectionMatrix * gl_Vertex);
xlv_TEXCOORD0 = gl_MultiTexCoord0.xy;
}

#endif
#ifdef FRAGMENT
uniform vec4 _Color;
uniform vec4 _node_4617;
uniform float _node_1057;
varying vec2 xlv_TEXCOORD0;
void main ()
{
vec4 tmpvar_1;
tmpvar_1.w = 1.0;
tmpvar_1.xyz = mix (_node_4617.xyz, _Color.xyz, vec3(((
sqrt((pow ((xlv_TEXCOORD0.x + 0.2), _node_1057) + pow ((xlv_TEXCOORD0.y + 10.0), _node_1057)))
* 11.0) + -10.0)));
gl_FragData[0] = tmpvar_1;
}

#endif
"
}
SubProgram "d3d9 " {
// Stats: 5 math
Keywords { "DIRECTIONAL" "SHADOWS_OFF" "LIGHTMAP_OFF" "DIRLIGHTMAP_OFF" "DYNAMICLIGHTMAP_OFF" }
Bind "vertex" Vertex
Bind "texcoord" TexCoord0
Matrix 0 [glstate_matrix_mvp]
"vs_3_0
dcl_position v0
dcl_texcoord v1
dcl_position o0
dcl_texcoord o1.xy
dp4 o0.x, c0, v0
dp4 o0.y, c1, v0
dp4 o0.z, c2, v0
dp4 o0.w, c3, v0
mov o1.xy, v1

"
}
SubProgram "d3d11 " {
// Stats: 4 math
Keywords { "DIRECTIONAL" "SHADOWS_OFF" "LIGHTMAP_OFF" "DIRLIGHTMAP_OFF" "DYNAMICLIGHTMAP_OFF" }
Bind "vertex" Vertex
Bind "texcoord" TexCoord0
ConstBuffer "UnityPerDraw" 336
Matrix 0 [glstate_matrix_mvp]
BindCB "UnityPerDraw" 0
"vs_4_0
root12:aaabaaaa
eefiecedaffpdldohodkdgpagjklpapmmnbhcfmlabaaaaaaoeabaaaaadaaaaaa
cmaaaaaaiaaaaaaaniaaaaaaejfdeheoemaaaaaaacaaaaaaaiaaaaaadiaaaaaa
aaaaaaaaaaaaaaaaadaaaaaaaaaaaaaaapapaaaaebaaaaaaaaaaaaaaaaaaaaaa
adaaaaaaabaaaaaaadadaaaafaepfdejfeejepeoaafeeffiedepepfceeaaklkl
epfdeheofaaaaaaaacaaaaaaaiaaaaaadiaaaaaaaaaaaaaaabaaaaaaadaaaaaa
aaaaaaaaapaaaaaaeeaaaaaaaaaaaaaaaaaaaaaaadaaaaaaabaaaaaaadamaaaa
fdfgfpfaepfdejfeejepeoaafeeffiedepepfceeaaklklklfdeieefcaeabaaaa
eaaaabaaebaaaaaafjaaaaaeegiocaaaaaaaaaaaaeaaaaaafpaaaaadpcbabaaa
aaaaaaaafpaaaaaddcbabaaaabaaaaaaghaaaaaepccabaaaaaaaaaaaabaaaaaa
gfaaaaaddccabaaaabaaaaaagiaaaaacabaaaaaadiaaaaaipcaabaaaaaaaaaaa
fgbfbaaaaaaaaaaaegiocaaaaaaaaaaaabaaaaaadcaaaaakpcaabaaaaaaaaaaa
egiocaaaaaaaaaaaaaaaaaaaagbabaaaaaaaaaaaegaobaaaaaaaaaaadcaaaaak
pcaabaaaaaaaaaaaegiocaaaaaaaaaaaacaaaaaakgbkbaaaaaaaaaaaegaobaaa
aaaaaaaadcaaaaakpccabaaaaaaaaaaaegiocaaaaaaaaaaaadaaaaaapgbpbaaa
aaaaaaaaegaobaaaaaaaaaaadgaaaaafdccabaaaabaaaaaaegbabaaaabaaaaaa
doaaaaab"
}
SubProgram "opengl " {
// Stats: 10 math
Keywords { "DIRECTIONAL" "SHADOWS_SCREEN" "LIGHTMAP_OFF" "DIRLIGHTMAP_OFF" "DYNAMICLIGHTMAP_OFF" }
"!!GLSL#version 120

#ifdef VERTEX

varying vec2 xlv_TEXCOORD0;
void main ()
{
gl_Position = (gl_ModelViewProjectionMatrix * gl_Vertex);
xlv_TEXCOORD0 = gl_MultiTexCoord0.xy;
}

#endif
#ifdef FRAGMENT
uniform vec4 _Color;
uniform vec4 _node_4617;
uniform float _node_1057;
varying vec2 xlv_TEXCOORD0;
void main ()
{
vec4 tmpvar_1;
tmpvar_1.w = 1.0;
tmpvar_1.xyz = mix (_node_4617.xyz, _Color.xyz, vec3(((
sqrt((pow ((xlv_TEXCOORD0.x + 0.2), _node_1057) + pow ((xlv_TEXCOORD0.y + 10.0), _node_1057)))
* 11.0) + -10.0)));
gl_FragData[0] = tmpvar_1;
}

#endif
"
}
SubProgram "d3d9 " {
// Stats: 5 math
Keywords { "DIRECTIONAL" "SHADOWS_SCREEN" "LIGHTMAP_OFF" "DIRLIGHTMAP_OFF" "DYNAMICLIGHTMAP_OFF" }
Bind "vertex" Vertex
Bind "texcoord" TexCoord0
Matrix 0 [glstate_matrix_mvp]
"vs_3_0
dcl_position v0
dcl_texcoord v1
dcl_position o0
dcl_texcoord o1.xy
dp4 o0.x, c0, v0
dp4 o0.y, c1, v0
dp4 o0.z, c2, v0
dp4 o0.w, c3, v0
mov o1.xy, v1

"
}
SubProgram "d3d11 " {
// Stats: 4 math
Keywords { "DIRECTIONAL" "SHADOWS_SCREEN" "LIGHTMAP_OFF" "DIRLIGHTMAP_OFF" "DYNAMICLIGHTMAP_OFF" }
Bind "vertex" Vertex
Bind "texcoord" TexCoord0
ConstBuffer "UnityPerDraw" 336
Matrix 0 [glstate_matrix_mvp]
BindCB "UnityPerDraw" 0
"vs_4_0
root12:aaabaaaa
eefiecedaffpdldohodkdgpagjklpapmmnbhcfmlabaaaaaaoeabaaaaadaaaaaa
cmaaaaaaiaaaaaaaniaaaaaaejfdeheoemaaaaaaacaaaaaaaiaaaaaadiaaaaaa
aaaaaaaaaaaaaaaaadaaaaaaaaaaaaaaapapaaaaebaaaaaaaaaaaaaaaaaaaaaa
adaaaaaaabaaaaaaadadaaaafaepfdejfeejepeoaafeeffiedepepfceeaaklkl
epfdeheofaaaaaaaacaaaaaaaiaaaaaadiaaaaaaaaaaaaaaabaaaaaaadaaaaaa
aaaaaaaaapaaaaaaeeaaaaaaaaaaaaaaaaaaaaaaadaaaaaaabaaaaaaadamaaaa
fdfgfpfaepfdejfeejepeoaafeeffiedepepfceeaaklklklfdeieefcaeabaaaa
eaaaabaaebaaaaaafjaaaaaeegiocaaaaaaaaaaaaeaaaaaafpaaaaadpcbabaaa
aaaaaaaafpaaaaaddcbabaaaabaaaaaaghaaaaaepccabaaaaaaaaaaaabaaaaaa
gfaaaaaddccabaaaabaaaaaagiaaaaacabaaaaaadiaaaaaipcaabaaaaaaaaaaa
fgbfbaaaaaaaaaaaegiocaaaaaaaaaaaabaaaaaadcaaaaakpcaabaaaaaaaaaaa
egiocaaaaaaaaaaaaaaaaaaaagbabaaaaaaaaaaaegaobaaaaaaaaaaadcaaaaak
pcaabaaaaaaaaaaaegiocaaaaaaaaaaaacaaaaaakgbkbaaaaaaaaaaaegaobaaa
aaaaaaaadcaaaaakpccabaaaaaaaaaaaegiocaaaaaaaaaaaadaaaaaapgbpbaaa
aaaaaaaaegaobaaaaaaaaaaadgaaaaafdccabaaaabaaaaaaegbabaaaabaaaaaa
doaaaaab"
}
SubProgram "opengl " {
// Stats: 10 math
Keywords { "DIRECTIONAL" "SHADOWS_OFF" "LIGHTMAP_OFF" "DIRLIGHTMAP_OFF" "DYNAMICLIGHTMAP_OFF" "VERTEXLIGHT_ON" }
"!!GLSL#version 120

#ifdef VERTEX

varying vec2 xlv_TEXCOORD0;
void main ()
{
gl_Position = (gl_ModelViewProjectionMatrix * gl_Vertex);
xlv_TEXCOORD0 = gl_MultiTexCoord0.xy;
}

#endif
#ifdef FRAGMENT
uniform vec4 _Color;
uniform vec4 _node_4617;
uniform float _node_1057;
varying vec2 xlv_TEXCOORD0;
void main ()
{
vec4 tmpvar_1;
tmpvar_1.w = 1.0;
tmpvar_1.xyz = mix (_node_4617.xyz, _Color.xyz, vec3(((
sqrt((pow ((xlv_TEXCOORD0.x + 0.2), _node_1057) + pow ((xlv_TEXCOORD0.y + 10.0), _node_1057)))
* 11.0) + -10.0)));
gl_FragData[0] = tmpvar_1;
}

#endif
"
}
SubProgram "d3d9 " {
// Stats: 5 math
Keywords { "DIRECTIONAL" "SHADOWS_OFF" "LIGHTMAP_OFF" "DIRLIGHTMAP_OFF" "DYNAMICLIGHTMAP_OFF" "VERTEXLIGHT_ON" }
Bind "vertex" Vertex
Bind "texcoord" TexCoord0
Matrix 0 [glstate_matrix_mvp]
"vs_3_0
dcl_position v0
dcl_texcoord v1
dcl_position o0
dcl_texcoord o1.xy
dp4 o0.x, c0, v0
dp4 o0.y, c1, v0
dp4 o0.z, c2, v0
dp4 o0.w, c3, v0
mov o1.xy, v1

"
}
SubProgram "d3d11 " {
// Stats: 4 math
Keywords { "DIRECTIONAL" "SHADOWS_OFF" "LIGHTMAP_OFF" "DIRLIGHTMAP_OFF" "DYNAMICLIGHTMAP_OFF" "VERTEXLIGHT_ON" }
Bind "vertex" Vertex
Bind "texcoord" TexCoord0
ConstBuffer "UnityPerDraw" 336
Matrix 0 [glstate_matrix_mvp]
BindCB "UnityPerDraw" 0
"vs_4_0
root12:aaabaaaa
eefiecedaffpdldohodkdgpagjklpapmmnbhcfmlabaaaaaaoeabaaaaadaaaaaa
cmaaaaaaiaaaaaaaniaaaaaaejfdeheoemaaaaaaacaaaaaaaiaaaaaadiaaaaaa
aaaaaaaaaaaaaaaaadaaaaaaaaaaaaaaapapaaaaebaaaaaaaaaaaaaaaaaaaaaa
adaaaaaaabaaaaaaadadaaaafaepfdejfeejepeoaafeeffiedepepfceeaaklkl
epfdeheofaaaaaaaacaaaaaaaiaaaaaadiaaaaaaaaaaaaaaabaaaaaaadaaaaaa
aaaaaaaaapaaaaaaeeaaaaaaaaaaaaaaaaaaaaaaadaaaaaaabaaaaaaadamaaaa
fdfgfpfaepfdejfeejepeoaafeeffiedepepfceeaaklklklfdeieefcaeabaaaa
eaaaabaaebaaaaaafjaaaaaeegiocaaaaaaaaaaaaeaaaaaafpaaaaadpcbabaaa
aaaaaaaafpaaaaaddcbabaaaabaaaaaaghaaaaaepccabaaaaaaaaaaaabaaaaaa
gfaaaaaddccabaaaabaaaaaagiaaaaacabaaaaaadiaaaaaipcaabaaaaaaaaaaa
fgbfbaaaaaaaaaaaegiocaaaaaaaaaaaabaaaaaadcaaaaakpcaabaaaaaaaaaaa
egiocaaaaaaaaaaaaaaaaaaaagbabaaaaaaaaaaaegaobaaaaaaaaaaadcaaaaak
pcaabaaaaaaaaaaaegiocaaaaaaaaaaaacaaaaaakgbkbaaaaaaaaaaaegaobaaa
aaaaaaaadcaaaaakpccabaaaaaaaaaaaegiocaaaaaaaaaaaadaaaaaapgbpbaaa
aaaaaaaaegaobaaaaaaaaaaadgaaaaafdccabaaaabaaaaaaegbabaaaabaaaaaa
doaaaaab"
}
SubProgram "opengl " {
// Stats: 10 math
Keywords { "DIRECTIONAL" "SHADOWS_SCREEN" "LIGHTMAP_OFF" "DIRLIGHTMAP_OFF" "DYNAMICLIGHTMAP_OFF" "VERTEXLIGHT_ON" }
"!!GLSL#version 120

#ifdef VERTEX

varying vec2 xlv_TEXCOORD0;
void main ()
{
gl_Position = (gl_ModelViewProjectionMatrix * gl_Vertex);
xlv_TEXCOORD0 = gl_MultiTexCoord0.xy;
}

#endif
#ifdef FRAGMENT
uniform vec4 _Color;
uniform vec4 _node_4617;
uniform float _node_1057;
varying vec2 xlv_TEXCOORD0;
void main ()
{
vec4 tmpvar_1;
tmpvar_1.w = 1.0;
tmpvar_1.xyz = mix (_node_4617.xyz, _Color.xyz, vec3(((
sqrt((pow ((xlv_TEXCOORD0.x + 0.2), _node_1057) + pow ((xlv_TEXCOORD0.y + 10.0), _node_1057)))
* 11.0) + -10.0)));
gl_FragData[0] = tmpvar_1;
}

#endif
"
}
SubProgram "d3d9 " {
// Stats: 5 math
Keywords { "DIRECTIONAL" "SHADOWS_SCREEN" "LIGHTMAP_OFF" "DIRLIGHTMAP_OFF" "DYNAMICLIGHTMAP_OFF" "VERTEXLIGHT_ON" }
Bind "vertex" Vertex
Bind "texcoord" TexCoord0
Matrix 0 [glstate_matrix_mvp]
"vs_3_0
dcl_position v0
dcl_texcoord v1
dcl_position o0
dcl_texcoord o1.xy
dp4 o0.x, c0, v0
dp4 o0.y, c1, v0
dp4 o0.z, c2, v0
dp4 o0.w, c3, v0
mov o1.xy, v1

"
}
SubProgram "d3d11 " {
// Stats: 4 math
Keywords { "DIRECTIONAL" "SHADOWS_SCREEN" "LIGHTMAP_OFF" "DIRLIGHTMAP_OFF" "DYNAMICLIGHTMAP_OFF" "VERTEXLIGHT_ON" }
Bind "vertex" Vertex
Bind "texcoord" TexCoord0
ConstBuffer "UnityPerDraw" 336
Matrix 0 [glstate_matrix_mvp]
BindCB "UnityPerDraw" 0
"vs_4_0
root12:aaabaaaa
eefiecedaffpdldohodkdgpagjklpapmmnbhcfmlabaaaaaaoeabaaaaadaaaaaa
cmaaaaaaiaaaaaaaniaaaaaaejfdeheoemaaaaaaacaaaaaaaiaaaaaadiaaaaaa
aaaaaaaaaaaaaaaaadaaaaaaaaaaaaaaapapaaaaebaaaaaaaaaaaaaaaaaaaaaa
adaaaaaaabaaaaaaadadaaaafaepfdejfeejepeoaafeeffiedepepfceeaaklkl
epfdeheofaaaaaaaacaaaaaaaiaaaaaadiaaaaaaaaaaaaaaabaaaaaaadaaaaaa
aaaaaaaaapaaaaaaeeaaaaaaaaaaaaaaaaaaaaaaadaaaaaaabaaaaaaadamaaaa
fdfgfpfaepfdejfeejepeoaafeeffiedepepfceeaaklklklfdeieefcaeabaaaa
eaaaabaaebaaaaaafjaaaaaeegiocaaaaaaaaaaaaeaaaaaafpaaaaadpcbabaaa
aaaaaaaafpaaaaaddcbabaaaabaaaaaaghaaaaaepccabaaaaaaaaaaaabaaaaaa
gfaaaaaddccabaaaabaaaaaagiaaaaacabaaaaaadiaaaaaipcaabaaaaaaaaaaa
fgbfbaaaaaaaaaaaegiocaaaaaaaaaaaabaaaaaadcaaaaakpcaabaaaaaaaaaaa
egiocaaaaaaaaaaaaaaaaaaaagbabaaaaaaaaaaaegaobaaaaaaaaaaadcaaaaak
pcaabaaaaaaaaaaaegiocaaaaaaaaaaaacaaaaaakgbkbaaaaaaaaaaaegaobaaa
aaaaaaaadcaaaaakpccabaaaaaaaaaaaegiocaaaaaaaaaaaadaaaaaapgbpbaaa
aaaaaaaaegaobaaaaaaaaaaadgaaaaafdccabaaaabaaaaaaegbabaaaabaaaaaa
doaaaaab"
}
}
Program "fp" {
SubProgram "opengl " {
Keywords { "DIRECTIONAL" "SHADOWS_OFF" "LIGHTMAP_OFF" "DIRLIGHTMAP_OFF" "DYNAMICLIGHTMAP_OFF" }
"!!GLSL"
}
SubProgram "d3d9 " {
// Stats: 15 math
Keywords { "DIRECTIONAL" "SHADOWS_OFF" "LIGHTMAP_OFF" "DIRLIGHTMAP_OFF" "DYNAMICLIGHTMAP_OFF" }
Vector 0 [_Color]
Float 2 [_node_1057]
Vector 1 [_node_4617]
"ps_3_0
def c3, 0.200000003, 10, 11, -10
def c4, 1, 0, 0, 0
dcl_texcoord v0.xy
add r0.xy, c3, v0
pow r1.x, r0.x, c2.x
pow r1.y, r0.y, c2.x
add r0.x, r1.y, r1.x
rsq r0.x, r0.x
rcp r0.x, r0.x
mad r0.x, r0.x, c3.z, c3.w
mov r1.xyz, c1
add r0.yzw, -r1.xxyz, c0.xxyz
mad oC0.xyz, r0.x, r0.yzww, c1
mov oC0.w, c4.x

"
}
SubProgram "d3d11 " {
// Stats: 9 math
Keywords { "DIRECTIONAL" "SHADOWS_OFF" "LIGHTMAP_OFF" "DIRLIGHTMAP_OFF" "DYNAMICLIGHTMAP_OFF" }
ConstBuffer "$Globals" 144
Vector 96 [_Color]
Vector 112 [_node_4617]
Float 128 [_node_1057]
BindCB "$Globals" 0
"ps_4_0
root12:aaabaaaa
eefiecedbabakleflijnjmcmgkldbcbdippjnhehabaaaaaaceacaaaaadaaaaaa
cmaaaaaaieaaaaaaliaaaaaaejfdeheofaaaaaaaacaaaaaaaiaaaaaadiaaaaaa
aaaaaaaaabaaaaaaadaaaaaaaaaaaaaaapaaaaaaeeaaaaaaaaaaaaaaaaaaaaaa
adaaaaaaabaaaaaaadadaaaafdfgfpfaepfdejfeejepeoaafeeffiedepepfcee
aaklklklepfdeheocmaaaaaaabaaaaaaaiaaaaaacaaaaaaaaaaaaaaaaaaaaaaa
adaaaaaaaaaaaaaaapaaaaaafdfgfpfegbhcghgfheaaklklfdeieefcgeabaaaa
eaaaaaaafjaaaaaafjaaaaaeegiocaaaaaaaaaaaajaaaaaagcbaaaaddcbabaaa
abaaaaaagfaaaaadpccabaaaaaaaaaaagiaaaaacabaaaaaaaaaaaaakdcaabaaa
aaaaaaaaegbabaaaabaaaaaaaceaaaaamnmmemdoaaaacaebaaaaaaaaaaaaaaaa
cpaaaaafdcaabaaaaaaaaaaaegaabaaaaaaaaaaadiaaaaaidcaabaaaaaaaaaaa
egaabaaaaaaaaaaaagiacaaaaaaaaaaaaiaaaaaabjaaaaafdcaabaaaaaaaaaaa
egaabaaaaaaaaaaaaaaaaaahbcaabaaaaaaaaaaabkaabaaaaaaaaaaaakaabaaa
aaaaaaaaelaaaaafbcaabaaaaaaaaaaaakaabaaaaaaaaaaadcaaaaajbcaabaaa
aaaaaaaaakaabaaaaaaaaaaaabeaaaaaaaaadaebabeaaaaaaaaacambaaaaaaak
ocaabaaaaaaaaaaaagijcaaaaaaaaaaaagaaaaaaagijcaiaebaaaaaaaaaaaaaa
ahaaaaaadcaaaaakhccabaaaaaaaaaaaagaabaaaaaaaaaaajgahbaaaaaaaaaaa
egiccaaaaaaaaaaaahaaaaaadgaaaaaficcabaaaaaaaaaaaabeaaaaaaaaaiadp
doaaaaab"
}
SubProgram "opengl " {
Keywords { "DIRECTIONAL" "SHADOWS_SCREEN" "LIGHTMAP_OFF" "DIRLIGHTMAP_OFF" "DYNAMICLIGHTMAP_OFF" }
"!!GLSL"
}
SubProgram "d3d9 " {
// Stats: 15 math
Keywords { "DIRECTIONAL" "SHADOWS_SCREEN" "LIGHTMAP_OFF" "DIRLIGHTMAP_OFF" "DYNAMICLIGHTMAP_OFF" }
Vector 0 [_Color]
Float 2 [_node_1057]
Vector 1 [_node_4617]
"ps_3_0
def c3, 0.200000003, 10, 11, -10
def c4, 1, 0, 0, 0
dcl_texcoord v0.xy
add r0.xy, c3, v0
pow r1.x, r0.x, c2.x
pow r1.y, r0.y, c2.x
add r0.x, r1.y, r1.x
rsq r0.x, r0.x
rcp r0.x, r0.x
mad r0.x, r0.x, c3.z, c3.w
mov r1.xyz, c1
add r0.yzw, -r1.xxyz, c0.xxyz
mad oC0.xyz, r0.x, r0.yzww, c1
mov oC0.w, c4.x

"
}
SubProgram "d3d11 " {
// Stats: 9 math
Keywords { "DIRECTIONAL" "SHADOWS_SCREEN" "LIGHTMAP_OFF" "DIRLIGHTMAP_OFF" "DYNAMICLIGHTMAP_OFF" }
ConstBuffer "$Globals" 144
Vector 96 [_Color]
Vector 112 [_node_4617]
Float 128 [_node_1057]
BindCB "$Globals" 0
"ps_4_0
root12:aaabaaaa
eefiecedbabakleflijnjmcmgkldbcbdippjnhehabaaaaaaceacaaaaadaaaaaa
cmaaaaaaieaaaaaaliaaaaaaejfdeheofaaaaaaaacaaaaaaaiaaaaaadiaaaaaa
aaaaaaaaabaaaaaaadaaaaaaaaaaaaaaapaaaaaaeeaaaaaaaaaaaaaaaaaaaaaa
adaaaaaaabaaaaaaadadaaaafdfgfpfaepfdejfeejepeoaafeeffiedepepfcee
aaklklklepfdeheocmaaaaaaabaaaaaaaiaaaaaacaaaaaaaaaaaaaaaaaaaaaaa
adaaaaaaaaaaaaaaapaaaaaafdfgfpfegbhcghgfheaaklklfdeieefcgeabaaaa
eaaaaaaafjaaaaaafjaaaaaeegiocaaaaaaaaaaaajaaaaaagcbaaaaddcbabaaa
abaaaaaagfaaaaadpccabaaaaaaaaaaagiaaaaacabaaaaaaaaaaaaakdcaabaaa
aaaaaaaaegbabaaaabaaaaaaaceaaaaamnmmemdoaaaacaebaaaaaaaaaaaaaaaa
cpaaaaafdcaabaaaaaaaaaaaegaabaaaaaaaaaaadiaaaaaidcaabaaaaaaaaaaa
egaabaaaaaaaaaaaagiacaaaaaaaaaaaaiaaaaaabjaaaaafdcaabaaaaaaaaaaa
egaabaaaaaaaaaaaaaaaaaahbcaabaaaaaaaaaaabkaabaaaaaaaaaaaakaabaaa
aaaaaaaaelaaaaafbcaabaaaaaaaaaaaakaabaaaaaaaaaaadcaaaaajbcaabaaa
aaaaaaaaakaabaaaaaaaaaaaabeaaaaaaaaadaebabeaaaaaaaaacambaaaaaaak
ocaabaaaaaaaaaaaagijcaaaaaaaaaaaagaaaaaaagijcaiaebaaaaaaaaaaaaaa
ahaaaaaadcaaaaakhccabaaaaaaaaaaaagaabaaaaaaaaaaajgahbaaaaaaaaaaa
egiccaaaaaaaaaaaahaaaaaadgaaaaaficcabaaaaaaaaaaaabeaaaaaaaaaiadp
doaaaaab"
}
}
}
}
Fallback "Diffuse"
}

Star Wars Battlefront Beta

Last night I took a few hours off re-reading and tweaking my Reconfigure Book reminding myself that there is still world out here. I downloaded the public beta of Star Wars battlefront.
It is very impressive! All the Battlefront games have been good, the mix of mass open warfare, vehicles and a sense of scale all work really well with the iconic Star Wars settings. There is a lot of dying and a lot of respawning, but that is how it works. It is an infantry battle and you can treat yourself as expendable.
The beta has two planet surfaces, the second bing the ice planet Hoth. Imperial AT-AT stomp towards the base. Sentry guns and tunnels, trenches and rock faces make up the scene. Tie fighters and A-wings battle overhead. I didn’t get to fly anything, which is my preference, but that will come in time.
As a rebel fighter in the first game, seeing the imposing AT-AT slowly stomping forwards and blasters just bouncing off, backed up by stormtroopers was impressive, but suddenly Darth Vader turned up, light sabre deflecting shots as he carved through us. It was incredibly exciting. This is not my video but it does show the scene very well and an amusing moment with another hero.

The single player survival game has waves of Stormtroopers coming at you in close and personal on a very rocky and brilliantly lit Tattoine. I seemed to see the troopers up a lot closer and saw the impressive animation system at work on the NPC characters in this mode.
The game will of course be huge, but it is good to see it is as good as this already. I don’t think any of us who grew up with Star Wars in the late 70’s will ever get tired of the buzz of being in these environments. With this and Elite Dangerous on the Xbox One we have some tween memories to relive and now colour in.

AR glasses – Ray-ban

I just visited Ray-Ban’s virtual glasses modelling site. There have been a lot of ‘stick things on your face on a webcam’ applications but I was impressed with how quick, simple and accurate this one was. My regular glasses are Ray-Bans so I found the model number and tried my actual pair on virtually to see the difference.
The registration of my face even in bad lighting was incredibly quick, and yes I need a haircut!
Ar glasses
What was impressive is that the glasses appear to have lighting and a reflection in the lens, The still does not do that justice, but it really adds something over the the cartoon stickers of other AR web cam applications. The arms of the glasses also go around the side of your head.
Here is the ‘real’ pair for comparison.
glasses (non ar)
This is just a webcam on a webpage. Imagine the degree of world changing views we can create on portable holo style headsets.

Full Xbox One elite Dangerous

Over a year ago I got to play the beta, on the PC, of Elite Dangerous as one of the early backers on Kickstarter. I wrote a number of things about it and the Oculus Rift DK2 experience too.
I also got to Elite Dangerous on the Xbox One with the preview programme. This has been running for a good few months as this post where I mashed it with predators fighting in Mortal Kombat was back in July.
Elite Dangerous is now fully live on Xbox One. Having spent way more time on the preview version than on the full PC/Mac version I had built up a nice little ship and a decent buffer of cash. I was expecting to be reset completely for the full release. I had see reports we would get a cash value for our modules. Instead though, and thankyou Frontier, my ship is intact, as are my modules and my stats. The cargo I had on board suddenly said it was stolen, but that is a minor thing.
It may be some sort of gaming heresy, or cause a flame war, but I am enjoying the couch, controller big TV experience more than being sat at my laptop, even with a complicated stick arrangement. It may be because getting the right buttons to work with the VR headset and not be able to see the keyboard, the difficulty in driving the galaxy map in that configuration meant the console version seems slicker and easier. The PC has the ability to map controls to any of the multitude of buttons, for any control stick. The console only has the one controller type, (and the new fancy expensive controller too). The commands are mapped onto the buttons as menus. e.g. if you tap b it fires the boosters, if you hold b you get an onscreen menu with four directions to select landing gear, cargo scoop, lights etc. It means that you don’t have to hold that many things in your head as to which button to press. So if you don’t play for a few weeks you can still go back and the basics are there, but the on screen helps remind you. It was another problem with the VR headset on the PC that you lose any visual memory. You have to rely on finger position. Imagine trying to touch type and not be able to glance at the keys. Unless you are a real pro touch typer we all look at the keys at some point. It augments what our brain needs. The putts players of Elite will of course just know and hold the information, they will become like touch typers. I jump from game to game and I am past needing to memorise the complexity I think. It used to be fun to have obscure collections of keys but now it is less so.
Having got to keep the expensive collection of modules on the ship I got back to playing the game again last night. It hit one of this rare moments when the missions, the place in the vast depths of place and the time to just work it all aligned. It had taken months to kit the ship and get to the point of having a couple of million in the bank. As with all RPG’s there is grind required. You teeter on the edge of oblivion for a while. Then you plateau, before a new set of challenges make themselves known.
I started the session with this
Start of a productive few hours on elite dangerous
A balance of 2.4million in cash and a ship that had about 5.6 million on upgrades. After just an hour of doing a few missions in the rich vein I found it was.
Result of a few hours on elite dangerous
A balance on 3.1million. Nearly a million credits. Adding 30% to the amount I already had. If only real life skills generated this sort of return 🙂
The whole Elite experience may not be for everyone, it will be interesting how the console generation take to it. It is a game that requires a bit of a slog. The monotony is something that is part of what makes it so endearing. I do get lost in most games and films, this one even more so. I do engage in combat, when I have to, but prefer a more self defence than pirate attitude to that, most of the time. It is a pity I can’t have a crossover to Commander Epredator on the PC version. Each Commander Epredator inhabits the same universe at an economic and server level apparently. The Xbox is really a meta shard where just xbox users frequent.
Predlet 2.0 was badgering me to be able to play it too. I have set him up an account, though I just left him to it to see what the initial experience was like. After a few minutes he was back on Jurassic World Lego so I think the initial onboard experience may not be the sort of thing console owners are used to. Having been in on the beta there were very little instructional or intro parts. Training missions grew, but you just got used to fiddling around with the ship to see what happened. So For me I have a mental model of how it all works. I am still a little confused at the super cruise over shooting and rapidly accelerating at some of the space station targets but it feels like it is there to keep your attention.
Aside from the whole ultraHD thing that high end PC’s are starting to do I can see no difference in the loo and feel of the game across the platforms. So the ‘it’s better on PC’ can only really come down to how much you spend on your gaming rig. Spend more and it’s better, naturally.
I have also found that now I can multitask, as I tweeted last night, whilst travelling some of the longer distances I get to read a few pages of Reconfigure. Whilst you might get interdicted on a supercruise (that sounds odd, but it’s the words they use) I have enough time and enough defence capability to not worry too much. I put the kindle down and pick up the pad. It seems Elite Dangerous is crying out for a second screen app. It would be great to check things during hyperspace and super cruise whilst keeping the onscreen space view. The VR experience has the ability to look left and right and the terminals pop up with info, floating for you. The Xbox does that too with freelook, clicking the right stick moves to freelook. Though in reality its easer to lock and zoom into the screens. In VR you can lean forward to see the AR screens better. The photos above are of the locked in view not the floating view. So a second screen view of all that, the ships systems, reconfiguring things etc would be a great addition. I know I would use it. Of course that would not work so well on the PC and Mac, though with the Xbox becoming a Windows 10 machine the crossover might get easier?

More Hololens demos

Whilst I may have been quite focussed on my own Science Fiction vision of the future with my book writing experiment I have not been completely detached from the world. Yesterday some new demos of Microsoft’s impressive looking Hololens came out. I am still not convinced they should really call them holograms, but we can let that slide. This blended reality demo of a game, albeit a blow stuff up one, understanding the environment around it, using the walls as canvases is impressive. I still think I prefer the minecraft examples though.

They are obviously not overly keen on small companies or individuals getting their hands not eh dev kit as its $3k for the kit and only in the US and Canada. Still it’s a start.
We have yet to see the kit from Magic Leap/google.
Of course this got me thinking, my Reconfigure story, the things that happen in the physical world could easily be emulated with a Hololens. It would be great to create a Hololens powered version of my character’s experience. Not a 3d 360 immersive film but a blended reality, this is what it would feel like to be Roisin Kincade. Now that is exciting!

Getting closer to a launch? Reconfigure

The past weeks have been a very interesting one in the book writing process. It has been more like systems admin and system testing. The various printouts of Reconfigure have had a verbal read through, trying to spot the odd errors, changes in tone, pace. I have been looking out for continuity errors too. I made a few changes to the maths in it also. Every time I read it I found I could tweak it a little. Those tweaks and corrections are much lower in frequency and the book is now really in closed invitational beta. The blurb of the story is at reconfigure book.co.uk

rccover3small

I started to set up my Amazon account to be able to sell the book. It required a fair amount of messing around with US tax exemption forms and finding the right international IBAN numbers for bank accounts etc.

Using Apple pages I am able to export to ePub. I tried the Mac version of the Kindle conversions but the apps are a mess of Java problems. Uploading the ePub and the cover image to the book page produced a .Mobi file that can be downloaded, and also previewed on the web. So I am nearly there.
The next thing to do is set the price. At 99p Amazon take a 65% royalty and at £2.99 they take a 30% cut. I am hoping that people are happy to pay £2.99. I am sure friends and family might to help support this endeavour but I am not so sure about the general public. There seems, as in Apps, to be a trend towards 99p as a price point for any volume. The old adage of 35% of something is better than 70% of nothing applies.

There were some formatting challenges too, but I think I have them sorted.

It seems pricing can be altered and there is a sort of club that you can pay to join to do more fancy things with deals and lending etc. I am not sure I can justify that just yet.
So it seems my first public product is going to be this novel, not and app or a game. It does have a lot of dev tech and game concepts in it along with virtual worlds and alike.
Hopefully a few more people reading it will settle the nerves of wondering what I have done with the past month. Of course this could all be complete self-delusion. Let us hope not!

Third time through, Reconfigure

I have just completed a third triage of the manuscript for Reconfigure. I am now at the printing the thing off and reading it out aloud stage. Its a fair old chunk of work. 72,000 words, and with the double line spacing hilton 206 pages of A4. I am still very pleased with it. Whether anyone else will be I shall soon find out I guess.
Reconfigure printed out

Every pass I spot minor tweaks. Usually spelling and grammar of course. Starting sentences with So, a lot and Well, too. So those are getting filtered and adjusted. I also created a page and a url reconfigurebook.co.uk which is just a redirect to the page above on the navigation tab. On there is a description of the book, a first pass at the abstract that may, or may not entice people into reading.
I also had a go at a stylised cover, it is pretty much all built from Unity3d, it describes some of the images and ideas in the story, without giving too much away, I hope.
I am reposting the image here, but it all is subject to any changes I fancy doing of course 🙂
Reconfigure book digital cover
***Update this is the new book cover.
new book cover for Rconfigure

So head on over to reconfigurebook.co.uk to see what this science fiction, set today, is all about (ish).

Reconfigure – time to read and edit

Last Friday I finished writing the story that I had in my head for Reconfigure. I surprised myself at the speed it came out, but when you have to do something, you have to do it! I also learned a lot about how I thread idea together. The story is set now, the tools and tech in it is, for the most part, genuine and real. Constructing it form the initial plan to the first draft has felt just like a software project. Architecture, Internal Design, Code. It now differs in that there is not a “compiler” to help spot any errors. There is of course spell check. This stage is one of reading it, lots it would seem. Checking it makes sense, meets the spec and then adding or taking away from it to create a good user experience. As it has a basis in fact there is real world continuity checking. There is also speculative science fiction continuity that I can double check too.
My biggest surprise was the elements of the story, the little mental pictures and feelings that I discovered on the way. I had the structure, that was fun to conceive but the colouring in has been an interesting mix of conscious thought and of Flow.
When I started to re-read it for the first time I was not totally sure what it was going to sound like in my head. A few times I have written articles and looked at the end result and started again. Same structure just different words. I was hoping that was not the case this time. Of course this is all potentially self deluding, but I like it so far.
Another thing I was not expecting is in building the potential for a follow up, if not a series. The core elements have several threads that seem to be brewing as I re-read the text. I was thinking this would be done and dusted.
I am looking ahead to just getting it out there, probably just on Amazon Kindle store. I don’t think I can justify making actual print copy books though services like LuLu do over print on demand. So I have to think about pricing. There, like the app store, seems to be lots of discussion of people not paying over $0.99 or 99p for a book. Discussions of free, just for the publicity or of making something reassuringly expensive because it has enough words per pence. I don’t know, but I think I will release it and see if I can charge for it. Just enough that maybe my social media friends and colleagues might feel happy to sponsor me by buying a copy.
I have started to consider cover designs, an early one, just an alpha (rather like the text so far) was this last night.
Exploring cover art ideas for #reconfigure
It was using the iPhone app Typorama. I will have to rebuild the image in the right size and shape and may make the cubes in Unity3D instead of the stock image, that being more in keeping with the story.
I started to work on the back cover hook, the abstract. It was interesting trying o find a balance between telling the story and hinting at it. Introducing the central character and allowing her strengths and vulnerabilities to try and surface in a paragraph. I still have work to do on that but may share that in another post.

Forza 6 – 10 years in the making

Today Forza 6 arrived on the Xbox One. I have been a long time fan of Forza. It is now in its 10th year. A decade of what, at the time it came out, was considered to be a poor mans Gran Turismo. It has, in my opinion, surpassed all expectations and been a fantastic franchise. The driving feel and the exhilaration is always spot on. I have also been a big fan of their decal customisation. It was little annoying moving to the xbox one and not having my various logos I had created for forza 5 a few year ago. I still carried on and re-created most of my ‘art’ work on the cars in 5. I had a nice cool stuff collective TV logo back on the 360 and forza 4. However instead I created A Choi Kwang Do logo.
I was very pleased, once I got back to the main menu on Forza 6 to see the custom decals and the layouts for specific cars were available to import from Forza 5 now.
I did my first races in a very old impreza using one of the community designs
Forza 6
Now though I am back in a 2005 Impreza WRX complete with some feeding edge words and a logo on the back long with a bright CKD logo. So thankyou Turn 10 🙂 It now means my drivatar will be appearing random races advertising CKD across the world. Also any network race I am in I can show off the logo for my martial art of choice and also advertise feeding egde at the same time. It is an odd concept that there is still a lot of mileage in (Excuse the pun)
Forza 6 CKD scooby
It was also quite amusing to hear James May and Richard Hammond’s voices, albeit labelled at “Automative Journalist” as opposed to Top Gear presenters. I guess all the voice work was done before the demise of Top Gear as it previously existed.
**Update here is some video of one of the cars in action. It looks better in the flesh as this has been Xbox DVR captured, sent onedrive then uploaded to youtube 🙂

***Update
A longer video using the Forza vista, some driving and a photo of a newer scooby, with a black spoiler to represent a belt and orange wing mirrors to represent a belt tag 🙂

**Update 21/9 I noticed during night races another level of detail that impressed me. I have not noticed headlights behave quite so headlighty before. These my car had different bulbs and cast a different light to the other car on the track with me.
Forza6 headlights
I am going to reward myself with a massive driving session this weekend after I complete writing this #reonfigure novel first draft. Near there, the chequered flag is waving and I can see the finish line.
**Update I just finished the novel !