aerys / minko Goto Github PK
View Code? Open in Web Editor NEW3D framework for web, desktop and mobile devices.
Home Page: http://minko.io
License: Other
3D framework for web, desktop and mobile devices.
Home Page: http://minko.io
License: Other
_invalidMinMax is now being reset to false, but updateMinMax() method is still called in initialize() only.
ShaderPart has undefined property screenToViewMatrix
scene.properties.setProperties({
lightEnabled : true,
TeapotsExample.as
Example, using self made Shader
package {
import aerys.minko.render.Effect;
import aerys.minko.render.geometry.primitive.CubeGeometry;
import aerys.minko.render.material.basic.BasicMaterial;
import aerys.minko.render.material.basic.BasicProperties;
import aerys.minko.render.resource.texture.TextureResource;
import aerys.minko.scene.node.Mesh;
import aerys.minko.type.loader.TextureLoader;
import flash.events.Event;
public class Main extends MinkoExampleApplication {
[Embed("../assets/egg_bomb.png")]
private static const ASSET_TEXTURE:Class;
override protected function initializeScene() : void {
super.initializeScene();
createObjects();
}
private function createObjects():void {
var texture:TextureResource = TextureLoader.loadClass(ASSET_TEXTURE);
var m:Mesh = new Mesh(CubeGeometry.cubeGeometry, new BasicMaterial(null, new Effect(new TestShader())) );
scene.addChild(m);
m.properties.setProperty(BasicProperties.DIFFUSE_MAP, texture);
}
}
}
import aerys.minko.render.geometry.stream.format.VertexComponent;
import aerys.minko.render.material.basic.BasicProperties;
import aerys.minko.render.shader.SFloat;
import aerys.minko.render.shader.Shader;
class TestShader extends Shader {
override protected function getVertexPosition(): SFloat {
return localToScreen( getVertexAttribute(VertexComponent.XYZ) );
}
override protected function getPixelColor(): SFloat {
var diffuseMap: SFloat = meshBindings.getTextureParameter(BasicProperties.DIFFUSE_MAP);
return sampleTexture(diffuseMap, interpolate(vertexUV.xy));
}
}
Result:
TypeError: Error #1009: Cannot access a property or method of a null object reference.
at aerys.minko.render::DrawCall/apply()[\aerys\minko\render\DrawCall.as:315]
at aerys.minko.scene.controller.scene::RenderingController/render()[\aerys\minko\scene\controller\scene\RenderingController.as:299]
at aerys.minko.scene.node::Scene/render()[\aerys\minko\scene\node\Scene.as:179]
if at first set texture - no error
m.properties.setProperty(BasicProperties.DIFFUSE_MAP, texture);
scene.addChild(m);
Shadow maps are not redrawn when the transformation of a light is changed. The light source correctly lights pixels, however shadow maps are not recalculated.
It seems to me that the DirectionalLight transform doesn't work.
_light.transform.setTranslation(0, -100, 0);
In the directional light example, the light source didn't change it's position.
The shadows are on the same wall as before.
Regards!
See:
https://github.com/aerys/minko/blob/master/src/aerys/minko/render/shader/part/ShaderPart.as#L763
I think it should be r = 2_(n_l)*n - l, which is
subtract(multiply(2, dotProduct3(vector, normal), normal), vector);
not
subtract(vector, multiply(2, dotProduct3(vector, normal), normal));
When you rotate something unexpected behavior happens when Y rotation is between 1/2 * Pi and 3/2 * Pi (90 and 270 degrees). In this sample it just changes rotation direction, while in our actual scene sample model gets flipped upside-down (and also it's flipping directional light for us)
package aerys.minko.example.collada.seymourplane
{
import aerys.minko.scene.node.AbstractSceneNode;
import aerys.minko.scene.node.Scene;
import aerys.minko.type.loader.ILoader;
import aerys.minko.type.loader.SceneLoader;
import aerys.minko.type.loader.TextureLoader;
import aerys.minko.type.loader.parser.ParserOptions;
import aerys.minko.type.parser.collada.ColladaParser;
import flash.events.KeyboardEvent;
import flash.ui.Keyboard;
import flash.net.URLRequest;
public class SeymourPlaneExample extends MinkoExampleApplication
{
private var _node:AbstractSceneNode;
override protected function initializeScene():void
{
super.initializeScene();
cameraController.distance = 30;
cameraController.distanceStep = 1;
var options : ParserOptions = new ParserOptions();
options.parser = ColladaParser;
options.loadDependencies = true;
options.mipmapTextures = true;
options.dependencyLoaderClosure = dependencyLoaderClosure;
scene.load(new URLRequest("../assets/seymour_plane/seymourplane.DAE"), options);
scene.descendantAdded.add(onAdded);
}
private function onAdded(param1:Scene, param2:Object):void
{
_node = param2 as AbstractSceneNode;
stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown);
}
private function onKeyDown(e:KeyboardEvent):void
{
switch (e.keyCode)
{
case Keyboard.LEFT:
_node.rotationY += Math.PI / 8;
break;
case Keyboard.RIGHT:
_node.rotationY -= Math.PI / 8;
break;
default:
}
}
private function dependencyLoaderClosure(dependencyPath : String,
isTexture : Boolean,
options : ParserOptions) : ILoader
{
var loader : ILoader;
if (isTexture)
{
var correctedURL : String = "../assets/seymour_plane/"
+ dependencyPath.match(/^.*\/([^\/]+)\..*$/)[1]
+ ".jpg";
loader = new TextureLoader(true);
loader.load(new URLRequest(correctedURL));
}
else
{
loader = new SceneLoader(options);
loader.load(new URLRequest(dependencyPath));
}
return loader;
}
}
}
Error: Another Dataprovider is already declaring the 'skinningNumBones' property.
at aerys.minko.type.data::DataBindings/addProvider()[F:\minko2\mapEditor\src\aerys\minko\type\data\DataBindings.as:53]
at aerys.minko.scene.controller.mesh::SkinningController/targetAddedHandler()[F:\minko2\mapEditor\src\aerys\minko\scene\controller\mesh\SkinningController.as:231]
at Function/http://adobe.com/AS3/2006/builtin::apply()
at aerys.minko.type::Signal/execute()[F:\minko2\mapEditor\src\aerys\minko\type\Signal.as:81]
at aerys.minko.scene.controller::AbstractController/addTarget()[F:\minko2\mapEditor\src\aerys\minko\scene\controller\AbstractController.as:82]
at aerys.minko.scene.node::AbstractSceneNode/addController()[F:\minko2\mapEditor\src\aerys\minko\scene\node\AbstractSceneNode.as:222]
at aerys.minko.scene.node::AbstractSceneNode/copyControllersFrom()[F:\minko2\mapEditor\src\aerys\minko\scene\node\AbstractSceneNode.as:302]
at aerys.minko.scene.node.mesh::Mesh/copyFrom()[F:\minko2\mapEditor\src\aerys\minko\scene\node\mesh\Mesh.as:297]
at aerys.minko.scene.node.mesh::Mesh/clone()[F:\minko2\mapEditor\src\aerys\minko\scene\node\mesh\Mesh.as:252]
at aerys.minko.scene.node::Group/clone()[F:\minko2\mapEditor\src\aerys\minko\scene\node\Group.as:351]
at aerys.minko.scene.node::Group/clone()[F:\minko2\mapEditor\src\aerys\minko\scene\node\Group.as:351]
at aerys.minko.scene.node::Group/clone()[F:\minko2\mapEditor\src\aerys\minko\scene\node\Group.as:351]
at aerys.map::mapWorks/onImportComplete()[F:\minko2\mapEditor\src\aerys\map\mapWorks.as:114]
at Function/http://adobe.com/AS3/2006/builtin::apply()
at aerys.minko.type::Signal/execute()[F:\minko2\mapEditor\src\aerys\minko\type\Signal.as:81]
at aerys.minko.type.loader::SceneLoader/onParseComplete()[F:\minko2\mapEditor\src\aerys\minko\type\loader\SceneLoader.as:207]
at Function/http://adobe.com/AS3/2006/builtin::apply()
at aerys.minko.type::Signal/execute()[F:\minko2\mapEditor\src\aerys\minko\type\Signal.as:81]
at aerys.minko.types.parser::mapParser/afterAllAttachment()[F:\minko2\mapEditor\src\aerys\minko\types\parser\mapParser.as:102]
at Function/http://adobe.com/AS3/2006/builtin::apply()
at aerys.minko.type::Signal/execute()[F:\minko2\mapEditor\src\aerys\minko\type\Signal.as:81]
at aerys.minko.types.parser.sceneDeserializer::SceneDeserializer/readyForAttachment()[F:\minko2\mapEditor\src\aerys\minko\types\parser\sceneDeserializer\SceneDeserializer.as:216]
at aerys.minko.types.parser.sceneDeserializer::SceneDeserializer/decrementDependencyCounter()[F:\minko2\mapEditor\src\aerys\minko\types\parser\sceneDeserializer\SceneDeserializer.as:191]
at Function/http://adobe.com/AS3/2006/builtin::apply()
at aerys.minko.type::Signal/execute()[F:\minko2\mapEditor\src\aerys\minko\type\Signal.as:81]
at aerys.minko.type.loader::TextureLoader/loadBytesCompleteHandler()[F:\minko2\mapEditor\src\aerys\minko\type\loader\TextureLoader.as:163]
The following exception is encountered when using setExtraPasses() while the application is running.
In my circumstances, I have an effect with two shader passes by default. When the user toggles on or off a specific setting, setExtraPasses() is called to invalidate the the effect and set the new shader pass list (as a pass may have been added or removed, depending on the setting).
The shaders have been created previously and stored as a private instance member for later reuse, rather than being recreated each time the setting is changed.
Error: This consumer does not exist.
at aerys.minko.type.binding::DataBindings/removeConsumer()[C:\Work\Global\flash\frameworks\aerys\minko\minko\src\aerys\minko\type\binding\DataBindings.as:298]
at aerys.minko.render::DrawCall/unsetBindings()[C:\Work\Global\flash\frameworks\aerys\minko\minko\src\aerys\minko\render\DrawCall.as:177]
at aerys.minko.scene.controller.scene::RenderingController/unbindShaderInstance()[C:\Work\Global\flash\frameworks\aerys\minko\minko\src\aerys\minko\scene\controller\scene\RenderingController.as:850]
at aerys.minko.scene.controller.scene::RenderingController/deleteDrawCalls()[C:\Work\Global\flash\frameworks\aerys\minko\minko\src\aerys\minko\scene\controller\scene\RenderingController.as:577]
at aerys.minko.scene.controller.scene::RenderingController/effectInstancePassesChangedHandler()[C:\Work\Global\flash\frameworks\aerys\minko\minko\src\aerys\minko\scene\controller\scene\RenderingController.as:469]
at Function/http://adobe.com/AS3/2006/builtin::apply()
at aerys.minko.type::Signal/execute()[C:\Work\Global\flash\frameworks\aerys\minko\minko\src\aerys\minko\type\Signal.as:131]
at aerys.minko.render::Effect/invalidateInstance()[C:\Work\Global\flash\frameworks\aerys\minko\minko\src\aerys\minko\render\Effect.as:106]
at aerys.minko.render::Effect/setExtraPasses()[C:\Work\Global\flash\frameworks\aerys\minko\minko\src\aerys\minko\render\Effect.as:53]
Shader compiler still generates unnecessary mov instructions in some cases. I thought it was fixed some time ago. Well, I'm almost sure it was. But now it's back again (maybe it was introduced with one of the latest commits)
Here is a simple shader to test:
import aerys.minko.render.shader.SFloat;
import aerys.minko.render.shader.Shader;
import aerys.minko.render.shader.ShaderSettings;
import aerys.minko.type.enum.DepthTest;
import aerys.minko.type.enum.SamplerFiltering;
import aerys.minko.type.enum.SamplerMipMapping;
import aerys.minko.type.enum.SamplerWrapping;
import aerys.minko.type.enum.TriangleCulling;
public class SkydomeShader extends Shader {
private var _skySphereRadius : Number;
private var _uvScale : Number;
public function SkydomeShader(skydomeRadius:Number, skySphereRadius:Number)
{
super();
_skySphereRadius = skySphereRadius;
_uvScale = 0.5 * skySphereRadius / skydomeRadius;
}
override protected function getVertexPosition(): SFloat
{
return multiply4x4(
float4(
deltaWorldToView(
multiply(
vertexXYZ.xyz,
float(_skySphereRadius).xxx
)
),
1
),
projectionMatrix
);
}
override protected function getPixelColor(): SFloat
{
var diffuseMap: SFloat = meshBindings.getTextureParameter(
"diffuseMap",
sceneBindings.getConstant("diffuseFiltering", SamplerFiltering.LINEAR),
SamplerMipMapping.DISABLE,
SamplerWrapping.REPEAT
);
var pixelColor: SFloat = sampleTexture(
diffuseMap,
interpolate(
add(
multiply(
vertexXYZ.xz,
float(_uvScale).xx
),
float(0.5).xx
)
)
);
return pixelColor;
}
override protected function initializeSettings(settings:ShaderSettings): void
{
settings.triangleCulling = TriangleCulling.NONE;
settings.depthTest = DepthTest.ALWAYS;
settings.depthWriteEnabled = false;
settings.priority = 100500;
}
}
And the AGAL output it produced:
- vertex shader
mov vt0.w, vc8.xxxx
mul vt0.xyz, va0.xyzz, vc8.yyyy
m33 vt0.xyz, vt0.xyzz, vc0.xyzw
mov vt0.xyz, vt0.xyzz
m44 vt0.xyzw, vt0.xyzw, vc4.xyzw
mov op.xyzw, vt0.xyzw
mul vt0.xy, va0.xzzz, vc8.zzzz
add vt0.xy, vt0.xyyy, vc8.wwww
mov v0.xyzw, vt0.xyyy
- fragment shader
tex ft0.xyzw, v0.xyyy, fs0 <linear,mipnone,repeat,2d>
mov oc.xyzw, ft0.xyzw
As you can see, there is a useless mov instruction in the 4th line of vertex shader.
Also I've noticed that kil instruction is now always placed at the end of fragment shader (not in this particular one, but in other shaders I have). This is not good for performance. Instead, kil should be executed as early as possible to prevent unnecessary computations (like fog, lighting etc.) of absent pixels
at branch:dev 23f8a88
RangeError: Error #1125: The index 3 is out of range 3.
at aerys.minko.render.geometry.stream::VertexStream/getMinMaxBetween():218
at aerys.minko.render.geometry::Geometry/updateBoundingVolumes():850
at aerys.minko.render.geometry::Geometry/initialize():207
Geometry.updateBoundingVolumes()
...
var minimum : Vector.<Number> = new Vector.<Number>(3, true);
var maximum : Vector.<Number> = new Vector.<Number>(3, true);
xyzStream.getMinMaxBetween(firstIndex, numTriangles * 3, minimum, maximum);
VertexStream.getMinMaxBetween
...
for (i = 0; i < numFloatsPerVertex; ++i)
{
min[i] = Number.MAX_VALUE;
max[i] = -Number.MAX_VALUE;
}
min and max have fixed size 3, but numFloatsPerVertex == 5
And VertexStream.getMinMaxBetween have a logic error.
package {
import aerys.minko.render.geometry.primitive.CubeGeometry;
import aerys.minko.scene.node.Mesh;
import aerys.minko.type.math.Vector4;
import flash.events.Event;
public class Main extends MinkoExampleApplication {
override protected function initializeScene() : void {
super.initializeScene();
scene.addChild(new Mesh(CubeGeometry.cubeGeometry));
_lookAt = new Vector4();
_position = new Vector4();
}
override protected function enterFrameHandler(event : Event) : void
{
rotateX += 0.01;
_position.set(
_lookAt.x + 5 * Math.sin(rotateX),
_lookAt.y + 5 * Math.cos(rotateX),
_lookAt.z
);
camera.transform.lookAt(_lookAt, _position, Vector4.Y_AXIS);
// camera.getWorldToLocalTransform(true);
super.enterFrameHandler(event);
}
private var rotateX:Number = 0;
private var _lookAt:Vector4;
private var _position:Vector4;
}
}
At this example, camera rotating around cube.
If uncomment "camera.getWorldToLocalTransform(true);", camera will stop rotating.
Please remove event listeners or use something like NResponder (with replies to 1) if they does not need anymore, this is a good practice.
Screenshot:
http://img641.imageshack.us/img641/3248/17072012163305.png
Kind Regards,
Vladimir Minkin (vk.com/dqvsra)
arsvqd.blogspot.com
Title say everything, is it possible to write so we can get any float? float1, float2, float3 ... etc.
Cheers :)
See the following screenshot:
This has started occurring after the latest commits to the /dev branch. This did not happen before commit d6713b6. I have attempted to follow the function chain but cannot successfully find the reason as to why toString() is being called. Removing the toString() method from Matrix4x4.as gets around the problem temporarily, but obviously this is not a reasonable solution.
Matrix4x4 getRotation(), getTranslation() and getScale() methods do not trigger 'changed' signal for output vector (if it is provided as optional parameter value)
package {
import aerys.minko.scene.node.camera.AbstractCamera;
import aerys.minko.type.math.Matrix4x4;
public class Main extends MinkoExampleApplication {
override protected function initializeScene() : void {
super.initializeScene();
camera.localToWorldTransformChanged.add(localToWorldChangedHandler);
}
private function localToWorldChangedHandler(camera : AbstractCamera,
localToWorld : Matrix4x4) : void
{
var tmp:Matrix4x4 = new Matrix4x4();
tmp.copyFrom(localToWorld);
tmp.invert();
trace('1. worldToLocal', tmp);
camera.getWorldToLocalTransform(true, tmp);
trace('2. worldToLocal', tmp);
}
}
}
start:
rotating camera:
Hey there,
i found a bug in class
https://github.com/aerys/minko/blob/master/src/aerys/minko/type/MouseManager.as
The event handler for middle mouse button sets the false variable.
Regards Chris
we are coding a terrain shader with normal map,the code is very simple,
override protected function getPixelColor():SFloat
{
var diffuse:SFloat=float4(0,0,0,0);
var uv: SFloat =float2(0.2,0.2); //interpolate(vertexXY.xy); get uv
var lighting:SFloat=float3(0.3,0.2,0.5); //getlayerLightingPart(0).getLightingColor(); get lighting color by normal map
var layerFactor:SFloat=float4(0.5,0.2,0.2,0.1);//interpolate(getVertexAttribute(TerrainActiveConst.TERRAIN_TEXTURE)); get terrain layer texture
var layerDiffuseMap:SFloat= meshBindings.getTextureParameter("diffuseMap0",SamplerFiltering.LINEAR, SamplerMipMapping.LINEAR, SamplerWrapping.REPEAT);
var layerRepeat:SFloat=meshBindings.getParameter("uvScale0",1);
var layerDiffuse:SFloat=sampleTexture(layerDiffuseMap, multiply(uv.xy,layerRepeat)).scaleBy(layerFactor.x); //sample texture color
lighting= multiply(lighting,layerDiffuse.rgb);//diffuse color
layerDiffuse =float4(lighting.rgb,layerDiffuse.a);//get layer color
diffuse=add(diffuse,layerDiffuse);
return diffuse;
}
an error will invoke while compiling the shader,the function computeSize() of Instruction.as cause the error:
getMaxWriteOffset(component2)=-1 and getMinWriteOffset(component2)=4,
and then throw Error
at aerys.minko.render.shader.compiler.graph.nodes.vertex::Instruction/computeSize()[D:\flexwork\GameEditor\src\aerys\minko\render\shader\compiler\graph\nodes\vertex\Instruction.as:227]
at aerys.minko.render.shader.compiler.graph.nodes::AbstractNode/get size()[D:\flexwork\GameEditor\src\aerys\minko\render\shader\compiler\graph\nodes\AbstractNode.as:35]
i waiting for someone fix this (or hope i have some free time to fix it myself), please see ss here
https://twitter.com/katopz/status/165747552577257472/photo/1
this still happen at present btw
http://static.aerys.in:8080/minko/examples/AstroboyExample.html
would be nice if someone take a look at this issue.
Thanks
variable "meshesWithSameEffect" can actually be null under some circumstances, so should check if it's not null before trying to splice (in both places where it's done)
patch can be found here: http://static.soft-games.com.ua/victory/public/minko.patch
(I'd make pull request, but well, I'm not really comfortable with git)
I don't think this is a bug, its more of a limitation, but I'm posting it here just in case:
LightAwateDiffuseShaderPart.vsLocalPosition and vsLocalNormal methods rely on a VertexAnimationShaderPart.getAnimatedVertexPosition and getVertexNormal(). These methods will always read the XYZ and NORMAL vertex components. So if you want to use this in combination with any transformation in your vertex shader, the transformed vertex's position and normal will be ignored when calculating the lightings, environment, reflections, etc
For example if you want to have water surface with smooth waves calculated in the vertex shader, the reflection and lights won't update properly with the waving.
Again I know this is very minor.
oldValue local variable is never read
this error will throw via FlashBuilder 4.7
1172: Definition mx.messaging.channels:StreamingAMFChannel could not be found. SceneIterator.as /minko-examples/[source path] minko-src/aerys/minko/scene line 15 Flex Problem
actually it never use so simply remove
import mx.messaging.channels.StreamingAMFChannel;
should fix this :)
Thanks
Because of antialiasing the final color in backBuffer can change to id of another Mesh, and that will lead to error in detecting Mesh under cursor.
Changing antiAliasing before and after PickingShader is bad:
Configuring the buffer is a slow operation.
Avoid changing the buffer size or attributes during normal rendering operations.
So i suggest at PickingController:
at function addMesh
_pickingId = (_pickingId + ID_INCREMENT) & 0xFFFF;
var id:uint = _pickingId | 0xFF0000;
...
at function updateMouseOverElement:
if ((pixelColor & 0xFF0000) == 0xFF0000) {
_currentMouseOver = _pickingIdToMesh[pixelColor];
} else {
// wrong antiAliasing color
_currentMouseOver = null;
}
Very bad idea to set or remove masks on all stage children
here https://github.com/aerys/minko/blob/master/src/aerys/minko/render/Viewport.as#L519
i think something need to be fix at
result.get('//mesh[hasController(SkinningController)]')
to reproduce please use master branches and
http://hub.aerys.in/index.php/Minko:JointsDebugController_Example
error detail
TypeError: Error #1009: Cannot access a property or method of a null object reference.
at aerys.minko.scene::SceneIterator/getValueToken()[C:\fork\minko\src\aerys\minko\scene\SceneIterator.as:195]
at aerys.minko.scene::SceneIterator/filterOnValue()[C:\fork\minko\src\aerys\minko\scene\SceneIterator.as:361]
at aerys.minko.scene::SceneIterator/parsePredicate()[C:\fork\minko\src\aerys\minko\scene\SceneIterator.as:328]
at aerys.minko.scene::SceneIterator/parseNodeType()[C:\fork\minko\src\aerys\minko\scene\SceneIterator.as:291]
at aerys.minko.scene::SceneIterator/initialize()[C:\fork\minko\src\aerys\minko\scene\SceneIterator.as:128]
at aerys.minko.scene::SceneIterator()[C:\fork\minko\src\aerys\minko\scene\SceneIterator.as:39]
at aerys.minko.scene.node::Group/get()[C:\fork\minko\src\aerys\minko\scene\node\Group.as:385]
at Function/<anonymous>()[C:\labs\minko-test\libs\minko-examples\src\aerys\minko\example\collada\astroboy\AstroboyExample.as:42]
at Function/http://adobe.com/AS3/2006/builtin::apply()
at aerys.minko.type::Signal/execute()[C:\fork\minko\src\aerys\minko\type\Signal.as:75]
at aerys.minko.type.loader::SceneLoader/callLaterComplete()[C:\fork\minko\src\aerys\minko\type\loader\SceneLoader.as:213]
at Function/http://adobe.com/AS3/2006/builtin::apply()
at SetIntervalTimer/onTimer()
at flash.utils::Timer/_timerDispatch()
at flash.utils::Timer/tick()
Thanks
Another thing seems to be wrong with the function "meshGeometryChangedHandler" in class RenderingController. The object drawCall is always null and throws an null exception in every example with geometry's.
TypeError: Error #1009: Der Zugriff auf eine Eigenschaft oder eine Methode eines null-Objektverweises ist nicht mรถglich.
at aerys.minko.scene.controller.scene::RenderingController/meshGeometryChangedHandler()
at Function/http://adobe.com/AS3/2006/builtin::apply()
at aerys.minko.type::Signal/execute()
at aerys.minko.scene.node::Mesh/geometryChangedHandler()
at Function/http://adobe.com/AS3/2006/builtin::apply()
at aerys.minko.type::Signal/execute()
at aerys.minko.render.geometry::Geometry/setVertexStream()
at aerys.minko.render.geometry::Geometry/pushVertexStreamInList()
at aerys.minko.render.geometry::Geometry/computeNormals()
at aerys.minko.render::DrawCall/updateGeometry()
at aerys.minko.render::DrawCall/configure()
at aerys.minko.scene.controller.scene::RenderingController/createDrawCalls()
at aerys.minko.scene.controller.scene::RenderingController/addMesh()
at aerys.minko.scene.controller.scene::RenderingController/descendantAddedHandler()
at Function/http://adobe.com/AS3/2006/builtin::apply()
at aerys.minko.type::Signal/execute()
at aerys.minko.scene.node::AbstractSceneNode/set parent()
at aerys.minko.scene.node::Group/addChildAt()
at aerys.minko.scene.node::Group/addChild()
at aerys.minko.example.core.teapots::TeapotsExample/addTeapot()
at aerys.minko.example.core.teapots::TeapotsExample/enterFrameHandler()
Regards
Only in the 2.0b branch.
Reported on Aerys Answers : http://answers.aerys.in/discussion/97
Logged internally as issue 378
i package some minko-examples use flashdevelop.
but all do not work,just wite background color.
I know this is the dev branch so I understand sometimes things won't be working, but anyway...
at this moment both minko and minko-lighting have scene/node/light and controllers/light packages. The ones in minko won't compile and need to be removed so the compiler picks the files in minko-lighting and works properly
No matter what lightDirection the scene has, the QuadGeometry is just white.
Here the light direction is so set, that the QuadGeometry must be black but it's
just white.
scene.properties.setProperties({
lightEnabled : true,
lightDiffuseColor : 0xffffff,
lightDiffuse : 0.8,
lightAmbientColor : 0xffffff,
lightAmbient : 0.2,
lightDirection : new Vector4(0, 10, 0)
});
var mesh: Mesh = new Mesh(geometry, new BasicMaterial(
{
lightEnabled : true,
diffuseColor : 0xffffffff
}
));
// Rotates forward along the x axis
mesh.transform.appendRotation(
Math.PI / 2, Vector4.X_AXIS);
Regards.
oldRoot local variable is never read. Maybe it was intended to check if root has actually changed?
There appears to be a memory leak when attempting to completely remove a Minko instance from the application.
The attached code should illustrate the problem. Press SPACE to create a Minko setup and spawn 1000 boxes. Hit space again to call dispose() and remove all references to the Minko viewport, scene, meshes and camera. System.gc() will be called after 1 second to force a clean up.
Using a DEBUG build:
Demo begins: ~7.2mb (nothing displayed)
After creating the Minko instance and rendering to the viewport: ~38mb
After disposal and GC: ~18.5mb
In theory, if everything is being cleaned up and completely removed, the memory usage should return to around about the 7-8mb mark, although I would most likely expect it to be a little higher simply due to Flash Player internals. ~18mb seems is excessive, and indicates to me that there is most likely a leak somewhere within the framework.
Also note that remove the scene.removeAllChildren() line is commented out, after disposal and GC, the application remains at ~37mb.
With more detailed monitoring, I can see that all the box, viewport, scene and camera references are cleaned up and garbage collected, as expected, so something else within the framework is holding onto memory.
package
{
import aerys.minko.render.geometry.primitive.CubeGeometry;
import aerys.minko.render.material.basic.BasicMaterial;
import aerys.minko.render.material.Material;
import aerys.minko.render.Viewport;
import aerys.minko.scene.node.camera.Camera;
import aerys.minko.scene.node.Mesh;
import aerys.minko.scene.node.Scene;
import aerys.monitor.Monitor;
import flash.display.Sprite;
import flash.events.Event;
import flash.events.KeyboardEvent;
import flash.system.System;
import flash.ui.Keyboard;
import flash.utils.setTimeout;
public class Main extends Sprite
{
private var scene:Scene;
private var camera:Camera;
private var viewport:Viewport;
private var boxes:Array;
public function Main():void
{
stage.addEventListener(KeyboardEvent.KEY_UP, onKeyRelease);
stage.addChild(Monitor.monitor);
}
private function init():void
{
viewport = new Viewport();
addChild(viewport);
camera = new Camera();
camera.transform.translationZ = -10;
scene = new Scene();
scene.addChild(camera);
boxes = [];
for (var i:int = 0; i < 1000; ++i)
{
var mtl:Material = new BasicMaterial({ diffuseColor: 0xCC0000FF } );
var box:Mesh = new Mesh(CubeGeometry.cubeGeometry, mtl);
scene.addChild(box);
}
stage.addEventListener(Event.ENTER_FRAME, update);
}
private function dispose():void
{
stage.removeEventListener(Event.ENTER_FRAME, update);
stage.removeEventListener(KeyboardEvent.KEY_UP, onKeyRelease);
scene.removeAllChildren();
scene = null;
viewport.parent.removeChild(viewport);
viewport.dispose();
viewport = null;
boxes = null;
setTimeout(function():void
{
System.gc();
}, 1000);
}
private function update(e:Event):void
{
scene.render(viewport);
}
private function onKeyRelease(e:KeyboardEvent):void
{
if (e.keyCode == Keyboard.SPACE)
{
if (scene == null)
init();
else
dispose();
}
}
}
}
_bindingsConsumer may be null if toggle Shader.settings.enabled
Example:
package {
import aerys.minko.render.Effect;
import aerys.minko.render.geometry.primitive.CubeGeometry;
import aerys.minko.render.material.Material;
import aerys.minko.scene.node.Mesh;
public class Main extends MinkoExampleApplication {
override protected function initializeScene() : void {
super.initializeScene();
createObjects();
}
private function createObjects():void {
var shader:TestShader = new TestShader();
var m:Mesh = new Mesh(CubeGeometry.cubeGeometry, new Material(new Effect(shader)));
scene.addChild(m);
m.properties.setProperty('testcolor', 0x0000FF);
}
}
}
import aerys.minko.render.geometry.stream.format.VertexComponent;
import aerys.minko.render.shader.SFloat;
import aerys.minko.render.shader.Shader;
import aerys.minko.render.shader.ShaderSettings;
class TestShader extends Shader {
override protected function getVertexPosition(): SFloat {
return localToScreen( getVertexAttribute(VertexComponent.XYZ) );
}
override protected function getPixelColor(): SFloat {
return float4(meshBindings.getParameter('testcolor', 3), 1);
}
override protected function initializeSettings(settings:ShaderSettings):void {
super.initializeSettings(settings);
settings.enabled = meshBindings.getProperty('testcolor', 0) != 0;
}
}
result:
Error: This consumer does not exist.
at aerys.minko.type.binding::DataBindings/removeConsumer()[\aerys\minko\type\binding\DataBindings.as:290]
at aerys.minko.render::DrawCall/unsetBindings()[\aerys\minko\render\DrawCall.as:175]
at aerys.minko.scene.controller.scene::RenderingController/unbindShaderInstance()[\aerys\minko\scene\controller\scene\RenderingController.as:850]
at aerys.minko.scene.controller.scene::RenderingController/applyPassInstancesBindingChanges()[\aerys\minko\scene\controller\scene\RenderingController.as:760]
at aerys.minko.scene.controller.scene::RenderingController/applyBindingChanges()[\aerys\minko\scene\controller\scene\RenderingController.as:670]
at aerys.minko.scene.controller.scene::RenderingController/render()[\aerys\minko\scene\controller\scene\RenderingController.as:229]
at aerys.minko.scene.node::Scene/render()[\aerys\minko\scene\node\Scene.as:179]
If getConstant() method is used in Shader.initializeSettings(), multiple shader instances can be created with identical programs. Here is some code to prove my words:
package test
{
import aerys.minko.Minko;
import aerys.minko.render.effect.Effect;
import aerys.minko.scene.node.mesh.geometry.Geometry;
import aerys.minko.scene.node.mesh.Mesh;
import aerys.minko.scene.node.Scene;
import aerys.minko.type.log.DebugLevel;
import aerys.minko.type.stream.format.VertexComponent;
import aerys.minko.type.stream.format.VertexFormat;
import aerys.minko.type.stream.IndexStream;
import aerys.minko.type.stream.IVertexStream;
import aerys.minko.type.stream.StreamUsage;
import aerys.minko.type.stream.VertexStream;
import flash.display.Sprite;
public class TestShaderInstancing extends Sprite
{
public function TestShaderInstancing()
{
Minko.debugLevel |= DebugLevel.SHADER_AGAL;
var scene: Scene = new Scene();
scene.addChild(createMesh(false));
scene.addChild(createMesh(true));
}
private function createMesh(value:Boolean): Mesh
{
return new Mesh(
new Geometry(
new <IVertexStream>[
new VertexStream(
StreamUsage.STATIC,
new VertexFormat(VertexComponent.XY),
new <Number>[-1, -1, -1, 1, 1, 1, 1, -1]
)
],
new IndexStream(
StreamUsage.STATIC,
new <uint>[0, 1, 2, 0, 2, 3]
)
),
{ testConst : value },
new Effect(new SimpleShader())
);
}
}
}
import aerys.minko.render.shader.SFloat;
import aerys.minko.render.shader.Shader;
import aerys.minko.render.shader.ShaderSettings;
internal class SimpleShader extends Shader
{
override protected function getVertexPosition(): SFloat
{
return float4(vertexXY.xy, 1, 1);
}
override protected function getPixelColor(): SFloat
{
return rgba(0x0000ffff);
}
override protected function initializeSettings(settings:ShaderSettings): void
{
meshBindings.getConstant("testConst", false);
}
}
With the following output:
---------------- vertex shader ----------------
mov vt0.zw, vc0.xxxy
mov vt0.xy, va0.xyyy
mov op.xyzw, vt0.xyzw
--------------- fragment shader ---------------
mov oc.xyzw, fc0.xyzw
---------------- vertex shader ----------------
mov vt0.zw, vc0.xxxy
mov vt0.xy, va0.xyyy
mov op.xyzw, vt0.xyzw
--------------- fragment shader ---------------
mov oc.xyzw, fc0.xyzw
As you can see, generated programs are exactly the same. This behaviour can be fixed by blocking shader signature updates (which fork new instances) during initializeSettings method. I can create a patch if you agree
at branch:dev 23f8a88
RangeError: Error #1125: The index -1 is out of range 8.
at aerys.minko.type.binding::DataBindings/removeBinding():139
at Function/http://adobe.com/AS3/2006/builtin::apply()
at aerys.minko.type::Signal/execute():109
at aerys.minko.type.binding::DataProvider/removeProperty():196
I call Mesh properties.removeProperty("diffuseMap")
DataProvider.removeProperty
delete _descriptor[name];
delete _nameToProperty[name];
...
_propertyRemoved.execute(this, name);
DataBindings.removeBinding
var bindingName : String = provider.dataDescriptor[propertyName];
bindingName==null because propertyName already been removed at provider
latest version branch dev ff12aaa does not work.
Error #1063: Argument count mismatch on aerys.minko.type.binding::DataBindings/propertyChangedHandler(). Expected 4, got 2.
at Function/http://adobe.com/AS3/2006/builtin::apply()
at aerys.minko.type::Signal/execute()[aerys\minko\type\Signal.as:121]
at aerys.minko.scene.data::CameraDataProvider/set fieldOfView()[aerys\minko\scene\data\CameraDataProvider.as:63]
at aerys.minko.scene.node.camera::Camera/set fieldOfView()[aerys\minko\scene\node\camera\Camera.as:30]
package {
import aerys.minko.render.geometry.primitive.CubeGeometry;
import aerys.minko.scene.node.Mesh;
import aerys.minko.type.enum.FrustumCulling;
import flash.events.TimerEvent;
import flash.utils.Timer;
public class Main extends MinkoExampleApplication {
override protected function initializeScene() : void {
super.initializeScene();
this.cube = new Mesh(CubeGeometry.cubeGeometry);
this.cube.frustumCulling = FrustumCulling.DISABLED;
scene.addChild(this.cube);
this.timer = new Timer(1000);
this.timer.addEventListener(TimerEvent.TIMER, onTimer);
this.timer.start();
}
private function onTimer(e:TimerEvent):void {
this.cube.visible = !this.cube.visible;
trace(this.cube.visible);
}
private var cube:Mesh;
private var timer:Timer;
}
}
Cube disappears and don't become visible again.
branch:dev ed6f953
public class Main extends MinkoExampleApplication {
override protected function initializeScene() : void {
super.initializeScene();
this.timer = new Timer(1000);
this.timer.addEventListener(TimerEvent.TIMER, timerEvent);
this.timer.start();
}
private function timerEvent(e:TimerEvent):void {
// 1. test camera WorldToLocalTransform
var m1:Matrix4x4 = camera.getWorldToLocalTransform();
trace('m1', m1.toString());
// 2. add new object
scene.addChild(new Mesh(CubeGeometry.cubeGeometry));
// 3. test camera WorldToLocalTransform
var m2:Matrix4x4 = camera.getWorldToLocalTransform();
trace('m2', m2.toString());
}
private var timer:Timer;
}
Output:
m1 [Matrix4x4 (1,-3.7493993930529855e-33,-6.123234262925839e-17,0,0,1,-6.123234262925839e-17,0,6.123234262925839e-17,6.123234262925839e-17,1,0,1.3234889800848443e-23,1.3234889800848443e-23,5,1]
m2 [Matrix4x4 (1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]
_ticked private variable and get ticked() method are never used. Documentation states about "tick()" method which does not exist. Is it some kind of deprecated feature?
[code lang='as3']package
{
import aerys.minko.example.core.cubes.NormalsShader;
import aerys.minko.render.effect.Effect;
import aerys.minko.render.Viewport;
import aerys.minko.scene.controller.camera.ArcBallController;
import aerys.minko.scene.node.Camera;
import aerys.minko.scene.node.ISceneNode;
import aerys.minko.scene.node.mesh.geometry.Geometry;
import aerys.minko.scene.node.mesh.geometry.primitive.CubeGeometry;
import aerys.minko.scene.node.mesh.Mesh;
import aerys.minko.scene.node.Scene;
import aerys.minko.type.math.Vector4;
import flash.display.Sprite;
import flash.events.Event;
public class HelloWorldMinko extends Sprite
{
private var view:Viewport;
private var scene:Scene;
private var cubes:Array = [];
public function HelloWorldMinko():void
{
if (stage) init();
else addEventListener(Event.ADDED_TO_STAGE, init);
}
private function init(e:Event = null):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);
view = new Viewport(0, 400, 400);
addChild(view);
scene = new Scene;
addEventListener(Event.ENTER_FRAME, enterFrame);
var cam:Camera = new Camera;
var _cameraController:ArcBallController = new ArcBallController();
_cameraController.bindDefaultControls(stage);
_cameraController.minDistance = 1;
_cameraController.yaw = Math.PI * -.5;
_cameraController.pitch = Math.PI / 2;
_cameraController.distance = 5;
cam.addController(_cameraController);
scene.addChild(cam);
var EFFECT : Effect = new Effect(new NormalsShader());
var c:int = 50;
while(c-->0){
var cube:Mesh = new Mesh(CubeGeometry.cubeGeometry,null,EFFECT);
scene.addChild(cube);
cubes.push(cube);
cube.transform
.lock()
.appendUniformScale(0.03).appendScale(10,10,10).appendTranslation(
-1 + Math.random() * 2,
-1 + Math.random() * 2,
-1 + Math.random() * 2
)
.unlock(); }
addChild(new Stats);
}
private function enterFrame(e:Event):void
{
for each(var cube:Mesh in cubes){
cube.transform.rotationY+=.01;
}
scene.render(view);
}
}
}[/code]
the rotationY no effect
Not a bug, just a minor issue:
protected function copyFrom(source : Mesh,
withBindings : Boolean,
cloneControllers : Boolean) : void
{
var numControllers : uint = source.numControllers;
name = source.name;
_geometry = source._geometry;
properties = source._properties.clone();
var numProviders : uint = source._bindings.numProviders;
bindings.removeAllProviders();
for (var providerIndex : uint = 0; providerIndex < numProviders; ++providerIndex)
{
var provider : IDataProvider = source._bindings.getProviderAt(providerIndex);
if (provider != source.transformData && provider != source.properties)
bindings.addProvider(provider);
}
_properties = source.properties.clone();
bindings.addProvider(_properties);
copyControllersFrom(source, this, cloneControllers);
transform.copyFrom(source.transform);
effect = source._effect;
source.cloned.execute(this, source);
}
As you can see, properties are cloned twice:
...
properties = source._properties.clone();
...
_properties = source.properties.clone();
...
Here is the code that I use to apply to normal map. This is using the dev branch
var mat:PhongMaterial = new PhongMaterial(m_scene);
mat.specularMultiplier = 1;
mat.shininessMultiplier = 0.1;
mat.castShadows = true;
mat.diffuseColor = color;
mat.normalMappingType = NormalMappingType.NORMAL;
mat.normalMap = TextureLoader.loadBytes(Utils.getBytes("assets/normals/wood-normal2.jpg"));
And I get this error 9 out of 10 times during the exit frame update. Interestingly enough, it doesn't happen 1 in 10 times.
Error: Error #1023: Stack overflow occurred.
at Vector$object/http://adobe.com/AS3/2006/builtin::indexOf()
at aerys.minko.render.geometry.stream.format::VertexFormat/hasComponent()[/Users/jonathan/workspaces/flash/minko/src/aerys/minko/render/geometry/stream/format/VertexFormat.as:123]
at aerys.minko.render::DrawCall/updateGeometry()[/Users/jonathan/workspaces/flash/minko/src/aerys/minko/render/DrawCall.as:223]
at aerys.minko.render::DrawCall/setGeometry()[/Users/jonathan/workspaces/flash/minko/src/aerys/minko/render/DrawCall.as:240]
at aerys.minko.scene.controller.scene::RenderingController/meshGeometryChangedHandler()[/Users/jonathan/workspaces/flash/minko/src/aerys/minko/scene/controller/scene/RenderingController.as:707]
at Function/http://adobe.com/AS3/2006/builtin::apply()
at aerys.minko.type::Signal/execute()[/Users/jonathan/workspaces/flash/minko/src/aerys/minko/type/Signal.as:75]
at aerys.minko.scene.node::Mesh/geometryChangedHandler()[/Users/jonathan/workspaces/flash/minko/src/aerys/minko/scene/node/Mesh.as:276]
at Function/http://adobe.com/AS3/2006/builtin::apply()
at aerys.minko.type::Signal/execute()[/Users/jonathan/workspaces/flash/minko/src/aerys/minko/type/Signal.as:75]
at aerys.minko.render.geometry::Geometry/vertexStreamChangedHandler()[/Users/jonathan/workspaces/flash/minko/src/aerys/minko/render/geometry/Geometry.as:942]
at Function/http://adobe.com/AS3/2006/builtin::apply()
at aerys.minko.type::Signal/execute()[/Users/jonathan/workspaces/flash/minko/src/aerys/minko/type/Signal.as:75]
at aerys.minko.render.geometry.stream::VertexStream/unlock()[/Users/jonathan/workspaces/flash/minko/src/aerys/minko/render/geometry/stream/VertexStream.as:321]
at aerys.minko.render.geometry::Geometry/fillNormalsData()[/Users/jonathan/workspaces/flash/minko/src/aerys/minko/render/geometry/Geometry.as:617]
at aerys.minko.render.geometry::Geometry/computeTangentSpace()[/Users/jonathan/workspaces/flash/minko/src/aerys/minko/render/geometry/Geometry.as:465]
at aerys.minko.render::DrawCall/updateGeometry()[/Users/jonathan/workspaces/flash/minko/src/aerys/minko/render/DrawCall.as:225]
at aerys.minko.render::DrawCall/setGeometry()[/Users/jonathan/workspaces/flash/minko/src/aerys/minko/render/DrawCall.as:240]
at aerys.minko.scene.controller.scene::RenderingController/meshGeometryChangedHandler()[/Users/jonathan/workspaces/flash/minko/src/aerys/minko/scene/controller/scene/RenderingController.as:707]
at Function/http://adobe.com/AS3/2006/builtin::apply()
at aerys.minko.type::Signal/execute()[/Users/jonathan/workspaces/flash/minko/src/aerys/minko/type/Signal.as:75]
at aerys.minko.scene.node::Mesh/geometryChangedHandler()[/Users/jonathan/workspaces/flash/minko/src/aerys/minko/scene/node/Mesh.as:276]
at Function/http://adobe.com/AS3/2006/builtin::apply()
at aerys.minko.type::Signal/execute()[/Users/jonathan/workspaces/flash/minko/src/aerys/minko/type/Signal.as:75]
at aerys.minko.render.geometry::Geometry/vertexStreamChangedHandler()[/Users/jonathan/workspaces/flash/minko/src/aerys/minko/render/geometry/Geometry.as:942]
at Function/http://adobe.com/AS3/2006/builtin::apply()
at aerys.minko.type::Signal/execute()[/Users/jonathan/workspaces/flash/minko/src/aerys/minko/type/Signal.as:75]
at aerys.minko.render.geometry.stream::VertexStream/unlock()[/Users/jonathan/workspaces/flash/minko/src/aerys/minko/render/geometry/stream/VertexStream.as:321]
at aerys.minko.render.geometry::Geometry/fillNormalsData()[/Users/jonathan/workspaces/flash/minko/src/aerys/minko/render/geometry/Geometry.as:617]
at aerys.minko.render.geometry::Geometry/computeTangentSpace()[/Users/jonathan/workspaces/flash/minko/src/aerys/minko/render/geometry/Geometry.as:465]
at aerys.minko.render::DrawCall/updateGeometry()[/Users/jonathan/workspaces/flash/minko/src/aerys/minko/render/DrawCall.as:225]
at aerys.minko.render::DrawCall/setGeometry()[/Users/jonathan/workspaces/flash/minko/src/aerys/minko/render/DrawCall.as:240]
at aerys.minko.scene.controller.scene::RenderingController/meshGeometryChangedHandler()[/Users/jonathan/workspaces/flash/minko/src/aerys/minko/scene/controller/scene/RenderingController.as:707]
at Function/http://adobe.com/AS3/2006/builtin::apply()
at aerys.minko.type::Signal/execute()[/Users/jonathan/workspaces/flash/minko/src/aerys/minko/type/Signal.as:75]
at aerys.minko.scene.node::Mesh/geometryChangedHandler()[/Users/jonathan/workspaces/flash/minko/src/aerys/minko/scene/node/Mesh.as:276]
at Function/http://adobe.com/AS3/2006/builtin::apply()
at aerys.minko.type::Signal/execute()[/Users/jonathan/workspaces/flash/minko/src/aerys/minko/type/Signal.as:75]
at aerys.minko.render.geometry::Geometry/vertexStreamChangedHandler()[/Users/jonathan/workspaces/flash/minko/src/aerys/minko/render/geometry/Geometry.as:942]
at Function/http://adobe.com/AS3/2006/builtin::apply()
at aerys.minko.type::Signal/execute()[/Users/jonathan/workspaces/flash/minko/src/aerys/minko/type/Signal.as:75]
at aerys.minko.render.geometry.stream::VertexStream/unlock()[/Users/jonathan/workspaces/flash/minko/src/aerys/minko/render/geometry/stream/VertexStream.as:321]
at aerys.minko.render.geometry::Geometry/fillNormalsData()[/Users/jonathan/workspaces/flash/minko/src/aerys/minko/render/geometry/Geometry.as:617]
at aerys.minko.render.geometry::Geometry/computeTangentSpace()[/Users/jonathan/workspaces/flash/minko/src/aerys/minko/render/geometry/Geometry.as:465]
at aerys.minko.render::DrawCall/updateGeometry()[/Users/jonathan/workspaces/flash/minko/src/aerys/minko/render/DrawCall.as:225]
at aerys.minko.render::DrawCall/setGeometry()[/Users/jonathan/workspaces/flash/minko/src/aerys/minko/render/DrawCall.as:240]
at aerys.minko.scene.controller.scene::RenderingController/meshGeometryChangedHandler()[/Users/jonathan/workspaces/flash/minko/src/aerys/minko/scene/controller/scene/RenderingController.as:707]
at Function/http://adobe.com/AS3/2006/builtin::apply()
at aerys.minko.type::Signal/execute()[/Users/jonathan/workspaces/flash/minko/src/aerys/minko/type/Signal.as:75]
at aerys.minko.scene.node::Mesh/geometryChangedHandler()[/Users/jonathan/workspaces/flash/minko/src/aerys/minko/scene/node/Mesh.as:276]
at Function/http://adobe.com/AS3/2006/builtin::apply()
at aerys.minko.type::Signal/execute()[/Users/jonathan/workspaces/flash/minko/src/aerys/minko/type/Signal.as:75]
at aerys.minko.render.geometry::Geometry/vertexStreamChangedHandler()[/Users/jonathan/workspaces/flash/minko/src/aerys/minko/render/geometry/Geometry.as:942]
at Function/http://adobe.com/AS3/2006/builtin::apply()
at aerys.minko.type::Signal/execute()[/Users/jonathan/workspaces/flash/minko/src/aerys/minko/type/Signal.as:75]
at aerys.minko.render.geometry.stream::VertexStream/unlock()[/Users/jonathan/workspaces/flash/minko/src/aerys/minko/render/geometry/stream/VertexStream.as:321]
at aerys.minko.render.geometry::Geometry/fillNormalsData()[/Users/jonathan/workspaces/flash/minko/src/aerys/minko/render/geometry/Geometry.as:617]
at aerys.minko.render.geometry::Geometry/computeTangentSpace()[/Users/jonathan/workspaces/flash/minko/src/aerys/minko/render/geometry/Geometry.as:465]
at aerys.minko.render::DrawCall/updateGeometry()[/Users/jonathan/workspaces/flash/minko/src/aerys/minko/render/DrawCall.as:225]
at aerys.minko.render::DrawCall/setGeometry()[/Users/jonathan/workspaces/flash/minko/src/aerys/minko/render/DrawCall.as:240]
at aerys.minko.scene.controller.scene::RenderingController/meshGeometryChangedHandler()[/Users/jonathan/workspaces/flash/minko/src/aerys/minko/scene/controller/scene/RenderingController.as:707]
at Function/http://adobe.com/AS3/2006/builtin::apply()
at aerys.minko.type::Signal/execute()[/Users/jonathan/workspaces/flash/minko/src/aerys/minko/type/Signal.as:75]
at aerys.minko.scene.node::Mesh/geometryChangedHandler()[/Users/jonathan/workspaces/flash/minko/src/aerys/minko/scene/node/Mesh.as:276]
Hi,
when you have sorted draw calls due to alpha blending and some calls happen to have the same depth ( lots of triangles in tight space, I guess ) the sorting method in RenderController.render generates random order for the calls woth equal depth, and the result is flickering.
I was able to quick-fix the issue going to line 250:
var callso : Array = _passInstanceToDrawCalls[pass];
var calls : Array = []
for(var f:int=0;f<callso.length;f++) calls[f] = callso[f]
creating a copy of the array to sort it instead of resort the original array everytime, and then changing
Sort.flashSort(sortValues, calls, numCalls);
with
calls.sortOn("depth",Array.NUMERIC|Array.DESCENDING)
I don't know if this last step is necessary, probably not, probably only working woth a copy of the array was enough. Anyway this is very dirty, I suppose the ideal situation is a sorting alogythm that always generates the same order for calls that have the same depth, instead of shifting them around
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.