private bool loadFrom(BinStore s) { bool ok = true; s.prepare(); ok &= s.read(out Version); ok &= s.read(out Scenefile); ok &= s.prepare_nested(); // will update the file size left Debug.Assert(ok); if (s.end_encountered()) { return(ok); } string _name; while (s.nesting_name(out _name)) { s.nest_in(); if ("Def" == _name || "RootMod" == _name) { var entry = new SceneGraphNode_Data(); ok &= entry.loadFrom(s); Def.Add(entry); } else if ("Ref" == _name) { var entry = new SceneRootNode_Data(); ok &= entry.loadFrom(s); Ref.Add(entry); } else { Debug.Assert(false, "unknown field referenced."); } s.nest_out(); } return(ok); }
public void addChildNodes(SceneGraphNode_Data inp_data, LoadingContext ctx, PrefabStore store) { if (inp_data.p_Grp == null || inp_data.p_Grp.Count == 0) { return; } foreach (GroupLoc_Data dat in inp_data.p_Grp) { string new_name = ctx.groupRename(dat.name, false); SceneNodeChildTransform child = new SceneNodeChildTransform(); child.node = ctx.m_target.getNodeByName(new_name); if (null == child.node) { bool loaded = store.loadNamedPrefab(new_name, ctx); if (!loaded) { Debug.LogError("Cannot load named prefab " + new_name + " result is " + loaded); } child.node = ctx.m_target.getNodeByName(new_name); } // construct from euler angles Quaternion qPitch = UnityEngine.Quaternion.AngleAxis(Mathf.Rad2Deg * dat.rot.x, new Vector3(-1, 0, 0)); Quaternion qYaw = UnityEngine.Quaternion.AngleAxis(Mathf.Rad2Deg * dat.rot.y, new Vector3(0, 1, 0)); Quaternion qRoll = UnityEngine.Quaternion.AngleAxis(Mathf.Rad2Deg * dat.rot.z, new Vector3(0, 0, -1)); Quaternion rotQuat = qYaw * qPitch * qRoll; child.m_matrix2 = Matrix4x4.TRS(dat.pos, rotQuat, new Vector3(1, 1, 1)); if (null != child.node) { m_children.Add(child); } else { Debug.LogError("Node " + m_name + "\ncan't find member " + dat.name); } } }