forked from LeenkxTeam/LNXSDK
		
	
		
			
	
	
		
			74 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
		
		
			
		
	
	
			74 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
|  | package iron.data; | ||
|  | 
 | ||
|  | #if lnx_skin | ||
|  | 
 | ||
|  | import iron.data.SceneFormat; | ||
|  | import iron.math.Mat4; | ||
|  | 
 | ||
|  | class Armature { | ||
|  | 	public var uid: Int; | ||
|  | 	public var name: String; | ||
|  | 	public var actions: Array<TAction> = []; | ||
|  | 	var matsReady = false; | ||
|  | 
 | ||
|  | 	public function new(uid: Int, name: String, actions: Array<TSceneFormat>) { | ||
|  | 		this.uid = uid; | ||
|  | 		this.name = name; | ||
|  | 
 | ||
|  | 		for (a in actions) { | ||
|  | 			for (o in a.objects) setParents(o); | ||
|  | 			var bones: Array<TObj> = []; | ||
|  | 			traverseBones(a.objects, function(object: TObj) { bones.push(object); }); | ||
|  | 			this.actions.push({ name: a.name, bones: bones, mats: null }); | ||
|  | 		} | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function initMats() { | ||
|  | 		if (matsReady) return; | ||
|  | 		matsReady = true; | ||
|  | 
 | ||
|  | 		for (a in actions) { | ||
|  | 			if (a.mats != null) continue; | ||
|  | 			a.mats = []; | ||
|  | 			for (b in a.bones) { | ||
|  | 				a.mats.push(Mat4.fromFloat32Array(b.transform.values)); | ||
|  | 			} | ||
|  | 		} | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function getAction(name: String): TAction { | ||
|  | 		for (a in actions) if (a.name == name) return a; | ||
|  | 		return null; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	static function setParents(object: TObj) { | ||
|  | 		if (object.children == null) return; | ||
|  | 		for (o in object.children) { | ||
|  | 			o.parent = object; | ||
|  | 			setParents(o); | ||
|  | 		} | ||
|  | 	} | ||
|  | 
 | ||
|  | 	static function traverseBones(objects: Array<TObj>, callback: TObj->Void) { | ||
|  | 		for (i in 0...objects.length) { | ||
|  | 			traverseBonesStep(objects[i], callback); | ||
|  | 		} | ||
|  | 	} | ||
|  | 
 | ||
|  | 	static function traverseBonesStep(object: TObj, callback: TObj->Void) { | ||
|  | 		if (object.type == "bone_object") callback(object); | ||
|  | 		if (object.children == null) return; | ||
|  | 		for (i in 0...object.children.length) { | ||
|  | 			traverseBonesStep(object.children[i], callback); | ||
|  | 		} | ||
|  | 	} | ||
|  | } | ||
|  | 
 | ||
|  | typedef TAction = { | ||
|  | 	var name: String; | ||
|  | 	var bones: Array<TObj>; | ||
|  | 	var mats: Array<Mat4>; | ||
|  | } | ||
|  | 
 | ||
|  | #end |