Wrapping a node in a billboard/imposter

i tried it like this:

public void addChildAsImposter(final Node p_view, final int p_size, final int p_camDst, final int p_texX, final int p_texY) {
    final ImposterNode l_in = new ImposterNode("Imposter for "+p_view, p_size, p_texX, p_texY);
    l_in.attachChild(p_view);
    l_in.setCameraDistance(p_camDst);

    final BillboardNode l_bb = new BillboardNode("Billboard for "+l_in);
    l_bb.attachChild(l_in);
    l_bb.setModelBound(p_view.getWorldBound().clone(null));
    l_bb.setAlignment(BillboardNode.SCREEN_ALIGNED);
    l_bb.getLocalTranslation().set(p_view.getLocalTranslation());
    l_bb.getLocalRotation().set(p_view.getLocalRotation());
    p_view.getLocalRotation().set(new Quaternion());
    p_view.getLocalTranslation().set(new Vector3f());
    Utils.updateWorldBounds(l_bb);
    attachChild(l_bb);
  }



but i don't see anything then. simply attaching the node works fine.
any idea why it does noT work?

i played around a bit and discovered that you have to move the imposter node, not the billboard node or the rendered one.

i can already see the billboards boundingbox, but not the rendered node. how can i find out what's wrong?

i slightly modified the testmaxtojme-test:

/*
 * Copyright (c) 2003-2007 jMonkeyEngine All rights reserved. Redistribution and
 * use in source and binary forms, with or without modification, are permitted
 * provided that the following conditions are met: * Redistributions of source
 * code must retain the above copyright notice, this list of conditions and the
 * following disclaimer. * Redistributions in binary form must reproduce the
 * above copyright notice, this list of conditions and the following disclaimer
 * in the documentation and/or other materials provided with the distribution. *
 * Neither the name of 'jMonkeyEngine' nor the names of its contributors may be
 * used to endorse or promote products derived from this software without
 * specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT
 * HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
 * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
 * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

package jmetest.renderer.loader;

import com.jme.app.AbstractGame;
import com.jme.app.SimpleGame;
import com.jme.math.FastMath;
import com.jme.scene.BillboardNode;
import com.jme.scene.ImposterNode;
import com.jme.scene.Node;
import com.jme.util.export.binary.BinaryImporter;
import com.jme.util.geom.Debugger;
import com.jmex.model.XMLparser.Converters.MaxToJme;

import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;

/**
 * Started Date: Jun 26, 2004<br>
 * <br>
 * This class test the ability to save adn write .3ds files
 *
 * @author Jack Lindamood
 */
public class TestMaxJmeWrite extends SimpleGame {
    public static void main(String[] args) {

        TestMaxJmeWrite app = new TestMaxJmeWrite();
        if (args.length > 0) {
            app.setModelToLoad(args[0]);
        }
        app.setDialogBehaviour(AbstractGame.FIRSTRUN_OR_NOCONFIGFILE_SHOW_PROPS_DIALOG);
        app.start();
    }

    private URL modelToLoad = null;

    private void setModelToLoad(String string) {
        try {
            modelToLoad = (new File(string)).toURL();
        } catch (MalformedURLException e) {
        }
    }

  protected void simpleRender() {
    super.simpleRender();
    Debugger.drawBounds(rootNode, display.getRenderer());
  }

  protected void simpleInitGame() {
        if (modelToLoad == null) {
            modelToLoad = TestMaxJmeWrite.class.getClassLoader().getResource(
                    "jmetest/data/model/Character.3DS");
        }
        try {
            MaxToJme C1 = new MaxToJme();
            ByteArrayOutputStream BO = new ByteArrayOutputStream();
            C1.convert(new BufferedInputStream(modelToLoad.openStream()), BO);
            Node r1 = (Node)BinaryImporter.getInstance().load(new ByteArrayInputStream(BO.toByteArray()));
            //Node r = new Node("parent stuff");
            //r.attachChild(C1.get(new BufferedInputStream(modelToLoad.openStream()), BO));
            //r.setLocalScale(.1f);
            r1.setLocalScale(.1f);
            if (r1.getChild(0).getControllers().size() != 0)
                r1.getChild(0).getController(0).setSpeed(20);

            //Quaternion temp = new Quaternion();
            //temp.fromAngleAxis(FastMath.PI / 2, new Vector3f(-1, 0, 0));
            //rootNode.setLocalRotation(temp);
            //r1.setLocalTranslation(new Vector3f(10,0,0));
            //rootNode.attachChild(r);
          ImposterNode iNode = new ImposterNode("model imposter", 100, 128, 128);
          iNode.attachChild(r1);
          iNode.setCameraDistance(20);
          iNode.setRedrawRate(.05f); // .05 = update texture 20 times a second on average
          iNode.setCameraThreshold(35 * FastMath.DEG_TO_RAD);

          // Now add the imposter to a Screen Aligned billboard so the deception is complete.
          BillboardNode bnode = new BillboardNode("imposter bbnode");
          bnode.setAlignment(BillboardNode.SCREEN_ALIGNED);
          bnode.attachChild(iNode);
          rootNode.attachChild(bnode);


          //rootNode.attachChild(r1);
        } catch (IOException e) {
            System.out.println("Damn exceptions:" + e);
            e.printStackTrace();
        }
    }
}



bounding box is visible, but the model is gone. if i attach r1 to the rootnode, i look directly at the models head, but using an imposternode -> nothing

i understand you want me to suffer, but could you make an exception on this one?

Don't try making them feel mercy, they also don't answer my questions ;). I personally have no experience with imposter nodes, sorry.

r1.updateRenderState();


or maybe, even add

r1.setRenderState(lightstate);


before that! Remember that the "imposted" scene doesn't get updated by the scene root node, so you'll have to do that yorself. Also, it won't inherit any of rootNode's RenderStates, s you might want to add a ZBufferState, as well!

are you just guessing or is that the reason its not working?

Um… why don't you just try?  :expressionless: That's what struck me as the difference between your code and TestImposterNode at first glance, so I addeed it to your code, and bam, it was working.

because i am at work and my graphics card is from 1817

If like he said, the imposter node doesn't get all stuff automatically from the root node, maybe you'll have to render it separately? My graphics card is from 3000 BC, can I maybe buy yours?  :wink:

How much would you guess a SiS 360 would cost? You can't run any openGL applications on it, including jME. DirectX seems to work, but terribly slow. (I'm currently working on my laptop with a ATI Radeon 7500, btw. So I can run jME atleast)

give me 10

:smiley:

my billboarded impostered trees get rendered now (and look ugly). maybe there should be some kind of new BillBoardImposterNode(Node org) that does the stuff i had to find out like that you have to move the org-node and the billboard to the same spot, but not the imposternode. and all the other details.

Hamster - what are you currently using…

Your experience si also influencing this thread http://www.jmonkeyengine.com/jmeforum/index.php?topic=5641.15