Search in sources :

Example 11 with UserData

use of org.concord.energy3d.model.UserData in project energy3d by concord-consortium.

the class PrintController method fitInPage.

private boolean fitInPage(final Spatial printPart, final ArrayList<Spatial> page) {
    for (final Spatial neighborPart : page) {
        final Vector3 neighborPartCenter = ((UserData) neighborPart.getUserData()).getPrintCenter();
        final OrientedBoundingBox neighborBound = (OrientedBoundingBox) neighborPart.getWorldBound().asType(Type.OBB);
        final OrientedBoundingBox printPartBound = (OrientedBoundingBox) printPart.getWorldBound().asType(Type.OBB);
        final double xExtend = neighborBound.getExtent().getX() + printPartBound.getExtent().getX() + spaceBetweenParts;
        final double zExtend = neighborBound.getExtent().getZ() + printPartBound.getExtent().getZ() + spaceBetweenParts;
        for (double angleQuarter = 0; angleQuarter < 4; angleQuarter++) {
            final boolean isHorizontal = angleQuarter % 2 == 0;
            final Vector3 tryCenter = new Matrix3().fromAngles(0, angleQuarter * Math.PI / 2.0, 0).applyPost(new Vector3(isHorizontal ? xExtend : zExtend, 0, 0), null);
            tryCenter.addLocal(neighborPartCenter);
            if (!isHorizontal) {
                tryCenter.setX(pageLeft + printPartBound.getExtent().getX());
            }
            if (!isHorizontal) {
                tryCenter.setX(MathUtils.clamp(tryCenter.getX(), pageLeft + printPartBound.getExtent().getX(), pageRight - printPartBound.getExtent().getX()));
            } else {
                tryCenter.setZ(MathUtils.clamp(tryCenter.getZ(), -pageBottom + printPartBound.getExtent().getZ(), -pageTop - printPartBound.getExtent().getZ()));
            }
            tryCenter.setY(Scene.getOriginalHouseRoot().getWorldBound().getCenter().getY());
            boolean collision = false;
            if (tryCenter.getX() - printPartBound.getExtent().getX() < pageLeft - MathUtils.ZERO_TOLERANCE || tryCenter.getX() + printPartBound.getExtent().getX() > pageRight + MathUtils.ZERO_TOLERANCE || tryCenter.getZ() + printPartBound.getExtent().getZ() > -pageTop + MathUtils.ZERO_TOLERANCE || tryCenter.getZ() - printPartBound.getExtent().getZ() < -pageBottom - MathUtils.ZERO_TOLERANCE) {
                collision = true;
            } else {
                for (final Spatial otherPart : page) {
                    printPartBound.setCenter(tryCenter);
                    final OrientedBoundingBox otherPartBound = (OrientedBoundingBox) otherPart.getWorldBound().asType(Type.OBB);
                    otherPartBound.setCenter(((UserData) otherPart.getUserData()).getPrintCenter());
                    if (printPartBound.getExtent().getX() + otherPartBound.getExtent().getX() > Math.abs(printPartBound.getCenter().getX() - otherPartBound.getCenter().getX()) - spaceBetweenParts + MathUtils.ZERO_TOLERANCE && printPartBound.getExtent().getZ() + otherPartBound.getExtent().getZ() > Math.abs(printPartBound.getCenter().getZ() - otherPartBound.getCenter().getZ()) - spaceBetweenParts + MathUtils.ZERO_TOLERANCE) {
                        collision = true;
                        break;
                    }
                }
            }
            if (!collision) {
                ((UserData) printPart.getUserData()).setPrintCenter(tryCenter);
                page.add(printPart);
                return true;
            }
        }
    }
    return false;
}
Also used : OrientedBoundingBox(com.ardor3d.bounding.OrientedBoundingBox) Spatial(com.ardor3d.scenegraph.Spatial) UserData(org.concord.energy3d.model.UserData) ReadOnlyVector3(com.ardor3d.math.type.ReadOnlyVector3) Vector3(com.ardor3d.math.Vector3) Matrix3(com.ardor3d.math.Matrix3)

Example 12 with UserData

use of org.concord.energy3d.model.UserData in project energy3d by concord-consortium.

the class SelectUtil method selectHousePart.

public static PickedHousePart selectHousePart(final int x, final int y, final boolean edit) {
    final PickedHousePart pickedHousePart = pickPart(x, y);
    UserData data = null;
    if (pickedHousePart != null) {
        data = pickedHousePart.getUserData();
    }
    // set the color of edit point that the mouse currently hovers on to red
    if (data == null || !data.isEditPoint() || currentEditPointMesh != data.getHousePart().getEditPointShape(data.getEditPointIndex())) {
        if (currentEditPointMesh != null) {
            currentEditPointMesh.setDefaultColor(currentEditPointOriginalColor);
            currentEditPointMesh = null;
        }
    }
    if (data != null && data.isEditPoint() && currentEditPointMesh != data.getHousePart().getEditPointShape(data.getEditPointIndex())) {
        final Foundation foundation = data.getHousePart() instanceof Foundation ? (Foundation) data.getHousePart() : data.getHousePart().getTopContainer();
        if (foundation != null && !foundation.getLockEdit()) {
            currentEditPointMesh = data.getHousePart().getEditPointShape(data.getEditPointIndex());
            currentEditPointOriginalColor.set(currentEditPointMesh.getDefaultColor());
            currentEditPointMesh.setDefaultColor(ColorRGBA.RED);
        }
    }
    if (data == null) {
        Blinker.getInstance().setTarget(null);
    } else if (edit && data.isEditPoint()) {
        int pointIndex = data.getEditPointIndex();
        if (SceneManager.getInstance().isTopView() && data.getHousePart() instanceof Wall) {
            pointIndex -= 1;
        }
        data.getHousePart().setEditPoint(pointIndex);
    } else {
        if (data.getHousePart().getOriginal() == null) {
            Blinker.getInstance().setTarget(null);
        } else if (data.getHousePart() instanceof Roof) {
            Blinker.getInstance().setTarget(((Roof) data.getHousePart().getOriginal()).getRoofPartsRoot().getChild(data.getEditPointIndex() - 0));
        } else {
            Blinker.getInstance().setTarget(data.getHousePart().getOriginal().getRoot());
        }
    }
    return pickedHousePart;
}
Also used : Roof(org.concord.energy3d.model.Roof) Wall(org.concord.energy3d.model.Wall) UserData(org.concord.energy3d.model.UserData) Foundation(org.concord.energy3d.model.Foundation) PickedHousePart(org.concord.energy3d.model.PickedHousePart)

Example 13 with UserData

use of org.concord.energy3d.model.UserData in project energy3d by concord-consortium.

the class SelectUtil method getPickResult.

private static PickedHousePart getPickResult(final Ray3 pickRay) {
    PickedHousePart pickedHousePart = null;
    double polyDist = Double.MAX_VALUE;
    double pointDist = Double.MAX_VALUE;
    int objCounter = 0;
    HousePart prevHousePart = null;
    final long pickLayer = SelectUtil.pickLayer == -1 ? -1 : SelectUtil.pickLayer % Math.max(1, pickResults.getNumber());
    for (int i = 0; i < pickResults.getNumber(); i++) {
        final PickData pick = pickResults.getPickData(i);
        if (pick.getIntersectionRecord().getNumberOfIntersections() == 0) {
            continue;
        }
        final Object obj = ((Mesh) pick.getTarget()).getUserData();
        UserData userData = null;
        if (obj instanceof UserData) {
            // FIXME: Note that userData can be null if the pick is the land
            userData = (UserData) obj;
            if (userData.getHousePart() != prevHousePart) {
                objCounter++;
                prevHousePart = userData.getHousePart();
            }
        } else if (pickLayer != -1) {
            continue;
        }
        if (pickLayer != -1 && objCounter - 1 != pickLayer) {
            continue;
        }
        final Vector3 intersectionPoint = pick.getIntersectionRecord().getIntersectionPoint(0);
        final PickedHousePart picked_i = new PickedHousePart(userData, intersectionPoint, pick.getIntersectionRecord().getIntersectionNormal(0));
        double polyDist_i = pick.getIntersectionRecord().getClosestDistance();
        if (userData != null && userData.getHousePart() instanceof Window) {
            // give more priority to window (especially skylight)
            polyDist_i -= 0.2;
        }
        double pointDist_i = Double.MAX_VALUE;
        if (userData != null && polyDist_i - polyDist < 0.1) {
            for (int j = 0; j < userData.getHousePart().getPoints().size(); j++) {
                final Vector3 p = userData.getHousePart().getAbsPoint(j);
                pointDist_i = p.distance(intersectionPoint);
                double adjust = 0;
                if (userData.getHousePart().isFirstPointInserted()) {
                    // to avoid IndexOutOfBoundsException: Index: 2, Size: 2
                    if (userData.getHousePart().getNormal() != null) {
                        adjust -= Math.abs(userData.getHousePart().getNormal().negate(null).dot(pickRay.getDirection()) / 10.0);
                    }
                }
                if (userData.getHousePart() == SceneManager.getInstance().getSelectedPart()) {
                    // give more priority because the object is selected
                    adjust -= 0.1;
                }
                if (userData.isEditPoint()) {
                    // give more priority because this is an edit point
                    adjust -= 0.1;
                }
                if (userData.isEditPoint() && userData.getHousePart() instanceof Foundation && ((Foundation) userData.getHousePart()).isResizeHouseMode()) {
                    adjust -= 0.1;
                }
                pointDist_i += adjust;
                if (pointDist_i < pointDist && (userData.getEditPointIndex() != -1 || pickedHousePart == null || pickedHousePart.getUserData() == null || pickedHousePart.getUserData().getEditPointIndex() == -1)) {
                    pickedHousePart = picked_i;
                    polyDist = polyDist_i;
                    pointDist = pointDist_i;
                }
            }
        }
        if (pickedHousePart == null || polyDist_i < polyDist) {
            pickedHousePart = picked_i;
            polyDist = polyDist_i;
            pointDist = pointDist_i;
        }
    }
    return pickedHousePart;
}
Also used : Window(org.concord.energy3d.model.Window) UserData(org.concord.energy3d.model.UserData) Mesh(com.ardor3d.scenegraph.Mesh) Vector3(com.ardor3d.math.Vector3) Foundation(org.concord.energy3d.model.Foundation) PickData(com.ardor3d.intersection.PickData) PickedHousePart(org.concord.energy3d.model.PickedHousePart) HousePart(org.concord.energy3d.model.HousePart) PickedHousePart(org.concord.energy3d.model.PickedHousePart)

Example 14 with UserData

use of org.concord.energy3d.model.UserData in project energy3d by concord-consortium.

the class TriangleMeshLib method convertNode.

// remove this in the future
static Node convertNode(final Foundation foundation, final Node oldNode) {
    final Node newNode = new Node();
    final List<Mesh> oldMeshes = new ArrayList<Mesh>();
    Util.getMeshes(oldNode, oldMeshes);
    // 0.633 is determined by fitting the length in Energy3D to the length in SketchUp
    final double scale = Scene.getInstance().getAnnotationScale() * 0.633;
    for (final Mesh m : oldMeshes) {
        // an imported mesh doesn't necessarily have the same normal vector (e.g., a cube could be a whole mesh in collada)
        m.setUserData(new UserData(foundation));
        final MeshData md = m.getMeshData();
        switch(md.getIndexMode(0)) {
            case Triangles:
                final FloatBuffer vertexBuffer = md.getVertexBuffer();
                final FloatBuffer normalBuffer = md.getNormalBuffer();
                final FloatBuffer colorBuffer = md.getColorBuffer();
                final int n = (int) Math.round(vertexBuffer.limit() / 9.0);
                for (int i = 0; i < n; i++) {
                    final Mesh mesh = new Mesh("Triangle");
                    final FloatBuffer vb = BufferUtils.createFloatBuffer(9);
                    final int j = i * 9;
                    vb.put(vertexBuffer.get(j)).put(vertexBuffer.get(j + 1)).put(vertexBuffer.get(j + 2));
                    vb.put(vertexBuffer.get(j + 3)).put(vertexBuffer.get(j + 4)).put(vertexBuffer.get(j + 5));
                    vb.put(vertexBuffer.get(j + 6)).put(vertexBuffer.get(j + 7)).put(vertexBuffer.get(j + 8));
                    mesh.getMeshData().setVertexBuffer(vb);
                    final UserData userData = new UserData(foundation);
                    if (normalBuffer != null) {
                        final FloatBuffer nb = BufferUtils.createFloatBuffer(9);
                        nb.put(normalBuffer.get(j)).put(normalBuffer.get(j + 1)).put(normalBuffer.get(j + 2));
                        nb.put(normalBuffer.get(j + 3)).put(normalBuffer.get(j + 4)).put(normalBuffer.get(j + 5));
                        nb.put(normalBuffer.get(j + 6)).put(normalBuffer.get(j + 7)).put(normalBuffer.get(j + 8));
                        mesh.getMeshData().setNormalBuffer(nb);
                        userData.setNormal(new Vector3(nb.get(0), nb.get(1), nb.get(2)));
                    }
                    mesh.setUserData(userData);
                    if (colorBuffer != null) {
                        final FloatBuffer cb = BufferUtils.createFloatBuffer(9);
                        cb.put(colorBuffer.get(j)).put(colorBuffer.get(j + 1)).put(colorBuffer.get(j + 2));
                        cb.put(colorBuffer.get(j + 3)).put(colorBuffer.get(j + 4)).put(colorBuffer.get(j + 5));
                        cb.put(colorBuffer.get(j + 6)).put(colorBuffer.get(j + 7)).put(colorBuffer.get(j + 8));
                        mesh.getMeshData().setColorBuffer(cb);
                    }
                    mesh.getMeshData().setTextureBuffer(BufferUtils.createVector2Buffer(3), 0);
                    mesh.setRenderState(HousePart.offsetState);
                    mesh.getMeshData().setIndexMode(md.getIndexMode(0));
                    mesh.setScale(scale);
                    newNode.attachChild(mesh);
                }
                break;
            case Lines:
                break;
            default:
                System.out.println("*******" + md.getIndexMode(0));
                break;
        }
    }
    return newNode;
}
Also used : MeshData(com.ardor3d.scenegraph.MeshData) UserData(org.concord.energy3d.model.UserData) Node(com.ardor3d.scenegraph.Node) ArrayList(java.util.ArrayList) Mesh(com.ardor3d.scenegraph.Mesh) FloatBuffer(java.nio.FloatBuffer) ReadOnlyVector3(com.ardor3d.math.type.ReadOnlyVector3) Vector3(com.ardor3d.math.Vector3)

Example 15 with UserData

use of org.concord.energy3d.model.UserData in project energy3d by concord-consortium.

the class Util method getMesh.

/**
 * return the mesh by its mesh index, which is NOT the index of the children array of the node, but the original index of the mesh when the node is created
 */
public static Mesh getMesh(final Node n, final int meshIndex) {
    for (final Spatial s : n.getChildren()) {
        final Mesh m = (Mesh) s;
        final UserData u = (UserData) m.getUserData();
        if (u.getMeshIndex() == meshIndex) {
            return m;
        }
    }
    return null;
}
Also used : Spatial(com.ardor3d.scenegraph.Spatial) UserData(org.concord.energy3d.model.UserData) Mesh(com.ardor3d.scenegraph.Mesh)

Aggregations

UserData (org.concord.energy3d.model.UserData)17 ReadOnlyVector3 (com.ardor3d.math.type.ReadOnlyVector3)10 Foundation (org.concord.energy3d.model.Foundation)9 HousePart (org.concord.energy3d.model.HousePart)9 Vector3 (com.ardor3d.math.Vector3)8 Mesh (com.ardor3d.scenegraph.Mesh)8 Spatial (com.ardor3d.scenegraph.Spatial)6 Rack (org.concord.energy3d.model.Rack)6 SolarPanel (org.concord.energy3d.model.SolarPanel)6 Node (com.ardor3d.scenegraph.Node)5 PickedHousePart (org.concord.energy3d.model.PickedHousePart)5 OrientedBoundingBox (com.ardor3d.bounding.OrientedBoundingBox)4 CullHint (com.ardor3d.scenegraph.hint.CullHint)4 ArrayList (java.util.ArrayList)4 Roof (org.concord.energy3d.model.Roof)4 Window (org.concord.energy3d.model.Window)4 List (java.util.List)3 NodeState (org.concord.energy3d.model.NodeState)3 ParabolicTrough (org.concord.energy3d.model.ParabolicTrough)3 Wall (org.concord.energy3d.model.Wall)3