public void apply(INode node) { if(node instanceof Object3D) { Object3D o = (Object3D)node; if(!o.isVisible() || !o.isInFrustum()) return; if (o.getGeometry().hasBoundingSphere()) { BoundingSphere bsphere = o.getGeometry().getBoundingSphere(); bsphere.calculateBounds(o.getGeometry()); bsphere.transform(o.getModelMatrix()); (mPickedObject != null && o.getPosition().z < mPickedObject.getPosition().z)) mPickedObject = o; BoundingBox bbox = o.getGeometry().getBoundingBox(); bbox.calculateBounds(o.getGeometry()); bbox.transform(o.getModelMatrix()); (mPickedObject != null && o.getPosition().z < mPickedObject.getPosition().z)) mPickedObject = o;
private void buildMesh(Model model, Stack<ALight> lights) throws TextureException, ParsingException { Object3D o = new Object3D(model.name); boolean hasUVs = model.layerElementUV.uVIndex != null; o.setData(convertFloats(vertices), convertFloats(normals), hasUVs ? convertFloats(uvs) : null, null, convertIntegers(indices), false); o.setMaterial(getMaterialForMesh(o, model.name)); setMeshTextures(o, model.name); o.setPosition(model.properties.lclTranslation); o.setX(o.getX() * -1); o.setScale(model.properties.lclScaling); o.setRotation(model.properties.lclRotation); o.setRotZ(-o.getRotZ()); mRootObject.addChild(o);
@Override public IBoundingVolume getTransformedBoundingVolume() { IBoundingVolume volume = null; volume = getBoundingBox(); calculateModelMatrix(null); volume.transform(mMMatrix); return volume; } }
public Object3D clone(boolean copyMaterial, boolean cloneChildren) { final Object3D clone = new Object3D(); cloneTo(clone, copyMaterial); clone.setOrientation(mOrientation); clone.setScale(getScale()); if (cloneChildren) { int childCount = this.getNumChildren(); for (int i = 0; i < childCount; i++) { clone.addChild(this.getChildAt(i).clone(copyMaterial, cloneChildren)); } } return clone; }
/** * Retrieve the number of objects in the object, recursive method * * @return int the total object count for the object. */ public int getNumObjects() { int objectCount = 0; for (int i = 0, j = getNumChildren(); i < j; i++) { Object3D child = getChildAt(i); if (child.getGeometry() != null && child.getGeometry().getVertices() != null && child.isVisible()) { if (child.getNumChildren() > 0) { objectCount += child.getNumObjects() + 1; } else { objectCount++; } } } return objectCount; }
protected void cloneTo(Object3D clone, boolean copyMaterial) { clone.setName(mName); clone.getGeometry().copyFromGeometry3D(mGeometry); clone.isContainer(mIsContainerOnly); if (copyMaterial) { clone.setMaterial(mMaterial); } clone.mElementsBufferType = GLES20.GL_UNSIGNED_INT; clone.mTransparent = this.mTransparent; clone.mEnableBlending = this.mEnableBlending; clone.mBlendFuncSFactor = this.mBlendFuncSFactor; clone.mBlendFuncDFactor = this.mBlendFuncDFactor; clone.mEnableDepthTest = this.mEnableDepthTest; clone.mEnableDepthMask = this.mEnableDepthMask; }
mGeometry = new Object3D(mSceneGraphBlock.lookupName); } else { if (geomHeader.parser == null throw new ParsingException("Invalid block reference."); mGeometry = ((ABaseObjectBlockParser) geomHeader.parser).getBaseObject3D().clone(false, true); mGeometry.setName(mSceneGraphBlock.lookupName); mGeometry.setPosition(matrix.getTranslation()); mGeometry.setScale(scale.y, scale.x, scale.z); mGeometry.setOrientation(new Quaternion().fromMatrix(matrix)); if(!mGeometry.isContainer()) mGeometry.setMaterial(materials[m++]); for(int i = 0; i < mGeometry.getNumChildren(); i++) mGeometry.getChildAt(i).setMaterial(materials[Math.min(materials.length-1, m++)]);
ObjIndexData currObjIndexData = new ObjIndexData(new Object3D(generateObjectName())); ArrayList<ObjIndexData> objIndices = new ArrayList<ObjIndexData>(); boolean currentObjHasFaces=false; Object3D currentGroup = mRootObject; mRootObject.setName("default"); Map<String, Object3D> groups = new HashMap<String, Object3D>(); String groupName = parts.nextToken(); if(!groups.containsKey(groupName)) { groups.put(groupName, new Object3D(groupName)); RajLog.i("Parsing group: " + currentGroup.getName()); if (currentObjHasFaces) { objIndices.add(currObjIndexData); currObjIndexData = new ObjIndexData(new Object3D(generateObjectName())); RajLog.i("Parsing object: " + currObjIndexData.targetObj.getName()); currObjIndexData.materialName = currentMaterialName; currentObjHasFaces = false; currObjIndexData = new ObjIndexData(new Object3D(currObjIndexData.targetObj.getName())); currObjIndexData.materialName = currentMaterialName; addChildSetParent(currentGroup, currObjIndexData.targetObj); RajLog.i("Parsing object: " + currObjIndexData.targetObj.getName()); currentObjHasFaces = false; currObjIndexData.targetObj.setName(objName); } else if(type.equals(MATERIAL_LIB)) { if(!parts.hasMoreTokens()) continue;
/** * Retrieve the number of triangles of the object, recursive method * * @return int the total triangle count for the object. */ public int getNumTriangles() { int triangleCount = 0; for (int i = 0, j = getNumChildren(); i < j; i++) { Object3D child = getChildAt(i); if (child.getGeometry() != null && child.getGeometry().getVertices() != null && child.isVisible()) { if (child.getNumChildren() > 0) { triangleCount += child.getNumTriangles(); } else { triangleCount += child.getGeometry().getVertices().limit() / 9; } } } return triangleCount; }
/** * Collapse single-object groups. (Some obj exporters use g token for objects) * @param object */ private void mergeGroupsAsObjects(Object3D object) { if(object.isContainer() && object.getNumChildren()==1 && object.getChildAt(0).getName().startsWith("Object")) { Object3D child = object.getChildAt(0); object.removeChild(child); child.setName(object.getName()); addChildSetParent(object.getParent(), child); object.getParent().removeChild(object); object = child; } for(int i=0; i<object.getNumChildren(); i++) { mergeGroupsAsObjects(object.getChildAt(i)); } }
Object3D targetObj = new Object3D(mObjNames.get(j)); targetObj.setData(aVertices, aNormals, aTexCoords, null, aIndices, false); targetObj.setMaterial(material); targetObj.setColor(0xff000000 + (int) (Math.random() * 0xffffff)); mRootObject.addChild(targetObj);
private void addShadowMapMaterialPlugin(Object3D o, ShadowMapMaterialPlugin materialPlugin) { Material m = o.getMaterial(); if(m != null && m.lightingEnabled()) { if(materialPlugin != null) { m.addPlugin(materialPlugin); } else if(mShadowMapMaterial != null) { m.removePlugin(mShadowMapMaterial.getMaterialPlugin()); } } for(int i=0; i<o.getNumChildren(); i++) addShadowMapMaterialPlugin(o.getChildAt(i), materialPlugin); }
/** * Build string representation of object hierarchy * @param parent * @param sb * @param prefix */ private void buildObjectGraph(Object3D parent, StringBuffer sb, String prefix) { sb.append(prefix).append("-->").append((parent.isContainer() ? "GROUP " : "") + parent.getName()).append('\n'); for(int i=0; i<parent.getNumChildren(); i++) { buildObjectGraph(parent.getChildAt(i), sb, prefix+"\t"); } }
public void parseBlock(AWDLittleEndianDataInputStream dis, BlockHeader blockHeader) throws Exception { mBaseObject = new Object3D(); mSceneGraphBlock = new SceneGraphBlock(); mSceneGraphBlock.readGraphData(blockHeader, dis); // TODO need to 'getAssetByID' which appears to be the implemented method for referencing other parsed objects // Container properties did not exist until 2.1, as such the container will be default 0, 0, 0 if (blockHeader.awdVersion == 2 && blockHeader.awdRevision == 1) { // FIXME will have to implement this dis.readProperties(); } else { dis.readProperties(); } mBaseObject.setVisible(dis.readByte() != 0); mBaseObject.isContainer(true); }
@Override public Object3D getBaseObject3D() { if(finalObject != null) return finalObject; if(mBaseObjects[0] instanceof SkeletalAnimationChildObject3D) { SkeletalAnimationObject3D container = new SkeletalAnimationObject3D(); for(int i = 0; i < mBaseObjects.length; i++) { SkeletalAnimationChildObject3D child = (SkeletalAnimationChildObject3D)mBaseObjects[i]; child.setSkeleton(container); container.addChild(child); } finalObject = container; } else if (mBaseObjects.length == 1) finalObject = mBaseObjects[0]; else { final Object3D container = new Object3D(mLookupName); container.isContainer(true); for (int i = 0; i < mBaseObjects.length; i++) container.addChild(mBaseObjects[i]); finalObject = container; } return finalObject; }
@Override public Matrix4 getViewMatrix() { Matrix4 m = super.getViewMatrix(); if (mTarget != null) { mScratchMatrix.identity(); mScratchMatrix.translate(mTarget.getPosition()); m.multiply(mScratchMatrix); } mScratchMatrix.identity(); mScratchMatrix.rotate(mEmpty.getOrientation()); m.multiply(mScratchMatrix); if (mTarget != null) { mScratchVector.setAll(mTarget.getPosition()); mScratchVector.inverse(); mScratchMatrix.identity(); mScratchMatrix.translate(mScratchVector); m.multiply(mScratchMatrix); } return m; }
public AMeshLoader(Resources resources, TextureManager textureManager, int resourceId) { super(resources, resourceId); mTextureManager = textureManager; mRootObject = new Object3D(); }
/** * Returns a {@link BoundingBox} for this Object3D and creates it if needed. * Utilizes children's bounding values to calculate its own {@link BoundingBox}. * * @return */ public BoundingBox getBoundingBox() { if (getNumChildren() > 0 && !mGeometry.hasBoundingBox()) { Vector3 min = new Vector3(Double.MAX_VALUE, Double.MAX_VALUE, Double.MAX_VALUE); Vector3 max = new Vector3(-Double.MAX_VALUE, -Double.MAX_VALUE, -Double.MAX_VALUE); for (int i = 0; i < getNumChildren(); i++) { Object3D child = getChildAt(i); updateMaxMinCoords(min, max, child); } if (mGeometry.getVertices() != null) { updateMaxMinCoords(min, max, this); } mGeometry.setBoundingBox(new BoundingBox(min, max)); } return mGeometry.getBoundingBox(); }
/** * Get the parsed object or objects. This is returns each model independent of a scene * regardless of if a scene exists or not. * * @return */ @Override public Object3D getParsedObject() { // If only one object if (!mAlwaysUseContainer && baseObjects.size() == 1) return baseObjects.get(0); mRootObject.isContainer(true); for (int i = 0, j = baseObjects.size(); i < j; i++) mRootObject.addChild(baseObjects.get(i)); return mRootObject; }
if (mRootObject.getNumChildren() == 1) mRootObject = mRootObject.getChildAt(0);