Alex Darby the Gamer Camp Technical Director sent this message to the code team on how to post technical enquiries to tech forums. It was a good, useful piece from Alex so I thought it would be good to share on the Blog, any student names have been removed from the original message. – Oliver Williams, Gamer Camp Studio Director
I was just reposting this post from a Gamer Camp student onto the PS3 forums, and I felt I had to change it a little to attempt to get a useful response.
After checking with the student, I thought it might be instructional to show you a before and after so you can see how I have re-written it.
Here’s the before:
Hi everyone, I’m currently working with PhyreEngine at GamerCamp. I’m learning it pretty well for the most part, however in our experimenting I’ve got myself a bit stuck. In the examples, in particular the Animation example, a file is specified to load for the Fella model – “Media/GL/DonkeyTrader/fellanmap.dae.phyre”. Iterating over this using a for loop of type PCluster::PObjectIteratorOfType<PAssetReferenceImport> allows me to find the Fella’s references, which are a standard texture, a normal map, and two shaders, which I can then load. My next step is extending this functionality such that from a given level file, I can load the entirety of it as a cluster, but then also locate and manage the clusters it references. For example I could then, just from a level file, be able to have full control over everything contained within it, rather than have individual parts of the level declared and added separately. My problem is that when iterating over a test level that contains a single textured and lit cube, the object iterator IDs return two references, one to TestModel.dae#colladafxShader1 and one to TestModel.dae#pCubeShape1. Obviously these are the shader and geometry, with the hash (and lack of file extension) I assume to be indicating that these are contained within the main cube dae file. However, there’s no reference to load the texture (which I can see exists if I examine the dae file in a text editor). Essentially: I’d like to know how to get individual clusters out of the .plv in such a way that we can manage those objects ourselves using just the level file.
Thanks in advance for any assistance!
From Gamer Camp Student
There’s nothing fundamentally wrong with it at face value…
It’s well written, coherent English, it explains the problem succinctly, and asks a specific question – these are all Very Good Things.
However, believe it or not this communication via email / forum posts is actually harder than you’d think; so hard, in fact, that Activision run compulsory internal courses on effective email communication for team leads and managers…
So, here’s my take on the same material which is what I’ve posted to the PS3 developers PhyreEngine forums:
We’re currently trying to write some code that will recursively iterate a .plv file and individually load all the asset files it references – this is because we want to sit an asset manager on top of Phyre (e.g. to stop the same asset trying to load > once even if it’s in multiple .daes etc.)
The first thing we tried was to load “Media/GL/DonkeyTrader/fellanmap.dae.phyre” (as used in the animation example) manually instead of loading the assets via the header generated from the assets.xml file.
By hunting about in the samples, we found that Iterating over this .dae using Cluster::PObjectIteratorOfType<PAssetReferenceImport> would allow us to find the files referenced by it (i.e. in this case a standard texture, a normal map, and two shaders)
Importantly, the references contain the paths to the referenced assets, which we can then use to load them individually.
We have a test asset – a real time lit cube with a single texture – that we exported from maya to test the pipeline and this works fine (i.e. renders fully textured and real time lit) if we put it into an asset .xml and load it in the same way the samples load assets.
When we try to load this test mesh in the same way we loaded fellanmap.dae (by loading and iterating the cluster to find out its references) the object iterator finds just two references:
Obviously these appear to be the shader and geometry, but there’s no reference to a texture; and no path information.
We’re assuming that the # and lack of file extension indicate that these are contained within the data in the dae file.
If we look in the xml version of the collada file for TestModel.dae we can see that the texture is clearly referenced within it.
We’re wondering if this means the differences between the asset references in TestModel.dae and fellanmap.dae might result from differences in the way they’re being handled by the asset processor or something…
We’re at a loss as to:
1) why the content of our TestModel.dae might be so different from fellanmap.dae
2) why TestModel.dae works with the asset.xml -> auto generated header technique when it doesn’t seem to contain any reference to the texture it requires
3) why the assets seem to have been embedded in TestModel.dae
4) why the .xml version of TestModel.dae clearly contains the texture, but the platform specific data produced doesn’t
and wondered if someone could point us in the right direction?
Sorry if this is obvious and we’ve missed the relevant documentation / sample code!
Any help appreciated,
So, what’s different?
- Well, firstly I’m stating what we’re trying to do, and why, clearly and right at the start. This sets the context for the rest of the information, so it’s important information to have before reading the rest of it.
- I’m also using way more paragraphs than you would in regular prose – more or less one per sentence in fact.
- This is sort of an un-bulleted bullet point – it says exactly one thing, and leaves space before the next bit of information to make sure it’s not lost in the reading of it.
- Whenever I might use a comma separated list, but I want to be 100% clear about the elements of that list, I’m using bullet points.
- When I get to the end, my “summary” is a very clear multi-part question that is very specific (numbered bullets!) about the information that doesn’t make sense to us and that we’d like explained.
- Finally, I’m signing off in a way that says we’re friendly, and acknowledge that the people on the forum are basically doing us a favour – politeness is always good 🙂
All of this is geared up to make the key information I’m sending to them clear, and make it as clear as possible what I’m hoping for in a reply.
I hope that all makes sense (and that I get a useful answer from the dev forums after this email 😉
Latest posts by Oliver Williams (see all)
- Art Director Iain Harrison, Develop Interview July 2013 - July 15, 2013
- Recruiting Programming Talent - July 1, 2013
- Posting Questions on Tech Forum – Tips on how to do this better - March 15, 2013