Self Renderable Scene Object
From Yogurt3D Wiki
The main rendering handles all object the same way. If you have a scene object that should be rendered differently you can use this solution. To create a self renderable object your class SHOULD implement ISelfRenderable interface. When the renderer sees that your class will handle it's rendering it self, it will call the render methof on your object.
Below os a sample self rendering object.
package
{
import com.adobe.utils.AGALMiniAssembler;
import com.yogurt3d.core.cameras.interfaces.ICamera;
import com.yogurt3d.core.namespaces.YOGURT3D_INTERNAL;
import com.yogurt3d.core.sceneobjects.SceneObjectRenderable;
import com.yogurt3d.core.sceneobjects.interfaces.ISelfRenderable;
import com.yogurt3d.core.utils.ShaderUtils;
import flash.display3D.Context3D;
import flash.display3D.Context3DCompareMode;
import flash.display3D.Context3DProgramType;
import flash.display3D.Context3DVertexBufferFormat;
import flash.display3D.IndexBuffer3D;
import flash.display3D.Program3D;
import flash.display3D.VertexBuffer3D;
import flash.geom.Matrix3D;
import flash.utils.ByteArray;
public class SelfRenderableSceneObject extends SceneObjectRenderable implements ISelfRenderable
{
var shader:ByteArray;
var compiledShader:Program3D;
public function SelfRenderableSceneObject():void{
super();
}
public function render(_context:Context3D, _camera:ICamera):void
{
_context.enableErrorChecking = true;
if( !compiledShader )
{
compiledShader = _context.createProgram();
compileShader();
}
_context.setProgram( compiledShader );
var matrix:Matrix3D = new Matrix3D();
matrix.copyFrom( _camera.transformation.matrixGlobal );
matrix.invert();
matrix.prepend( transformation.matrixGlobal );
matrix.append( _camera.projectionMatrix );
_context.setDepthTest( false, Context3DCompareMode.LESS_EQUAL );
_context.setProgramConstantsFromMatrix( Context3DProgramType.VERTEX, 0, matrix, true );
_context.setProgramConstantsFromVector( Context3DProgramType.FRAGMENT, 0, Vector.<Number>([1,0,0,1]), 1 );
var vertexBuffer:VertexBuffer3D = geometry.subMeshList[0].getVertexBufferByContext3D( _context );
var indiceBuffer:IndexBuffer3D = geometry.subMeshList[0].getIndexBufferByContext3D( _context );
_context.setVertexBufferAt( 0, vertexBuffer, 0, Context3DVertexBufferFormat.FLOAT_3 );
_context.drawTriangles( indiceBuffer, 0, geometry.triangleCount );
}
private function compileShader():void{
compiledShader.upload( ShaderUtils.vertexAssambler.assemble( AGALMiniAssembler.VERTEX, "m44 op, va0, vc0\n" ),
ShaderUtils.fragmentAssambler.assemble( AGALMiniAssembler.FRAGMENT, "mov ft0, fc0\nmov oc, ft0" )
);
}
}
}