Mesh combineMesh(_StructureInterArea3[] buildings) { var counter = new MeshElementsCounter(buildings); //var tfArea = this.transform; var creator = new StructureBonedMeshCreator(); //StructureMeshCreator(); creator.alloc(ref counter); for (var i = 0; i < buildings.Length; i++) { var tfBuilding = buildings[i].tf; var mf = buildings[i].far.GetComponent <MeshFilter>(); var tfDetail = mf.transform; var mtBuidingBase = tfBuilding.worldToLocalMatrix * tfDetail.localToWorldMatrix * Matrix4x4.Scale(tfBuilding.localScale); // 用考慮:スケーリング creator.addGeometory(mf.sharedMesh, i, ref mtBuidingBase, buildings[i].colorPallets); } return(creator.create()); }
// 構築 -------------------------------------- //linqにしたらシンプルになるか? /// <summary> /// 自身のメッシュと、パーツ以外の子孫のメッシュ(_StructurePart を持たないもの)をすべて統合する。 /// 途中でパーツを発見した場合、そのパーツとその子孫は統合対象から外れる。 /// パーツ以外の子孫は、ゲームオブジェクトレベルですべて破棄される。 /// 子孫がレンダラを一つも持っていない場合は、さっさと処理を抜ける。 /// </summary> public virtual void buildFromPieces() { var tf = transform; var mf = tf.GetComponent <MeshFilter>(); if (mf == null) { var mr = GetComponentInChildren <MeshRenderer>(); if (mr == null) { return; } gameObject.AddComponent <MeshRenderer>().sharedMaterial = mr.sharedMaterial; } var counter = new MeshElementsCounter(); if (mf != null) { counter.count(mf.sharedMesh); } countChildrenMeshes(ref counter, tf); var creator = new ColoredNormalMesthCreator(); //SimpleMeshCreator(); creator.alloc(ref counter); if (mf != null) { var mt = Matrix4x4.identity; creator.addGeometory(mf.sharedMesh, ref mt); } var mtInv = tf.worldToLocalMatrix; buildChildrenMeshes(creator, tf, ref mtInv); if (mf == null) { mf = gameObject.AddComponent <MeshFilter>(); } mf.sharedMesh = creator.create(); }
void countChildrenMeshes(ref MeshElementsCounter counter, Transform tf) { for (var i = 0; i < tf.childCount; i++) { var tfChild = tf.GetChild(i); if (tfChild.GetComponent <_StructurePart3>() == null) { if (tfChild.childCount > 0) { countChildrenMeshes(ref counter, tfChild); } var mf = tfChild.GetComponent <MeshFilter>(); if (mf != null) { counter.count(mf.sharedMesh); } } } }
public virtual void alloc(ref MeshElementsCounter mec) { idxs = new int[mec.idxLength]; vtxs = new Vector3[mec.vtxLength]; }
public override void alloc(ref MeshElementsCounter mec) { base.alloc(ref mec); flagOffsets = new Vector2[mec.vtxLength]; }
public override void alloc(ref MeshElementsCounter mec) { base.alloc(ref mec); bids = new Color32[mec.vtxLength]; }
public override void alloc(ref MeshElementsCounter mec) { base.alloc(ref mec); nms = new Vector3[mec.vtxLength]; }