/// <summary> /// Sets up for a single area world. /// </summary> private void ClearWorld() { _portalAreaCount = 1; _areaScreenRect = new idScreenRect[] { new idScreenRect() }; _portalAreas = new PortalArea[] { new PortalArea() }; SetupAreaReferences(); // even though we only have a single area, create a node // that has both children pointing at it so we don't need to AreaNode areaNode = new AreaNode(); areaNode.Plane.D = 1; areaNode.Children[0] = -1; areaNode.Children[1] = -1; _areaNodes = new AreaNode[1]; _areaNodes[0] = areaNode; }
private int CommonChildrenArea(AreaNode node) { int[] nums = new int[2]; int count = nums.Length; for(int i = 0; i < count; i++) { if(node.Children[i] <= 0) { nums[i] = -1 - node.Children[i]; } else { nums[i] = CommonChildrenArea(_areaNodes[node.Children[i]]); } } // solid nodes will match any area if(nums[0] == idRenderWorld.AreaSolid) { nums[0] = nums[1]; } if(nums[1] == idRenderWorld.AreaSolid) { nums[1] = nums[0]; } int common; if(nums[0] == nums[1]) { common = nums[0]; } else { common = idRenderWorld.ChildrenHaveMultipleAreas; } return (node.CommonChildrenArea = common); }
private void ParseNodes(idLexer lexer) { lexer.ExpectTokenString("{"); _areaNodeCount = lexer.ParseInt(); if(_areaNodeCount < 0) { lexer.Error("ParseNodes: bad areaNodeCount"); } _areaNodes = new AreaNode[_areaNodeCount]; float[] tmp; AreaNode node; for(int i = 0; i < _areaNodeCount; i++) { node = _areaNodes[i] = new AreaNode(); tmp = lexer.Parse1DMatrix(4); node.Plane = new Plane(tmp[0], tmp[1], tmp[2], tmp[3]); node.Children[0] = lexer.ParseInt(); node.Children[1] = lexer.ParseInt(); } lexer.ExpectTokenString("}"); }