<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Helidium's Blog</title>
	<atom:link href="http://helidium.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://helidium.wordpress.com</link>
	<description>Just another WordPress.com weblog</description>
	<lastBuildDate>Mon, 24 Nov 2008 16:27:50 +0000</lastBuildDate>
	<generator>http://wordpress.com/</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<cloud domain='helidium.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://www.gravatar.com/blavatar/a04a1498497c71606cd0a9ead777b338?s=96&#038;d=http://s.wordpress.com/i/buttonw-com.png</url>
		<title>Helidium's Blog</title>
		<link>http://helidium.wordpress.com</link>
	</image>
			<item>
		<title>Flash 10 &#8211; Astro 3DS Loader</title>
		<link>http://helidium.wordpress.com/2008/10/14/flash10-astro-3ds-loader/</link>
		<comments>http://helidium.wordpress.com/2008/10/14/flash10-astro-3ds-loader/#comments</comments>
		<pubDate>Tue, 14 Oct 2008 12:50:45 +0000</pubDate>
		<dc:creator>Helidium</dc:creator>
				<category><![CDATA[Flash 10 - Astro 3DS Loader]]></category>

		<guid isPermaLink="false">http://helidium.wordpress.com/?p=16</guid>
		<description><![CDATA[Just some example code to load 3DS files into flash. Not really finished, what is missing is to seperate map loading (Texture, Specular, Reflection), also it would eb nice to implement the keyframe loader, but that in some time to come. Oh and one more thing, the code for Mesh, Model objects is not published, [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=helidium.wordpress.com&blog=4295003&post=16&subd=helidium&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Just some example code to load 3DS files into flash. Not really finished, what is missing is to seperate map loading (Texture, Specular, Reflection), also it would eb nice to implement the keyframe loader, but that in some time to come. Oh and one more thing, the code for Mesh, Model objects is not published, it will be in time later:</p>
<p>package Lib.Mesh<br />
{<br />
import __AS3__.vec.Vector;<br />
import flash.events.Event;<br />
import flash.events.EventDispatcher;<br />
import flash.geom.Vector3D;<br />
import flash.net.URLLoader;<br />
import flash.net.URLLoaderDataFormat;<br />
import flash.net.URLRequest;<br />
import flash.utils.ByteArray;</p>
<p>public class MeshLoader extends EventDispatcher<br />
{<br />
public static var MESH_LOADED:String = &#8220;mesh_loaded&#8221;;<br />
private var loader:URLLoader = null;<br />
public var mesh:Mesh = null; // My own class for holding all the mesh data</p>
<p>public function MeshLoader() // Constructor<br />
{<br />
}</p>
<p>public function Load3DS(mURL:String):void { // The start loading function, notice no error checking, assuming all ok<br />
var urlR:URLRequest = new URLRequest(mURL);<br />
loader = new URLLoader();<br />
loader.dataFormat = URLLoaderDataFormat.BINARY;<br />
loader.addEventListener(Event.COMPLETE, MeshLoaded);<br />
loader.load(urlR);<br />
}</p>
<p>private function MeshLoaded(e:Event):void { // Actual loading function<br />
var ChunkID:int = 0;<br />
var ChunkLength:int = 0;</p>
<p>var ColorMode:String = &#8220;Ambient&#8221;;<br />
var MaterialMapMode:String = &#8220;Texture&#8221;;<br />
var currMeshObject:int = -1;<br />
var currMeshMaterial:int = -1;<br />
var MObj:MeshObject = null; // generic MeshObject to be used<br />
var MFace:MeshFace = null; // generic MeshFace to be used<br />
var MVertex:MeshVertex = null; // generic MeshVertex to be used<br />
var MTexcoord:MeshTexCoord = null; // generic MeshTexCoord to be used<br />
var MMaterial:MeshMaterial = null; // generic MeshMaterial to be used</p>
<p>try { // lets give it a shot<br />
var data:ByteArray = loader.data;<br />
data.endian = &#8220;littleEndian&#8221;; // Make sure we use little endian<br />
var tmpData:ByteArray = new ByteArray();</p>
<p>while(data.bytesAvailable &gt; 0) {<br />
<strong> </strong>// read the chunkID<br />
<strong> </strong>ChunkID = data.readUnsignedShort();</p>
<p><strong> </strong>// read the Chunk length<br />
<strong> </strong>ChunkLength = data.readUnsignedInt();</p>
<p><strong> </strong>switch(ChunkID) {<br />
<strong> </strong>case 0&#215;4D4D: // Main Chunk<br />
<strong> </strong>mesh = new Mesh();<br />
<strong> </strong>break;<br />
<strong> </strong>case 0&#215;3D3D: // 3D Editor Chunk<br />
<strong> </strong>break;<br />
<strong> </strong>case 0&#215;4000: // Object Chunk<br />
<strong> </strong>currMeshObject++;</p>
<p><strong> </strong>// here load the name of the object<br />
<strong> </strong>var obi:uint = 0;<br />
<strong> </strong>var name:String = &#8220;&#8221;;<br />
<strong> </strong>var rc:String = &#8220;&#8221;;<br />
<strong> </strong>var rb:int = 0;</p>
<p><strong> </strong>do {<br />
<strong> </strong>rb = data.readByte();<br />
<strong> </strong> rc = String.fromCharCode(rb);<br />
<strong> </strong>name += rc;<br />
<strong> </strong>obi++;<br />
<strong> </strong>} while(rb != 0 &amp;&amp; obi&lt;20);</p>
<p><strong> </strong>var MObject:MeshObject = new MeshObject();<br />
<strong> </strong>MObject.setName(name);</p>
<p><strong> </strong>mesh.addObject(MObject);<br />
<strong> </strong>break;<br />
<strong> </strong>case 0&#215;4100: // Triangular Mesh Chunk<br />
<strong> </strong>break;<br />
<strong> </strong>case 0&#215;4110: // Mesh Vertex Chunk<br />
<strong> </strong>var NumVertices:uint = 0;<br />
<strong> </strong>NumVertices = data.readUnsignedShort();<br />
<strong> </strong>var VerticesArray:Vector.&lt;MeshVertex&gt; = new Vector.&lt;MeshVertex&gt;();</p>
<p><strong> </strong>for(var vi:uint = 0; vi &lt; NumVertices; vi++) {<br />
<strong> </strong>var x:Number = data.readFloat();<br />
<strong> </strong>var y:Number = data.readFloat();<br />
<strong> </strong>var z:Number = data.readFloat();</p>
<p><strong> </strong>MVertex = new MeshVertex();<br />
<strong> </strong>MVertex.setPosition(new Vector3D(x, y, z, 0));</p>
<p><strong> </strong>VerticesArray.push(MVertex);<br />
<strong> </strong>}</p>
<p><strong> </strong>MObj = mesh.getObjectList()[currMeshObject];<br />
<strong> </strong>MObj.setVertexList(VerticesArray);<br />
<strong> </strong>break;<br />
<strong> </strong>case 0&#215;4120: // Mesh Face Chunk<br />
<strong> </strong>var NumFaces:uint = 0;<br />
<strong> </strong>NumFaces = data.readUnsignedShort();<br />
<strong> </strong>var FacesArray:Vector.&lt;MeshFace&gt; = new Vector.&lt;MeshFace&gt;();<br />
<strong> </strong>MObj = mesh.getObjectList()[currMeshObject];</p>
<p><strong> </strong>for(var fi:uint = 0; fi &lt; NumFaces; fi++) {<br />
<strong> </strong>var fa:Number = data.readUnsignedShort();<br />
<strong> </strong>var fb:Number = data.readUnsignedShort();<br />
<strong> </strong>var fc:Number = data.readUnsignedShort();<br />
<strong> </strong>var FaceFlags:Number = data.readUnsignedShort();<br />
<strong> </strong>var VList:Vector.&lt;MeshVertex&gt; = new Vector.&lt;MeshVertex&gt;();</p>
<p><strong> </strong>VList.push(MObj.getVertexList()[fa]);<br />
<strong> </strong>VList.push(MObj.getVertexList()[fb]);<br />
<strong> </strong>VList.push(MObj.getVertexList()[fc]);</p>
<p><strong> </strong>MFace = new MeshFace();<br />
<strong> </strong>MFace.setFaceVertices(VList);<br />
<strong> </strong>MFace.setFaceIndices(new Vector3D(fa, fb, fc, FaceFlags));</p>
<p><strong> </strong>FacesArray.push(MFace);<br />
<strong> </strong>}</p>
<p><strong> </strong>MObj.setFaceList(FacesArray);<br />
<strong> </strong>break;<br />
<strong> </strong>case 0&#215;4130: // Mesh Face Material Chunk<br />
<strong> </strong>var mi:uint = 0;<br />
<strong> </strong>var mname:String = &#8220;&#8221;;<br />
<strong> </strong>var mrc:String = &#8220;&#8221;;<br />
<strong> </strong>var mrb:int = 0;</p>
<p><strong> </strong>do {<br />
<strong> </strong>mrb = data.readByte();<br />
<strong> </strong>mrc = String.fromCharCode(mrb);<br />
<strong> </strong>mname += mrc;<br />
<strong> </strong>mi++;<br />
<strong> </strong>} while(mrb != 0 &amp;&amp; mi&lt;20);</p>
<p><strong> </strong>mname = mname.substr(0, mname.length-1);<br />
<strong> </strong>MMaterial = mesh.getMaterialByName(mname);</p>
<p><strong> </strong>var NumMaterialFaces:uint = 0;<br />
<strong> </strong>var MaterialFacesArray:Vector.&lt;Number&gt; = new Vector.&lt;Number&gt;();<br />
<strong> </strong>NumMaterialFaces = data.readUnsignedShort();</p>
<p><strong> </strong>MObj = mesh.getObjectList()[currMeshObject];</p>
<p><strong> </strong>for(var mfi:uint=0; mfi &lt; NumMaterialFaces; mfi++) {<br />
<strong> </strong>var mfIndex:Number = data.readUnsignedShort();<br />
<strong> </strong>MFace = MObj.getFaceList()[mfIndex];<br />
<strong> </strong>MFace.setFaceMaterialName(mname);<br />
<strong> </strong>MFace.setFaceMaterialIndex(MMaterial.getMaterialIndex());<br />
<strong> </strong>}<br />
<strong> </strong>break;<br />
<strong> </strong>case 0&#215;4140: // Mesh Vertex TexCoord Chunk<br />
<strong> </strong>var NumUVs:uint = 0;<br />
<strong> </strong>NumUVs = data.readUnsignedShort();<br />
<strong> </strong>var UVsArray:Vector.&lt;MeshTexCoord&gt; = new Vector.&lt;MeshTexCoord&gt;();<br />
<strong> </strong>for(var uvi:uint = 0; uvi &lt; NumUVs; uvi++) {<br />
<strong> </strong>var u:Number = data.readFloat();<br />
<strong> </strong>var v:Number = data.readFloat();<br />
<strong> </strong>var MTexCoord:MeshTexCoord = new MeshTexCoord();</p>
<p><strong> </strong>MTexCoord.setTexCoord(new Vector3D(u, v, 0, 0));<br />
<strong> </strong>VerticesArray[uvi].setTexCoord(new Vector3D(u, v, 0, 0));<br />
<strong> </strong>UVsArray.push(MTexCoord);<br />
<strong> </strong>}<br />
<strong> </strong>break;<br />
<strong> </strong>case 0&#215;4160: // Mesh Object Pivot Chunk<br />
<strong> </strong>var TMV:Vector.&lt;Number&gt; = new Vector.&lt;Number&gt;();<br />
<strong> </strong>for(var tmvi:uint=0; tmvi&lt;12; tmvi++) {<br />
<strong> </strong>TMV.push(data.readFloat());<br />
<strong> </strong>}</p>
<p><strong> </strong>var V:Vector.&lt;Number&gt; = Vector.&lt;Number&gt;([TMV[0], TMV[1], TMV[2], new Number(0), TMV[3], TMV[4], TMV[5], new Number(0), TMV[6], TMV[7], TMV[8], new Number(0), TMV[9], TMV[10], TMV[11], new Number(1)]);<br />
<strong> </strong>var M:flash.geom.Matrix3D = new flash.geom.Matrix3D(V);<br />
<strong> </strong>mesh.getObjectList()[currMeshObject].setTransformMatrix(M);<br />
<strong> </strong>var tmviC:uint = 0;<br />
<strong> </strong>break;<br />
<strong> </strong>case 0xAFFF: // Material Chunk<br />
<strong> </strong>currMeshMaterial++;<br />
<strong> </strong>MMaterial = new MeshMaterial();<br />
<strong> </strong>MMaterial.setMaterialIndex(currMeshMaterial);<br />
<strong> </strong>mesh.addMaterial(MMaterial);<br />
<strong> </strong>break;<br />
<strong> </strong>case 0xA000: // Material Name Chunk<br />
<strong> </strong>var mti:uint = 0;<br />
<strong> </strong>var mtname:String = &#8220;&#8221;;<br />
<strong> </strong>var mtrc:String = &#8220;&#8221;;<br />
<strong> </strong>var mtrb:int = 0;</p>
<p><strong> </strong>do {<br />
<strong> </strong>mtrb = data.readByte();<br />
<strong> </strong>mtrc = String.fromCharCode(mtrb);<br />
<strong> </strong>mtname += mtrc;<br />
<strong> </strong>mti++;<br />
<strong> </strong>} while(mtrb != 0 &amp;&amp; mti&lt;20);</p>
<p><strong> </strong>mtname = mtname.substr(0, mtname.length-1);<br />
<strong> </strong>MMaterial = mesh.getMaterialList()[currMeshMaterial];<br />
<strong> </strong>MMaterial.setMaterialName(mtname);<br />
<strong> </strong>break;<br />
<strong> </strong>case 0xA010: // Material Color Type Chunk (In our case)<br />
<strong> </strong>ColorMode = &#8220;Ambient&#8221;;<br />
<strong> </strong>break;<br />
<strong> </strong>case 0xA020:<br />
<strong> </strong>ColorMode = &#8220;Diffuse&#8221;;<br />
<strong> </strong>break;<br />
<strong> </strong>case 0xA030:<br />
<strong> </strong>ColorMode = &#8220;Specular&#8221;;<br />
<strong> </strong>break;<br />
<strong> </strong>case 0&#215;0011: // Color Chunk<br />
<strong> </strong>var matRed:uint = data.readUnsignedByte();<br />
<strong> </strong>var matGreen:uint = data.readUnsignedByte();<br />
<strong> </strong>var matBlue:uint = data.readUnsignedByte();</p>
<p><strong> </strong>MMaterial = mesh.getMaterialList()[currMeshMaterial];</p>
<p><strong> </strong>switch(ColorMode) {<br />
<strong> </strong>case &#8220;Ambient&#8221;:<br />
<strong> </strong>MMaterial.setMaterialAmbientColor(new Vector3D(matRed, matGreen, matBlue));<br />
<strong> </strong>break;<br />
<strong> </strong>case &#8220;Diffuse&#8221;:<br />
<strong> </strong>MMaterial.setMaterialDiffuseColor(new Vector3D(matRed, matGreen, matBlue));<br />
<strong> </strong>break;<br />
<strong> </strong>case &#8220;Specular&#8221;:<br />
<strong> </strong>MMaterial.setMaterialSpecularColor(new Vector3D(matRed, matGreen, matBlue));<br />
<strong> </strong>break;<br />
<strong> </strong>}<br />
<strong> </strong>break;<br />
<strong> </strong>case 0xA200: // Material TextureMapChunk<br />
<strong> </strong>break;<br />
<strong> </strong>case 0xA300: // Material Map Name (In our case Texture Map, Dont use other texture Maps, otherwise implement other maps)<br />
<strong> </strong>var mtmi:uint = 0;<br />
<strong> </strong>var mtmurl:String = &#8220;&#8221;;<br />
<strong> </strong>var mtmrc:String = &#8220;&#8221;;<br />
<strong> </strong>var mtmrb:int = 0;</p>
<p><strong> </strong>do {<br />
<strong> </strong>mtmrb = data.readByte();<br />
<strong> </strong>mtmrc = String.fromCharCode(mtmrb);<br />
<strong> </strong>mtmurl += mtmrc;<br />
<strong> </strong>mtmi++;<br />
<strong> </strong>} while(mtmrb != 0 &amp;&amp; mtmi&lt;20);</p>
<p><strong> </strong>mtmurl = mtmurl.substr(0, mtmurl.length-1);<br />
<strong> </strong>MMaterial = mesh.getMaterialList()[currMeshMaterial];</p>
<p><strong> </strong>switch(MaterialMapMode) {<br />
<strong> </strong>case &#8220;Texture&#8221;:<br />
<strong> </strong>MMaterial = mesh.getMaterialList()[currMeshMaterial];<br />
<strong> </strong>MMaterial.setMaterialTextureMapURL(mtmurl);<br />
<strong> </strong>break;<br />
<strong> </strong>}<br />
<strong> </strong>break;<br />
<strong> </strong>default:<br />
<strong> </strong>for(var di:uint=0; di&lt;ChunkLength-6; di++)<br />
<strong> </strong>data.readByte();<br />
}<br />
}<br />
} catch(te:TypeError) {<br />
trace(te.toString());<br />
}<br />
dispatchEvent(new Event(MESH_LOADED));<br />
}<br />
}<br />
}</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/helidium.wordpress.com/16/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/helidium.wordpress.com/16/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/helidium.wordpress.com/16/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/helidium.wordpress.com/16/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/helidium.wordpress.com/16/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/helidium.wordpress.com/16/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/helidium.wordpress.com/16/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/helidium.wordpress.com/16/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/helidium.wordpress.com/16/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/helidium.wordpress.com/16/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=helidium.wordpress.com&blog=4295003&post=16&subd=helidium&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://helidium.wordpress.com/2008/10/14/flash10-astro-3ds-loader/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/373c90cdc7ccd6f469ca2516268c3541?s=96&#38;d=identicon" medium="image">
			<media:title type="html">Helidium</media:title>
		</media:content>
	</item>
	</channel>
</rss>