Famous / engine

MIT License
1.75k stars 250 forks source link

dismounting any node containing a mesh dismounts all meshes #443

Open CompSciFutures opened 9 years ago

CompSciFutures commented 9 years ago

Calling dismount() on any Node() that is a parent of a Mesh() removes all meshes from the scene regardless of where they are in the scene graph.

Steps to reproduce

  1. Add two nodes X & Y to a scene using `var x = scene.addChild(), y = scene.addChild()`
  2. Add a first `Mesh` to node X
  3. Add a second `Mesh` to node Y
  4. dismount() node X with `x.dismount()`
  5. Observe that:
    • the dismounted() X mesh disappears (correct behavior); AND
    • the Y mesh which is a non-descendant of X also disappears (incorrect behavior)

Isolation

Example

Relevant Code Section

See aCubeNodes[0].dismount();:

Working Example Code

<html>
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <title>Famous0.6.2</title>
    <link rel="icon" href="favicon.ico?v=1" type="image/x-icon">
    <meta name="description" content="Seed Famous@0.6.2">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" />
    <meta http-equiv="Pragma" content="no-cache" />
    <meta http-equiv="Expires" content="0" />
    <script src="lib/famous-20150722-a5d7fd552505c0f2d40c4a86aa0a61950736ff16.js"></script>
</script>

    <style>
    html, body {
        width: 100%;
        height: 100%;
        margin: 0px;
        padding: 0px;

    }
    body {
        position: absolute;
        -webkit-transform-style: preserve-3d;
        transform-style: preserve-3d;
        -webkit-font-smoothing: antialiased;
        -webkit-tap-highlight-color: transparent;
        background-color: black;
        -webkit-perspective: 0;
        perspective: none;
        overflow: hidden;
    }
    </style>
</head>

<body>
<script>
'use strict';

console.log(famous);
//var famous = require('famous');
var DOMElement = famous.domRenderables.DOMElement;
var FamousEngine = famous.core.FamousEngine;
var Mesh = famous.webglRenderables.Mesh;
var Color = famous.utilities.Color;
var Geometry = famous.webglGeometries.Geometry;

var scene = FamousEngine.createScene();
var centeredOriginNode = scene.addChild();

FamousEngine.init();

scene
    .setSizeMode('relative', 'relative', 'absolute')
    .setProportionalSize(0.7, 0.7, 0.7)
    .setAbsoluteSize(1000, 1000, 500)
    ;

centeredOriginNode =
    createNode(scene)
    .setAlign(0.5,0.5,0.5)
    .setMountPoint(0.5,0.5,0.5)
    ;

spin(centeredOriginNode, 2500,10000,5000);

// add big cube
var oBigCubeNode = addDebugCube(centeredOriginNode);

// add some little cubes to it

var aCubeNodes = [];

for ( var i = 0; i < 100; i++ ) {
    var fCubeSize = Math.random() * 100;
    var oNewCube =
        addDebugCube(oBigCubeNode)
            .setSizeMode('absolute', 'absolute', 'absolute')
            .setProportionalSize(0.7, 0.7, 0.7)
            .setAbsoluteSize(fCubeSize, fCubeSize, fCubeSize)
            .setAlign(Math.random(), Math.random(), Math.random())
            .setOrigin(0.5, 0.5, 0.5)
            .setMountPoint(0.5, 0.5, 0.5)
            ;
    spin(oNewCube,(Math.random()-0.5) * 1000 + 100, (Math.random()-0.5) * 1000 + 100, (Math.random()-0.5) * 1000 + 100);
    aCubeNodes.push(oNewCube);
}

setTimeout(function() {
    //centeredOriginNode.hide();        // this works (mesh disappears)
    //centeredOriginNode.dismount();    // this works (mesh disappears)
    //oBigCubeNode.dismount();          // this works (mesh disappears)
    //removeCube();                     // THIS DOESN'T WORK (EVERYTHING DISAPPEARS AT ONCE)
    aCubeNodes[0].dismount();           // THIS DOESN'T WORK (EVERYTHING DISAPPEARS AT ONCE)
}, 1000 * 3);

// utils

function removeCube() {
    if (aCubeNodes.length <= 0)
        return;
    aCubeNodes.pop().dismount();
    setTimeout(removeCube, 100);
}

function spin(node, tx,ty,tz) {
    var spinner = node.addComponent({
        onUpdate: function(time) {
            node.setRotation(!tx ? 0 : time/tx, !ty ? 0 : time/ty, !tz ? 0 : time/tz);
            node.requestUpdateOnNextTick(spinner);
        }
    });
    node.requestUpdate(spinner);
}

function addDebugCube(parent) {

    var oCube = parent.addChild().setOpacity(0.3);

    // cube
    var oGeometry =
            new Geometry({
                type: 'LINES',
                buffers: [
                    { name: 'a_pos', data: [
                        -1,-1,-1, 1,-1,-1, 1,1,-1, -1,1,-1,
                        -1,-1,1, 1,-1,1, 1,1,1, -1,1,1
                    ], size: 3 },
                    { name: 'indices', data: [
                        0,1, 1,2, 2,3, 3,0, // front face
                        4,5, 5,6, 6,7, 7,4, // back face
                        0,4, 4,7, 7,3, 3,0, // left face
                        1,5, 5,6, 6,2, 2,1 // right face
                    ], size: 2 }
                ]});

    var oMesh =
            new Mesh(oCube)
                    .setGeometry(oGeometry)
                    .setBaseColor(new Color("#FFFFFF"))
            ;

    return oCube;
};

function createNode(parent) {
    var node = parent.addChild();

    var aParentSizeMode = parent.getSizeMode();
    var aParentProportionalSize = parent.getProportionalSize();
    var aParentAbsoluteSize = parent.getAbsoluteSize();
    var aParentDifferentialSize = parent.getDifferentialSize();

    node
            .setSizeMode(aParentSizeMode[0], aParentSizeMode[1], aParentSizeMode[2])
            .setProportionalSize(aParentProportionalSize[0], aParentProportionalSize[1], aParentProportionalSize[2])
            .setAbsoluteSize(aParentAbsoluteSize[0], aParentAbsoluteSize[1], aParentAbsoluteSize[2])
            .setDifferentialSize(aParentDifferentialSize[0], aParentDifferentialSize[1], aParentDifferentialSize[2])
            .setOrigin(0.5, 0.5, 0.5)
    ;

    return node;
}
</script>
</body>
</html>
CompSciFutures commented 9 years ago

I have extracted this new bug report from my comments in #439. After further reflection, I have concluded that this is a new and separate bug.

CompSciFutures commented 9 years ago

Also see #436