@Override public void linkToZero() { setParent(scene.sceneNode); }
private static boolean haveAnyChannel(FbxAnimNode anims) { return anims != null && anims.haveAnyChannel(); }
private FbxObject loadDeformer(FbxElement element) { String type = (String) element.properties.get(2); switch(type) { case "Skin": FbxSkin skinData = new FbxSkin(this, element); skinMap.put(skinData.id, skinData); return skinData; case "Cluster": FbxCluster clusterData = new FbxCluster(this, element); return clusterData; } return null; }
switch(e.id) { case "Geometry": FbxMesh mesh = new FbxMesh(this, e); obj = mesh; if(mesh.geometries != null) break; case "Material": obj = new FbxMaterial(this, e); break; case "Model": FbxNode node = new FbxNode(this, e); obj = node; modelMap.put(node.id, node); if(node.isLimb()) limbMap.put(node.id, node); break; case "Pose": FbxBindPose pose = new FbxBindPose(this, e); obj = pose; bindMap.put(pose.id, pose); break; case "Texture": obj = new FbxTexture(this, e); break; case "Video": obj = new FbxImage(this, e); break; case "Deformer":
FbxAnimNode animTranslation = limb.animTranslation(sourceLayerId); FbxAnimNode animRotation = limb.animRotation(sourceLayerId); FbxAnimNode animScale = limb.animScale(sourceLayerId); boolean haveTranslation = haveAnyChannel(animTranslation); boolean haveRotation = haveAnyChannel(animRotation); animTranslation.exportTimes(stamps); if(haveRotation) animRotation.exportTimes(stamps); if(haveScale) animScale.exportTimes(stamps); if(stamps.isEmpty()) continue; int keyIndex = firstKeyIndex + i; FbxAnimNode n = animTranslation; Vector3f tvec = n.getValue(keyTimes[keyIndex], n.value).subtractLocal(n.value); // Why do it here but not in other places? FBX magic? translations[i] = tvec.divideLocal(unitSize); int keyIndex = firstKeyIndex + i; FbxAnimNode n = animRotation; Vector3f tvec = n.getValue(keyTimes[keyIndex], n.value); rotations[i] = ro.rotate(tvec); int keyIndex = firstKeyIndex + i; FbxAnimNode n = animScale; Vector3f tvec = n.getValue(keyTimes[keyIndex], n.value); scales[i] = tvec;
private void applySkinning() { for(FbxBindPose pose : bindMap.values()) pose.fillBindTransforms(); if(limbMap == null) return; List<Bone> bones = new ArrayList<>(); for(FbxNode limb : limbMap.values()) { if(limb.bone != null) { bones.add(limb.bone); limb.buildBindPoseBoneTransform(); } } skeleton = new Skeleton(bones.toArray(new Bone[bones.size()])); skeleton.setBindingPose(); for(FbxNode limb : limbMap.values()) limb.setSkeleton(skeleton); for(FbxSkin skin : skinMap.values()) skin.generateSkinning(); // Attach controls animControl = new AnimControl(skeleton); sceneNode.addControl(animControl); SkeletonControl control = new SkeletonControl(skeleton); sceneNode.addControl(control); }
ref = allObjects.get(refId); if(ref != null) { ref.link(obj); } else if(refId == 0) { obj.linkToZero(); ref = allObjects.get(refId); if(ref != null) ref.link(obj, propName); break;
public Vector3f getValue(long time, Vector3f defaultValue) { float xValue = (xCurve != null) ? xCurve.getValue(time) : defaultValue.x; float yValue = (yCurve != null) ? yCurve.getValue(time) : defaultValue.y; float zValue = (zCurve != null) ? zCurve.getValue(time) : defaultValue.z; return new Vector3f(xValue, yValue, zValue); } }
public FbxImage(SceneLoader scene, FbxElement element) { super(scene, element); if(type.equals("Clip")) { for(FbxElement e : element.children) { switch(e.id) { case "Type": imageType = (String) e.properties.get(0); break; case "Filename": case "FileName": filename = (String) e.properties.get(0); break; case "RelativeFilename": relativeFilename = (String) e.properties.get(0); break; case "Content": if(e.properties.size() > 0) content = (byte[]) e.properties.get(0); break; } } image = createImage(); } }
private void linkScene() { logger.log(Level.FINE, "Linking scene objects"); long startTime = System.currentTimeMillis(); applySkinning(); buildAnimations(); for(FbxMesh mesh : geomMap.values()) mesh.clearMaterials(); // Remove bones from node structures : JME creates attach node by itself for(FbxNode limb : limbMap.values()) limb.node.removeFromParent(); long estimatedTime = System.currentTimeMillis() - startTime; logger.log(Level.FINE, "Linking done in {0} ms", estimatedTime); }
material = createMaterial();
geometries = createGeometries();
public FbxBindPose(SceneLoader scene, FbxElement element) { super(scene, element); if(type.equals("BindPose")) { for(FbxElement e : element.children) { if(e.id.equals("PoseNode")) { long nodeId = 0; double[] transform = null; for(FbxElement e2 : e.children) { switch(e2.id) { case "Node": nodeId = (Long) e2.properties.get(0); break; case "Matrix": transform = (double[]) e2.properties.get(0); break; } } Matrix4f t = buildTransform(transform); t.scale(new Vector3f(scene.unitSize, scene.unitSize, scene.unitSize)); nodeTransforms.put(nodeId, t); } } } }
public void generateSkinning() { for(FbxMesh fbxMesh : toSkin) { if(fbxMesh.geometries == null) continue; Mesh firstMesh = fbxMesh.geometries.get(0).getMesh(); int maxWeightsPerVert = generateBoneData(firstMesh, fbxMesh); for(int i = 0; i < fbxMesh.geometries.size(); ++i) { Mesh mesh = fbxMesh.geometries.get(i).getMesh(); if(mesh != firstMesh) { mesh.setBuffer(firstMesh.getBuffer(VertexBuffer.Type.BoneWeight)); mesh.setBuffer(firstMesh.getBuffer(VertexBuffer.Type.BoneIndex)); mesh.setBuffer(firstMesh.getBuffer(VertexBuffer.Type.HWBoneWeight)); mesh.setBuffer(firstMesh.getBuffer(VertexBuffer.Type.HWBoneIndex)); } mesh.setMaxNumWeights(maxWeightsPerVert); mesh.generateBindPose(true); } } }
List<Integer> indexes = e.getValue(); Mesh newMesh = mesh.clone(); newMesh.setBuffer(VertexBuffer.Type.Index, 3, toArray(indexes.toArray(new Integer[indexes.size()]))); newMesh.setStatic(); newMesh.updateBound();
break; case "Lcl Translation": readVectorFromProp(translationLocalRaw, prop); break; case "Lcl Rotation": readVectorFromProp(rotationLocalRaw, prop); break; case "Lcl Scaling": readVectorFromProp(scaleLocalRaw, prop); break; case "PreRotation": readVectorFromProp(rotationPreRaw, prop); break; case "RotationActive": break; case "RotationPivot": readVectorFromProp(rotationPivotRaw, prop); break; case "PostRotation": readVectorFromProp(rotationPostRaw, prop); break; case "ScaleOffset": readVectorFromProp(scaleOffsetRaw, prop); break; case "ScalePivot": readVectorFromProp(scalePivotRaw, prop); break; case "U":
private FbxObject loadDeformer(FbxElement element) { String type = (String) element.properties.get(2); switch(type) { case "Skin": FbxSkin skinData = new FbxSkin(this, element); skinMap.put(skinData.id, skinData); return skinData; case "Cluster": FbxCluster clusterData = new FbxCluster(this, element); return clusterData; } return null; }
@Override public void linkToZero() { setParent(scene.sceneNode); }
private static boolean haveAnyChannel(FbxAnimNode anims) { return anims != null && anims.haveAnyChannel(); }