Skip to content

Instantly share code, notes, and snippets.

@b005t3r
Last active December 28, 2015 03:09
Show Gist options
  • Save b005t3r/7433340 to your computer and use it in GitHub Desktop.
Save b005t3r/7433340 to your computer and use it in GitHub Desktop.
Z-sorting of alpha blended, non top-level objects bug fix. Object3D's scenePosition has to be used instead of its local position.
override public function applyRenderable(renderable:IRenderable):void
{
var material:MaterialBase;
var entity:Entity = renderable.sourceEntity;
if (renderable.mouseEnabled)
++_numMouseEnableds;
_numTriangles += renderable.numTriangles;
material = renderable.material;
if (material) {
var item:RenderableListItem = _renderableListItemPool.getItem();
item.renderable = renderable;
item.materialId = material._uniqueId;
item.renderOrderId = material._renderOrderId;
item.cascaded = false;
var scenePos:Vector3D = entity.scenePosition;
var dx:Number = _entryPoint.x - scenePos.x;
var dy:Number = _entryPoint.y - scenePos.y;
var dz:Number = _entryPoint.z - scenePos.z;
// project onto camera's z-axis
item.zIndex = dx*_cameraForward.x + dy*_cameraForward.y + dz*_cameraForward.z + entity.zOffset;
item.renderSceneTransform = renderable.getRenderSceneTransform(_camera);
if (material.requiresBlending) {
item.next = _blendedRenderableHead;
_blendedRenderableHead = item;
} else {
item.next = _opaqueRenderableHead;
_opaqueRenderableHead = item;
}
}
}
override public function applyRenderable(renderable:IRenderable):void
{
// the test for material is temporary, you SHOULD be hammered with errors if you try to render anything without a material
var material:MaterialBase = renderable.material;
var entity:Entity = renderable.sourceEntity;
if (renderable.castsShadows && material) {
var item:RenderableListItem = _renderableListItemPool.getItem();
item.renderable = renderable;
item.next = _opaqueRenderableHead;
item.cascaded = false;
var scenePos:Vector3D = entity.scenePosition;
var dx:Number = _entryPoint.x - scenePos.x;
var dy:Number = _entryPoint.y - scenePos.y;
var dz:Number = _entryPoint.z - scenePos.z;
item.zIndex = dx*_cameraForward.x + dy*_cameraForward.y + dz*_cameraForward.z;
item.renderSceneTransform = renderable.getRenderSceneTransform(_camera);
item.renderOrderId = material._depthPassId;
_opaqueRenderableHead = item;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment