// 排序 internal override bool DoCameraRender(SoftCamera camera, Dictionary <int, SoftRenderObject> objMap) { if (camera == null || objMap == null) { return(false); } NativeList <int> visibleList; camera.DoCameraPreRender(); camera.Cull(objMap, out visibleList); bool ret = false; if (visibleList != null && visibleList.Count > 0) { DoVisibleRenderObjectsSort(camera, visibleList); for (int i = 0; i < visibleList.Count; ++i) { SoftRenderObject obj = camera.GetRenderObject(visibleList[i]); if (obj != null) { // 后面考虑排序和后面模拟可编程。。。 if (obj.Render(camera, m_DefaultPassMode)) { ret = true; } } } } camera.DoCameraPostRender(m_DefaultPassMode); return(ret); }
public void RemoveRenderObject(SoftRenderObject obj) { if (obj != null && m_RenderObjMap != null) { int instanceId = obj.InstanceId; m_RenderObjMap.Remove(instanceId); SoftCamera cam = obj as SoftCamera; if (cam != null) { m_CamList.Remove(cam); } obj.Dispose(); } }
protected int RegisterRenderObject(SoftRenderObject obj) { if (obj == null) { return(-1); } if (m_RenderObjMap == null) { m_RenderObjMap = new Dictionary <RenderTargetClearFlags, SoftRenderObject>(); } if (m_RenderObjMap.ContainsKey(obj.InstanceId)) { return(0); } m_RenderObjMap.Add(obj.InstanceId, obj); return(1); }
// 摄影机剔除 // visiableList: 可见列表 public void CameraCull(SoftCamera camera, Dictionary <int, SoftRenderObject> objs, out NativeList <int> visiableList) { visiableList = null; if (camera == null) { return; } if (objs == null || objs.Count <= 0) { m_Objs.Clear(false); return; } m_Objs.Clear(false); // 简单处理,直接干 var iter = objs.GetEnumerator(); while (iter.MoveNext()) { SoftRenderObject obj = iter.Current.Value; if (obj != null && obj.CanRenderer) { switch (obj.ObjType) { case SoftRenderObjType.MeshRender: SoftSpere spere = (obj as SoftMeshRenderer).WorldBoundSpere; // if (!camera.IsOpenCameraSpereCull || SoftMath.BoundSpereInCamera(spere, camera)) { if (!camera.IsOpenCameraSpereCull || SoftMath.BoundSpereInCamera_UseMVP(spere, camera)) { m_Objs.Add(obj.InstanceId); } break; } } } iter.Dispose(); if (m_Objs.Count > 0) { visiableList = m_Objs; } }