Thursday, October 20, 2011

Unity 3D (Pro): View matrix (separately) for CG shaders

As Unity's shader support is largely based on Open GL, there isn't, by default design, access to separate model and view matrices in shader code. Occasionally you might want access to this and to use it you'll need to pass this information in yourself.

Just a quick summary of what Unity does provide in Shader code.


  • UNITY_MATRIX_MVP - Current model * view * project matrix

  • UNITY_MATRIX_MV - Current mode * view matrix

  • UNITY_MATRIX_P - Current project matrix

  • _Object2World - Current model matrix

  • _World2Object - Inverse of current world matrix



Very occasionally I wish there was a UNITY_MATRIX_M and UNITY_MATRIX_V but there isn't - at least - not yet. (Same limitation in GLSL)

In C# we can get the view matrix from Camera.mainCamera.worldToCameraMatrix and for GameObjects the model matrix can be generated by using Matrix4x4.TRS( transform.position, transform.rotation, transform.localScale).

If we wanted to pass in our own modelView matrix we could do


Matrix4x4 modelViewMatrix = Camera.mainCamera.worldToCameraMatrix * Matrix4x4.TRS( transform.position, transform.rotation, transform.localScale);



Then at the appropriate point we can do


material.SetMatrix("modelView", modelViewMatrix);



To pass this model view matrix into our shader.

In our shader, presumably in the vertex shader we can then use this value like so


v2f vert(appdata_base v) 
{
v2f o;
o.pos = mul( mul(UNITY_MATRIX_P, modelView), v.vertex );
return o;
}



The result of the above code is exactly the same as


o.pos = mul( UNITY_MATRIX_MVP, v.vertex );



So now knowing this you can manipulate and/or use the model and view matrices separately in your shaders if you so choose, by first passing them in from script code.

Tuesday, October 11, 2011

Moving iPhone Developer Credentials from one Mac to another

Update: So apparently in Xcode 4 (at least) there is an official way to do this... outlined here

I recently reinstalled OSX on my Mac and upgraded to Lion. Of course I forgot to transfer my iPhone developer credentials before I did it. I had to go back to the provisioning portal and setup my new certificate and get a new developer profile. While it wasn't a huge time waste I should have transferred my certificates and profile to save myself some time.

This is what I should have done.


  • Open Xcode

  • Window->Organizer
  • DEVELOPMENT -> Provisioning Profiles

  • Choose your Provisioning profile, right click and "Reveal in Finder"

  • Save the resulting file

  • Open Keychain Access

  • Export your private and public certificates to files and save them

  • Transfer all the file to your new system

  • Drag and drop Provisioning Profile into Xcode's Organiser on your new system

  • Import the certificates file you exported into Keychain Access on your new system



NOTE: There is a very annoying bug in Keychain Access that means you need to re-import your certificates at the command line. Attempting to you import you certificates using the Keychain Access GUI yields "An error has occurred. Unable to import an item. The contents of this item cannot be retrieved". This is just a blatant bug in Keychain Access you can import the files into Keychain Access at the command line with the following commands.

security import priv_key.p12 -k ~/Library/Keychains/login.keychain
security import pub_key.pem -k ~/Library/Keychains/login.keychain

Thursday, August 4, 2011

Xcode 3.2.6 and OSX Lion (10.7) - Make it install

Today I enthusiastically installed OSX Lion on my development system. I was probably stupidly naive to think it would be a straightforward upgrade.

Attempting to install Xcode 3.2.6, the version I currently prefer, it seemed to silently fail. I wasn't sure why. I did notice running the installation wizard; that at the point of selecting Installation Components the Xcode Tool Set component (Usually compulsory) was greyed out and marked as skip.



After some research, It seems support for Xcode 3.2.6 on Lion is somewhat neglected as Xcode 4.x is the future. Long story short I needed to use 3.2.6. It can be motivated to install on Lion.

After mounting the developer tools dmg you can open a terminal and issue the following commands to successfully install Xcode 3.2.6 on OSX Lion (10.7)

export COMMAND_LINE_INSTALL=1
open "/Volumes/Xcode and iOS SDK/Xcode and iOS SDK.mpkg"

Unity3D Asset Server: Best Practice Workflow - Initial Checkout

Using Unity in teams one is often stuck using Unity asset server. While it certainly lacks features one has grown accustomed to in many other source control systems the fact remains that it is the solution that most seamlessly works with Unity.

I think part of making the process of working with Unity Asset Server more enjoyable (apart form having experience with it) is to stick with some simple best practices.

Checking out a Unity project for the first time



  • Find out what the project is called. You can do this looking looking at the server via another project.

  • When opening Unity - choose to "Create new project". Give it the same name as the project is know by in asset server.

  • Open this new project and connect to the server (ALT-0 or CMD-0 depending on operating system)

  • Identify the project you are checking out and connect to it

  • Choose to Update

  • You'll be asked to make a decision about conflicting assets. Make sure you discard all existing files in the new project ("Discard My Changes"). This seems a little unintuitive but it makes sure you won't clutter your project or accidentally suck in unwanted files.

Thursday, July 21, 2011

Tell (automake) configure to use specific architecture on Mac OSX

Where we want to build 32 bit binary on OSX, and we know the codebase has a mix of C and C++ code.

ARCHFLAGS="-arch i386" CFLAGS="-arch i386" CPPFLAGS="-arch i386" LDFLAGS="-arch i386" ./configure

Monday, June 20, 2011

Xcode: iPhone or iPad application code sign error

This morning on a re-imaged OSX machine I attempted to compile an ipad application and I was rewarded with the error below.

codesign error: code signing identity 'iphone developer' does not match any code-signing certificate in your keychain. once added to the keychain, touch a file or clean the project to continue.

I was puzzled. I'd already made a developer certificate request to Apple, had it signed and installed it in my Keychain Access, I'd also downloaded and installed the Apple Worldwide Developer Relations Certification Authority certificate. I'd installed the required development profile that matched my ipad device Unique Identifier, my personal developer certificate and the application I am developing but still, every time I hit build it gave me a code sign error. I didn't get it.

At some point it a suspicion formed. In my Keychain Access I noticed my certificates where installed in the System keychain. I'm not even sure why they got installed there, I don't think I did it explicitly.

I moved my certificates to the login keychain which I assume belongs to the logged in user on OSX (i.e. myself). Attempting to re-compile the source code of my ipad project yield a positive result. Moving the certificates to the login keychain seemed to work! So I post my small solution here today in the hope that somebody else might benefit.

Thursday, June 16, 2011

Oh Magic Mouse! How do I hate thee.

While Apple have, over the years, had many design wins, there have also been some unfortunate design failures. The design failure that happens to torment me on a daily basis is Apple's Magic Mouse. Admittedly this bluetooth mouse is quite responsive and accurate as a pointing device, but it's the mouse's more esoteric features which are pimped as a unique selling point that really irk me. Namely the "multi touch surface", especially when used for scrolling.

The multi touch surface is just far too sensitive and easily triggered when you're just using the mouse to move the pointer. As a coder I spend most of my day in text editors. I'm always accidentally scrolling the text window up and down; even worse - when using the command key and accidentally scrolling, the most common behaviour is to zoom. Not helpful. Give me an old fashioned scroll wheel any day. Likewise in a 3D modelling package I often find myself accidentally zooming.

It's back to the simple $20 mouse for me. On a similar note I have a theory about the efficacy of mice based on price. The sweet spot on mouse functionality is definitely around the $20 mark. Pay more and "features" get in the way. Pay less and accuracy, reliability and that comforting solid hand weight quality possessed by a good mouse are absent.