internal void DrawLevel() { if (!isStageLoaded || !Enabled || DeviceResizing) { return; } cam.FOV = (float)(Math.PI / 4); cam.Aspect = RenderPanel.Width / (float)RenderPanel.Height; cam.DrawDistance = 100000; UpdateTitlebar(); #region D3D Parameters Matrix projection = Matrix.PerspectiveFovRH(cam.FOV, cam.Aspect, 1, cam.DrawDistance); Matrix view = cam.ToMatrix(); d3ddevice.SetTransform(TransformState.Projection, projection); d3ddevice.SetTransform(TransformState.View, view); d3ddevice.SetRenderState(RenderState.FillMode, EditorOptions.RenderFillMode); d3ddevice.SetRenderState(RenderState.CullMode, EditorOptions.RenderCullMode); d3ddevice.Material = new Material { Ambient = System.Drawing.Color.White.ToRawColor4() }; d3ddevice.Clear(ClearFlags.Target | ClearFlags.ZBuffer, EditorOptions.FillColor.ToRawColorBGRA(), 1, 0); d3ddevice.SetRenderState(RenderState.ZEnable, true); #endregion d3ddevice.BeginScene(); // all drawings after this line MatrixStack transform = new MatrixStack(); EditorOptions.RenderStateCommonSetup(d3ddevice); if (LevelData.leveleff != null & viewSkyboxToolStripMenuItem.Checked) { d3ddevice.SetRenderState(RenderState.FogEnable, false); d3ddevice.SetRenderState(RenderState.ZWriteEnable, false); LevelData.leveleff.Render(d3ddevice, cam); d3ddevice.SetRenderState(RenderState.ZWriteEnable, true); } #region Fog settings if (currentStageFog != null && fogButton.Checked) { d3ddevice.SetRenderState(RenderState.FogColor, System.Drawing.Color.FromArgb(currentStageFog.A, currentStageFog.R, currentStageFog.G, currentStageFog.B).ToArgb()); EditorOptions.SetStageFogData(currentStageFog); d3ddevice.SetRenderState(RenderState.FogEnable, currentStageFog.FogEnabled); } #endregion List <RenderInfo> renderlist_death = new List <RenderInfo>(); List <RenderInfo> renderlist_geo = new List <RenderInfo>(); List <RenderInfo> renderlist_char = new List <RenderInfo>(); List <RenderInfo> renderlist_set = new List <RenderInfo>(); #region Adding Level Geometry if (LevelData.LevelItems != null) { foreach (LevelItem item in LevelData.LevelItems) { bool display = false; if (visibleToolStripMenuItem.Checked && item.Visible) { display = true; } else if (invisibleToolStripMenuItem.Checked && !item.Visible) { display = true; } else if (allToolStripMenuItem.Checked) { display = true; } if (display) { renderlist_geo.AddRange(item.Render(d3ddevice, cam, transform)); } } } if (LevelData.LevelAnims != null) { foreach (LevelAnim item in LevelData.LevelAnims) { bool display = false; if (visibleToolStripMenuItem.Checked || allToolStripMenuItem.Checked) { display = true; } if (display) { renderlist_geo.AddRange(item.Render(d3ddevice, cam, transform)); } } } #endregion if (LevelData.StartPositions != null) { renderlist_char.AddRange(LevelData.StartPositions[LevelData.Character].Render(d3ddevice, cam, transform)); } #region Adding Death Zones if (LevelData.DeathZones != null & viewDeathZonesToolStripMenuItem.Checked) { foreach (DeathZoneItem item in LevelData.DeathZones) { if (item.Visible) { renderlist_death.AddRange(item.Render(d3ddevice, cam, transform)); } } } #endregion #region Adding SET Layout if (!LevelData.SETItemsIsNull() && viewSETItemsToolStripMenuItem.Checked) { foreach (SETItem item in LevelData.SETItems(LevelData.Character)) { bool render = false; if (item.ClipSetting == ClipSetting.All) { render = true; } else if (item.ClipSetting == ClipSetting.HighOnly && editorDetailSetting == ClipLevel.Far) { render = true; } else if (item.ClipSetting == ClipSetting.MediumAndHigh && (editorDetailSetting == ClipLevel.Medium || editorDetailSetting == ClipLevel.Far)) { render = true; } if (render) { renderlist_set.AddRange(item.Render(d3ddevice, cam, transform)); } } } #endregion #region Adding CAM Layout if (LevelData.CAMItems != null && viewCAMItemsToolStripMenuItem.Checked) { foreach (CAMItem item in LevelData.CAMItems[LevelData.Character]) { renderlist_set.AddRange(item.Render(d3ddevice, cam, transform)); } } #endregion #region Adding Mission SET Layout if (LevelData.MissionSETItems != null && viewMissionSETItemsToolStripMenuItem.Checked) { foreach (MissionSETItem item in LevelData.MissionSETItems[LevelData.Character]) { renderlist_set.AddRange(item.Render(d3ddevice, cam, transform)); } } #endregion #region Adding splines if (viewSplinesToolStripMenuItem.Checked) { foreach (SplineData spline in LevelData.LevelSplines) { renderlist_set.AddRange(spline.Render(d3ddevice, cam, transform)); } } #endregion #region Debug Bounds Drawing if (boundsToolStripMenuItem.Checked) { MatrixStack debugBoundsStack = new MatrixStack(); List <Item> selection = selectedItems.GetSelection(); debugBoundsStack.Push(); foreach (Item item in selection) { if (item is LevelItem) { LevelItem lvlItem = (LevelItem)item; boundsMesh = Direct3D.Mesh.Sphere(lvlItem.CollisionData.Bounds.Radius, 9, 9); debugBoundsStack.NJTranslate(lvlItem.CollisionData.Bounds.Center); RenderInfo info = new RenderInfo(boundsMesh, 0, debugBoundsStack.Top, boundsMaterial, null, FillMode.Solid, item.Bounds); renderlist_geo.Add(info); } else if (item is SETItem) { SETItem setitem = (SETItem)item; boundsMesh = Direct3D.Mesh.Sphere(setitem.Bounds.Radius, 9, 9); debugBoundsStack.NJTranslate(setitem.Bounds.Center); RenderInfo info = new RenderInfo(boundsMesh, 0, debugBoundsStack.Top, boundsMaterial, null, FillMode.Solid, item.Bounds); renderlist_set.Add(info); } } debugBoundsStack.Pop(); } #endregion if (dragType == DragType.Model) { if (dragPlaceLevelModel != null && dragPlaceLevelMesh != null) { renderlist_set.AddRange(dragPlaceLevelModel.DrawModel( d3ddevice.GetRenderState <FillMode>(RenderState.FillMode), transform, LevelData.Textures[LevelData.leveltexs], dragPlaceLevelMesh, true)); } } List <RenderInfo> drawqueue = new List <RenderInfo>(); cam.DrawDistance = Math.Min(EditorOptions.RenderDrawDistance, EditorOptions.LevelDrawDistance); drawqueue.AddRange(RenderInfo.Queue(renderlist_geo, cam)); cam.DrawDistance = Math.Min(EditorOptions.SetItemDrawDistance, EditorOptions.SetItemDrawDistance); drawqueue.AddRange(RenderInfo.Queue(renderlist_set, cam)); cam.DrawDistance = Math.Min(EditorOptions.RenderDrawDistance, EditorOptions.RenderDrawDistance); EditorOptions.SetLightType(d3ddevice, EditorOptions.SADXLightTypes.Level); RenderInfo.Draw(drawqueue, d3ddevice, cam); d3ddevice.SetRenderState(RenderState.FogEnable, false); EditorOptions.SetLightType(d3ddevice, EditorOptions.SADXLightTypes.Character); RenderInfo.Draw(renderlist_char, d3ddevice, cam); d3ddevice.SetRenderState(RenderState.ZWriteEnable, false); RenderInfo.Draw(renderlist_death, d3ddevice, cam); d3ddevice.SetRenderState(RenderState.ZWriteEnable, true); // SADX water if (LevelData.leveleff != null & viewSkyboxToolStripMenuItem.Checked) { d3ddevice.SetRenderState(RenderState.ZWriteEnable, false); LevelData.leveleff.RenderLate(d3ddevice, cam); d3ddevice.SetRenderState(RenderState.ZWriteEnable, true); } d3ddevice.EndScene(); // scene drawings go before this line #region Draw Helper Objects cam.DrawDistance = 100000; projection = Matrix.PerspectiveFovRH(cam.FOV, cam.Aspect, 1, cam.DrawDistance); d3ddevice.SetTransform(TransformState.Projection, projection); cam.BuildFrustum(view, projection); foreach (PointHelper pointHelper in PointHelper.Instances) { pointHelper.DrawBox(d3ddevice, cam); } transformGizmo.Draw(d3ddevice, cam); foreach (PointHelper pointHelper in PointHelper.Instances) { pointHelper.Draw(d3ddevice, cam); } osd.ProcessMessages(); #endregion d3ddevice.Present(); }