public void DoSplineObjects(){ if(!tNode.CanSplinate()){ return; } if(tNode.SplinatedObjects == null){ tNode.SplinatedObjects = new List<GSD.Roads.Splination.SplinatedMeshMaker>(); } eCount = tNode.SplinatedObjects.Count; SMM = null; eCount = tNode.SplinatedObjects.Count; if(eCount == 0){ } for(int i=0;i<tNode.SplinatedObjects.Count;i++){ currentCount +=1; SMM = tNode.SplinatedObjects[i]; if(SMM.EM == null){ SMM.EM = new GSD.Roads.Splination.SplinatedMeshMaker.SplinatedMeshEditorMaker(); } SMM.EM.Setup(SMM); //GSD.Roads.Splination.AxisTypeEnum tAxisTypeSpline = GSD.Roads.Splination.AxisTypeEnum.Z; EditorGUILayout.BeginVertical("TextArea"); if(SMM.bNeedsUpdate){ SMM.Setup(true); } EditorGUILayout.BeginHorizontal(); SMM.bToggle = EditorGUILayout.Foldout(SMM.bToggle,"#"+ currentCount.ToString() + ": " + SMM.tName); if(GUILayout.Button(btnExtrudeText,GSDImageButton,GUILayout.Width(32f))){ } if(GUILayout.Button(btnRefreshText,GSDImageButton,GUILayout.Width(16f))){ SMM.Setup(); } if(GUILayout.Button(btnSaveText,GSDImageButton,GUILayout.Width(16f))){ GSDSaveWindow tSave = EditorWindow.GetWindow<GSDSaveWindow>(); tSave.Initialize(ref tSceneRect,GSDSaveWindow.WindowTypeEnum.Extrusion,tNode,SMM); } if(GUILayout.Button(btnCopyText,GSDImageButton,GUILayout.Width(16f))){ Undo.RecordObject(tNode,"Copy"); tNode.CopySplinatedObject(ref SMM); EditorUtility.SetDirty(tNode); } if(GUILayout.Button(btnDeleteText,GSDImageButton,GUILayout.Width(16f))){ Undo.RecordObject(tNode,"Delete"); tNode.RemoveSplinatedObject(i); EditorUtility.SetDirty(tNode); } EditorGUILayout.EndHorizontal(); if(!SMM.bToggle){ EditorGUILayout.EndVertical(); continue; } GUILayout.Space(8f); EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("General options:"); if(GUILayout.Button("Online manual",EditorStyles.miniButton,GUILayout.Width(120f))){ Application.OpenURL("http://microgsd.com/Support/RoadArchitectManual.aspx"); } EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginVertical("box"); //Name: SMM.EM.tName = EditorGUILayout.TextField("Name:",SMM.tName); //Game object (prefab): SMM.EM.CurrentSplination = (GameObject)EditorGUILayout.ObjectField("Prefab:",SMM.CurrentSplination,typeof(GameObject), false); //Game object (prefab start cap): SMM.EM.CurrentSplinationCap1 = (GameObject)EditorGUILayout.ObjectField("Prefab start cap:",SMM.CurrentSplinationCap1,typeof(GameObject), false); //Prefab start cap height offset: if(SMM.CurrentSplinationCap1 != null){ SMM.EM.CapHeightOffset1 = EditorGUILayout.FloatField(" Height offset:",SMM.CapHeightOffset1); } //Game object (prefab end cap): SMM.EM.CurrentSplinationCap2 = (GameObject)EditorGUILayout.ObjectField("Prefab end cap:",SMM.CurrentSplinationCap2,typeof(GameObject), false); //Prefab end cap height offset: if(SMM.CurrentSplinationCap2 != null){ SMM.EM.CapHeightOffset2 = EditorGUILayout.FloatField(" Height offset:",SMM.CapHeightOffset2); } //Material overrides: SMM.EM.bMaterialOverride = EditorGUILayout.Toggle("Material override: ",SMM.bMaterialOverride); if(SMM.bMaterialOverride){ SMM.EM.SplinatedMaterial1 = (Material)EditorGUILayout.ObjectField("Override mat #1: ",SMM.SplinatedMaterial1,typeof(Material), false); SMM.EM.SplinatedMaterial2 = (Material)EditorGUILayout.ObjectField("Override mat #2: ",SMM.SplinatedMaterial2,typeof(Material), false); } //Axis: SMM.EM.Axis = (GSD.Roads.Splination.AxisTypeEnum)EditorGUILayout.Popup("Extrusion axis: ",(int)SMM.Axis,TheAxisDescriptions_Spline,GUILayout.Width(250f)); //Start time: if(SMM.StartTime < tNode.MinSplination){ SMM.StartTime = tNode.MinSplination; } if(SMM.EndTime > tNode.MaxSplination){ SMM.EndTime = tNode.MaxSplination; } EditorGUILayout.BeginHorizontal(); SMM.EM.StartTime = EditorGUILayout.Slider("Start param: ",SMM.StartTime,tNode.MinSplination,tNode.MaxSplination-0.01f); if(GUILayout.Button("match node",EditorStyles.miniButton, GUILayout.Width(80f))){ SMM.EM.StartTime = tNode.tTime; } if(SMM.EM.StartTime >= SMM.EM.EndTime){ SMM.EM.EndTime = (SMM.EM.StartTime + 0.01f); } EditorGUILayout.EndHorizontal(); //End time: EditorGUILayout.BeginHorizontal(); SMM.EM.EndTime = EditorGUILayout.Slider("End param: ",SMM.EndTime,SMM.StartTime,tNode.MaxSplination); if(GUILayout.Button("match next",EditorStyles.miniButton, GUILayout.Width(80f))){ SMM.EM.EndTime = tNode.NextTime; } if(SMM.EM.StartTime >= SMM.EM.EndTime){ SMM.EM.EndTime = (SMM.EM.StartTime + 0.01f); } EditorGUILayout.EndHorizontal(); //Straight line options: if(tNode.IsStraight()){ if(!SMM.bIsStretch){ SMM.EM.bIsStretch = EditorGUILayout.Toggle("Straight line stretch:",SMM.bIsStretch); }else{ EditorGUILayout.BeginVertical("box"); SMM.EM.bIsStretch = EditorGUILayout.Toggle("Straight line stretch:",SMM.bIsStretch); //Stretch_UVThreshold: SMM.EM.Stretch_UVThreshold = EditorGUILayout.Slider("UV stretch threshold:",SMM.Stretch_UVThreshold,0.01f,0.5f); //UV repeats: SMM.EM.RepeatUVType = (GSD.Roads.Splination.RepeatUVTypeEnum)EditorGUILayout.Popup("UV stretch axis: ",(int)SMM.RepeatUVType,RepeatUVTypeDescriptions_Spline,GUILayout.Width(250f)); EditorGUILayout.EndVertical(); } }else{ SMM.EM.bIsStretch = false; } SMM.EM.bTrimStart = EditorGUILayout.Toggle("Trim start:",SMM.bTrimStart); SMM.EM.bTrimEnd = EditorGUILayout.Toggle("Trim end:",SMM.bTrimEnd); //Static option: SMM.EM.bStatic = EditorGUILayout.Toggle("Static: ",SMM.bStatic); //Splination method // SMM.EM.bMatchRoadIncrements = EditorGUILayout.Toggle("Match road increments: ",SMM.bMatchRoadIncrements); SMM.EM.bMatchTerrain = EditorGUILayout.Toggle("Match ground: ",SMM.bMatchTerrain); //Vector min/max threshold: EditorGUILayout.BeginHorizontal(); SMM.EM.MinMaxMod = EditorGUILayout.Slider("Vertex min/max threshold: ",SMM.MinMaxMod,0.01f,0.2f); if(GUILayout.Button(btnDefaultText,GSDImageButton,GUILayout.Width(16f))){ SMM.EM.MinMaxMod = 0.05f; } EditorGUILayout.EndHorizontal(); //Vertex matching precision: EditorGUILayout.BeginHorizontal(); SMM.EM.VertexMatchingPrecision = EditorGUILayout.Slider("Vertex matching precision: ",SMM.VertexMatchingPrecision,0f,0.01f); if(GUILayout.Button(btnDefaultText,GSDImageButton,GUILayout.Width(16f))){ SMM.EM.VertexMatchingPrecision = 0.005f; } EditorGUILayout.EndHorizontal(); //UV repeats: if(!SMM.bIsStretch){ SMM.EM.RepeatUVType = (GSD.Roads.Splination.RepeatUVTypeEnum)EditorGUILayout.Popup("UV repeat axis: ",(int)SMM.RepeatUVType,RepeatUVTypeDescriptions_Spline,GUILayout.Width(250f)); } if(SMM.bMatchRoadDefinition){ EditorGUILayout.BeginVertical("TextArea"); EditorGUILayout.BeginHorizontal(); SMM.EM.bMatchRoadDefinition = EditorGUILayout.Toggle("Match road definition: ",SMM.bMatchRoadDefinition); if(GUILayout.Button(btnDefaultText,GSDImageButton,GUILayout.Width(16f))){ SMM.EM.bMatchRoadDefinition = false; } EditorGUILayout.EndHorizontal(); if(SMM.bMatchRoadDefinition){ EditorGUILayout.LabelField(" Only use this option if object length doesn't match the road definition.", EditorStyles.miniLabel); EditorGUILayout.LabelField(" Matching road definition requires a UV repeat type.", EditorStyles.miniLabel); EditorGUILayout.LabelField(" If the material fails to scale properly, try flipping the Y rotation.", EditorStyles.miniLabel); } //Flip rotation option: SMM.EM.bFlipRotation = EditorGUILayout.Toggle(" Flip Y rotation: ",SMM.bFlipRotation); EditorGUILayout.EndVertical(); }else{ EditorGUILayout.BeginHorizontal(); SMM.EM.bMatchRoadDefinition = EditorGUILayout.Toggle("Match road definition: ",SMM.bMatchRoadDefinition); if(GUILayout.Button(btnDefaultText,GSDImageButton,GUILayout.Width(16f))){ SMM.EM.bMatchRoadDefinition = false; } EditorGUILayout.EndHorizontal(); } EditorGUILayout.EndVertical(); //Vertical offset: EditorGUILayout.LabelField("Vertical options:"); EditorGUILayout.BeginVertical("box"); EditorGUILayout.BeginHorizontal(); SMM.EM.VerticalRaise = EditorGUILayout.Slider("Vertical raise magnitude:",SMM.VerticalRaise,-512f,512f); if(GUILayout.Button(btnDefaultText,GSDImageButton,GUILayout.Width(16f))){ SMM.EM.VerticalRaise = 0f; } EditorGUILayout.EndHorizontal(); //Vertical curve: if(SMM.VerticalCurve == null || SMM.VerticalCurve.keys.Length < 2){ EnforceCurve(ref SMM.VerticalCurve); } EditorGUILayout.BeginHorizontal(); SMM.EM.VerticalCurve = EditorGUILayout.CurveField("Curve: ",SMM.VerticalCurve); if(GUILayout.Button(btnDefaultText,GSDImageButton,GUILayout.Width(16f))){ ResetCurve(ref SMM.EM.VerticalCurve); } EditorGUILayout.EndHorizontal(); EditorGUILayout.EndVertical(); //Horizontal offsets: SMM.EM.HorizontalSep = SMM.HorizontalSep; EditorGUILayout.LabelField("Horizontal offset options:"); EditorGUILayout.BeginVertical("box"); tHorizMatching = HorizMatchingDefaultsEnum.None; tHorizMatching = (HorizMatchingDefaultsEnum)EditorGUILayout.Popup((int)tHorizMatching,HorizMatchSubTypeDescriptions, GUILayout.Width(100f)); if(tHorizMatching != HorizMatchingDefaultsEnum.None){ if(tHorizMatching == HorizMatchingDefaultsEnum.MatchCenter){ SMM.EM.HorizontalSep = 0f; }else if(tHorizMatching == HorizMatchingDefaultsEnum.MatchRoadLeft){ SMM.EM.HorizontalSep = (tNode.GSDSpline.tRoad.RoadWidth()/2)*-1; }else if(tHorizMatching == HorizMatchingDefaultsEnum.MatchShoulderLeft){ SMM.EM.HorizontalSep = ((tNode.GSDSpline.tRoad.RoadWidth()/2) + tNode.GSDSpline.tRoad.opt_ShoulderWidth)*-1; }else if(tHorizMatching == HorizMatchingDefaultsEnum.MatchRoadRight){ SMM.EM.HorizontalSep = (tNode.GSDSpline.tRoad.RoadWidth()/2); }else if(tHorizMatching == HorizMatchingDefaultsEnum.MatchShoulderRight){ SMM.EM.HorizontalSep = (tNode.GSDSpline.tRoad.RoadWidth()/2) + tNode.GSDSpline.tRoad.opt_ShoulderWidth; } tHorizMatching = HorizMatchingDefaultsEnum.None; } EditorGUILayout.BeginHorizontal(); SMM.EM.HorizontalSep = EditorGUILayout.Slider("Horiz offset magnitude:",SMM.HorizontalSep,(-1f*HorizRoadMax),HorizRoadMax); if(GUILayout.Button(btnDefaultText,GSDImageButton,GUILayout.Width(16f))){ SMM.EM.HorizontalSep = 0f; } EditorGUILayout.EndHorizontal(); //Horizontal curve: if(SMM.HorizontalCurve == null || SMM.HorizontalCurve.keys.Length < 2){ EnforceCurve(ref SMM.HorizontalCurve); } EditorGUILayout.BeginHorizontal(); SMM.EM.HorizontalCurve = EditorGUILayout.CurveField("Curve: ",SMM.HorizontalCurve); if(GUILayout.Button(btnDefaultText,GSDImageButton,GUILayout.Width(16f))){ ResetCurve(ref SMM.EM.HorizontalCurve); } EditorGUILayout.EndHorizontal(); EditorGUILayout.EndVertical(); //Vertical cutoff: EditorGUILayout.LabelField("Vertical cutoff:"); EditorGUILayout.BeginVertical("box"); SMM.EM.bVerticalCutoff = EditorGUILayout.Toggle("Height cutoff enabled:",SMM.bVerticalCutoff); if(SMM.bVerticalCutoff){ SMM.EM.bVerticalCutoff_MatchZero = EditorGUILayout.Toggle("Match spline height:",SMM.bVerticalCutoff_MatchZero); SMM.EM.bVerticalCutoffDownwards = EditorGUILayout.Toggle("Cut direction toggle:",SMM.bVerticalCutoffDownwards); SMM.EM.VerticalCutoff = EditorGUILayout.Slider("Height cut offset: ",SMM.VerticalCutoff,-50f,50f); SMM.EM.bVerticalMeshCutoff_OppositeDir = EditorGUILayout.Toggle("Opposite dir mesh cut:",SMM.bVerticalMeshCutoff_OppositeDir); SMM.EM.VerticalMeshCutoffOffset = EditorGUILayout.Slider("Mesh cut offset: ",SMM.VerticalMeshCutoffOffset,-5f,5f); } EditorGUILayout.EndVertical(); //End type: EditorGUILayout.LabelField("Extrusion ending options:"); EditorGUILayout.BeginVertical("box"); SMM.EM.bEndDown = EditorGUILayout.Toggle("Push endings down:",SMM.bEndDown); if(SMM.bEndDown){ SMM.EM.bEndTypeDownOverride = EditorGUILayout.Toggle("Override down value: ",SMM.bEndTypeDownOverride); if(SMM.bEndTypeDownOverride){ SMM.EM.EndTypeDownOverride = EditorGUILayout.Slider("Downward movement: ",SMM.EndTypeDownOverride,-10f,10f); } } EditorGUILayout.EndVertical(); //Start and end objects: EditorGUILayout.LabelField("Start & end objects:"); EditorGUILayout.BeginVertical("box"); //End cap custom match start: SMM.EM.bEndCapCustomMatchStart = EditorGUILayout.Toggle("Match objects to ends:",SMM.bEndCapCustomMatchStart); //End objects match ground: SMM.EM.bEndObjectsMatchGround = EditorGUILayout.Toggle("Force origins to ground:",SMM.bEndObjectsMatchGround); //Start cap: EditorGUILayout.BeginVertical("box"); EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("Start object:"); tEndObjectAdd = (EndObjectsDefaultsEnum)EditorGUILayout.Popup((int)tEndObjectAdd,EndObjectsDefaultsEnumDesc); if(tEndObjectAdd != EndObjectsDefaultsEnum.None){ SMM.EM.EndCapStart = GetEndObjectQuickAdd(); tEndObjectAdd = EndObjectsDefaultsEnum.None; } EditorGUILayout.EndHorizontal(); SMM.EM.EndCapStart = (GameObject)EditorGUILayout.ObjectField("Prefab:",SMM.EndCapStart,typeof(GameObject), false); if(SMM.EndCapStart != null){ SMM.EM.EndCapCustomOffsetStart = EditorGUILayout.Vector3Field("Position offset:",SMM.EndCapCustomOffsetStart); SMM.EM.EndCapCustomRotOffsetStart = EditorGUILayout.Vector3Field("Rotation offset:",SMM.EndCapCustomRotOffsetStart); } EditorGUILayout.EndVertical(); //End cap: EditorGUILayout.BeginVertical("box"); EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("End object:"); tEndObjectAdd = (EndObjectsDefaultsEnum)EditorGUILayout.Popup((int)tEndObjectAdd,EndObjectsDefaultsEnumDesc); if(tEndObjectAdd != EndObjectsDefaultsEnum.None){ SMM.EM.EndCapEnd = GetEndObjectQuickAdd(); SMM.EM.EndCapCustomRotOffsetEnd = new Vector3(0f,180f,0f); tEndObjectAdd = EndObjectsDefaultsEnum.None; } EditorGUILayout.EndHorizontal(); SMM.EM.EndCapEnd = (GameObject)EditorGUILayout.ObjectField("Prefab:",SMM.EndCapEnd,typeof(GameObject), false); if(SMM.EndCapEnd != null){ SMM.EM.EndCapCustomOffsetEnd = EditorGUILayout.Vector3Field("Position offset:",SMM.EndCapCustomOffsetEnd); SMM.EM.EndCapCustomRotOffsetEnd = EditorGUILayout.Vector3Field("Rotation offset:",SMM.EndCapCustomRotOffsetEnd); } EditorGUILayout.EndVertical(); EditorGUILayout.EndVertical(); //Collision: EditorGUILayout.LabelField("Collision options:"); EditorGUILayout.BeginVertical("box"); SMM.EM.CollisionType = (GSD.Roads.Splination.CollisionTypeEnum)EditorGUILayout.Popup("Collision type: ",(int)SMM.CollisionType,TheCollisionTypeEnumDescSpline,GUILayout.Width(320f)); //Mesh collison convex option if(SMM.CollisionType != GSD.Roads.Splination.CollisionTypeEnum.None && SMM.CollisionType != GSD.Roads.Splination.CollisionTypeEnum.BoxCollision){ SMM.EM.bCollisionConvex = EditorGUILayout.Toggle(" Convex: ",SMM.bCollisionConvex); SMM.EM.bCollisionTrigger = EditorGUILayout.Toggle(" Trigger: ",SMM.bCollisionTrigger); } if(SMM.CollisionType == GSD.Roads.Splination.CollisionTypeEnum.SimpleMeshTriangle || SMM.CollisionType == GSD.Roads.Splination.CollisionTypeEnum.SimpleMeshTrapezoid){ SMM.EM.bSimpleCollisionAutomatic = EditorGUILayout.Toggle(" Automatic simple collision: ", SMM.bSimpleCollisionAutomatic); } //If not automatic simple collisions: if(!SMM.bSimpleCollisionAutomatic){ if(SMM.CollisionType == GSD.Roads.Splination.CollisionTypeEnum.SimpleMeshTriangle){ SMM.EM.CollisionTriBL = SMM.CollisionTriBL; SMM.EM.CollisionTriBR = SMM.CollisionTriBR; SMM.EM.CollisionTriT = SMM.CollisionTriT; EditorGUILayout.LabelField("Bottom left:"); SMM.EM.CollisionTriBL.x = EditorGUILayout.Slider(" x-axis: ",SMM.CollisionTriBL.x,SMM.mMinX-5f,SMM.mMaxX+5f); SMM.EM.CollisionTriBL.y = EditorGUILayout.Slider(" y-axis: ",SMM.CollisionTriBL.y,SMM.mMinY-5f,SMM.mMaxY+5f); SMM.EM.CollisionTriBL.z = EditorGUILayout.Slider(" z-axis: ",SMM.CollisionTriBL.z,SMM.mMinZ-5f,SMM.mMaxZ+5f); EditorGUILayout.LabelField("Bottom right:"); SMM.EM.CollisionTriBR.x = EditorGUILayout.Slider(" x-axis: ",SMM.CollisionTriBR.x,SMM.mMinX-5f,SMM.mMaxX+5f); SMM.EM.CollisionTriBR.y = EditorGUILayout.Slider(" y-axis: ",SMM.CollisionTriBR.y,SMM.mMinY-5f,SMM.mMaxY+5f); SMM.EM.CollisionTriBR.z = EditorGUILayout.Slider(" z-axis: ",SMM.CollisionTriBR.z,SMM.mMinZ-5f,SMM.mMaxZ+5f); EditorGUILayout.LabelField("Top:"); SMM.EM.CollisionTriT.x = EditorGUILayout.Slider(" x-axis: ",SMM.CollisionTriT.x,SMM.mMinX-5f,SMM.mMaxX+5f); SMM.EM.CollisionTriT.y = EditorGUILayout.Slider(" y-axis: ",SMM.CollisionTriT.y,SMM.mMinY-5f,SMM.mMaxY+5f); SMM.EM.CollisionTriT.z = EditorGUILayout.Slider(" z-axis: ",SMM.CollisionTriT.z,SMM.mMinZ-5f,SMM.mMaxZ+5f); }else if(SMM.CollisionType == GSD.Roads.Splination.CollisionTypeEnum.SimpleMeshTrapezoid){ SMM.EM.CollisionBoxBL = EditorGUILayout.Vector3Field(" Bottom left:",SMM.CollisionBoxBL); SMM.EM.CollisionBoxBR = EditorGUILayout.Vector3Field(" Bottom right:",SMM.CollisionBoxBR); SMM.EM.CollisionBoxTL = EditorGUILayout.Vector3Field(" Top left:",SMM.CollisionBoxTL); SMM.EM.CollisionBoxTR = EditorGUILayout.Vector3Field(" Top right:",SMM.CollisionBoxTR); } } if(SMM.CollisionType == GSD.Roads.Splination.CollisionTypeEnum.BoxCollision){ SMM.EM.StretchBC_LocOffset = EditorGUILayout.Vector3Field("Box collider center offset:",SMM.StretchBC_LocOffset); SMM.EM.bBCFlipX = EditorGUILayout.Toggle("Flip center X:", SMM.bBCFlipX); SMM.EM.bBCFlipZ = EditorGUILayout.Toggle("Flip center Z:", SMM.bBCFlipZ); SMM.EM.bStretchSize = EditorGUILayout.Toggle("Box collider size edit:",SMM.bStretchSize); if(SMM.bStretchSize){ SMM.EM.StretchBC_Size = EditorGUILayout.Vector3Field("Size:",SMM.StretchBC_Size); }else{ EditorGUILayout.LabelField("Size:",SMM.StretchBC_Size.ToString()); } } EditorGUILayout.EndVertical(); EditorGUILayout.LabelField("Rotation options:"); EditorGUILayout.BeginVertical("box"); //Custom rotation: SMM.EM.CustomRotation = SMM.CustomRotation; //EOM.CustomRotation = EditorGUILayout.Vector3Field("Custom rotation: ",EOM.CustomRotation); EditorGUILayout.BeginHorizontal(); //Flip rotation option: if(SMM.EM.bFlipRotation != SMM.bFlipRotation){ SMM.EM.bFlipRotation = EditorGUILayout.Toggle("Flip Y rotation: ",SMM.EM.bFlipRotation); }else{ SMM.EM.bFlipRotation = EditorGUILayout.Toggle("Flip Y rotation: ",SMM.bFlipRotation); } // if(GUILayout.Button("Reset custom rotation",EditorStyles.miniButton,GUILayout.Width(160f))){ // SMM.CustomRotation = new Vector3(0f,0f,0f); // } if(GUILayout.Button(btnDefaultText,GSDImageButton,GUILayout.Width(16f))){ SMM.EM.CustomRotation = new Vector3(0f,0f,0f); } EditorGUILayout.EndHorizontal(); // SMM.EM.CustomRotation = EditorGUILayout.Vector3Field("",SMM.CustomRotation); // SMM.EM.CustomRotation.x = EditorGUILayout.Slider("x-axis: ",SMM.CustomRotation.x,-360f,360f); // SMM.EM.CustomRotation.y = EditorGUILayout.Slider("y-axis: ",SMM.CustomRotation.y,-360f,360f); // SMM.EM.CustomRotation.z = EditorGUILayout.Slider("z-axis: ",SMM.CustomRotation.z,-360f,360f); EditorGUILayout.EndVertical(); EditorGUILayout.EndVertical(); EditorGUILayout.LabelField("Deprecated options:"); EditorGUILayout.BeginVertical("box"); SMM.EM.bExactSplination = EditorGUILayout.Toggle("Directional extrusion: ",SMM.bExactSplination); EditorGUILayout.EndVertical(); BigLine(); BigLine(); } }
public void DoEdgeObjects(){ if(!tNode.CanSplinate()){ return; } if(tNode.EdgeObjects == null){ tNode.EdgeObjects = new List<GSD.Roads.EdgeObjects.EdgeObjectMaker>(); } eCount = tNode.EdgeObjects.Count; EOM = null; for(int i=0;i<tNode.EdgeObjects.Count;i++){ EOM = tNode.EdgeObjects[i]; if(EOM.EM == null){ EOM.EM = new GSD.Roads.EdgeObjects.EdgeObjectMaker.EdgeObjectEditorMaker(); } EOM.EM.Setup(EOM); currentCount +=1; EditorGUILayout.BeginVertical("TextArea"); if(EOM.bNeedsUpdate){ EOM.Setup(); } EOM.bNeedsUpdate = false; EditorGUILayout.BeginHorizontal(); EOM.bToggle = EditorGUILayout.Foldout(EOM.bToggle,"#" + currentCount.ToString() + ": " + EOM.tName); if(GUILayout.Button(btnEdgeText,GSDImageButton,GUILayout.Width(32f))){ } if(GUILayout.Button(btnRefreshText,GSDImageButton,GUILayout.Width(16f))){ EOM.Setup(); } if(GUILayout.Button(btnSaveText,GSDImageButton,GUILayout.Width(16f))){ GSDSaveWindow tSave = EditorWindow.GetWindow<GSDSaveWindow>(); tSave.Initialize(ref tSceneRect,GSDSaveWindow.WindowTypeEnum.Edge,tNode,null,EOM); } if(GUILayout.Button(btnCopyText,GSDImageButton,GUILayout.Width(16f))){ Undo.RecordObject(tNode,"Copy"); tNode.CopyEdgeObject(i); EditorUtility.SetDirty(tNode); } if(GUILayout.Button(btnDeleteText,GSDImageButton,GUILayout.Width(16f))){ Undo.RecordObject(tNode,"Delete"); tNode.RemoveEdgeObject(i); EditorUtility.SetDirty(tNode); } EditorGUILayout.EndHorizontal(); if(!EOM.bToggle){ EditorGUILayout.EndVertical(); continue; } GUILayout.Space(8f); EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("General options:"); if(GUILayout.Button("Online manual",EditorStyles.miniButton,GUILayout.Width(120f))){ Application.OpenURL("http://microgsd.com/Support/RoadArchitectManual.aspx"); } EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginVertical("box"); //Name: EOM.EM.tName = EditorGUILayout.TextField("Name: ",EOM.tName); //Edge object: EOM.EM.EdgeObject = (GameObject)EditorGUILayout.ObjectField("Edge object: ",EOM.EdgeObject,typeof(GameObject), false); if(EOM.EM.EdgeObject != EOM.EdgeObject){ EOM.bEdgeSignLabelInit = false; EOM.bEdgeSignLabel = false; } //Material override: EOM.EM.bMaterialOverride = EditorGUILayout.Toggle("Material override: ",EOM.bMaterialOverride); if(!EOM.bMaterialOverride){ EOM.EM.EdgeMaterial1 = null; EOM.EM.EdgeMaterial2 = null; } if(!EOM.bEdgeSignLabelInit){ EOM.bEdgeSignLabel = false; if(string.CompareOrdinal(EOM.EM.EdgeObject.name,"GSDSignDiamond") == 0){ EOM.bEdgeSignLabel = true; EOM.EdgeSignLabel = "GSDFedSign-diamond"; }else if(string.CompareOrdinal(EOM.EM.EdgeObject.name,"GSDSignSquare-Small") == 0){ EOM.bEdgeSignLabel = true; EOM.EdgeSignLabel = "GSDFedSign-Square"; }else if(string.CompareOrdinal(EOM.EM.EdgeObject.name,"GSDSignSquare") == 0){ EOM.bEdgeSignLabel = true; EOM.EdgeSignLabel = "GSDFedSign-Square"; }else if(string.CompareOrdinal(EOM.EM.EdgeObject.name,"GSDSign988-Small") == 0){ EOM.bEdgeSignLabel = true; EOM.EdgeSignLabel = "GSDFedSign-988"; }else if(string.CompareOrdinal(EOM.EM.EdgeObject.name,"GSDSign988") == 0){ EOM.bEdgeSignLabel = true; EOM.EdgeSignLabel = "GSDFedSign-988"; }else if(string.CompareOrdinal(EOM.EM.EdgeObject.name,"GSDSign861-Small") == 0){ EOM.bEdgeSignLabel = true; EOM.EdgeSignLabel = "GSDFedSign-861"; }else if(string.CompareOrdinal(EOM.EM.EdgeObject.name,"GSDSign861") == 0){ EOM.bEdgeSignLabel = true; EOM.EdgeSignLabel = "GSDFedSign-861"; }else if(string.CompareOrdinal(EOM.EM.EdgeObject.name,"GSDSign617-Small") == 0){ EOM.bEdgeSignLabel = true; EOM.EdgeSignLabel = "GSDFedSign-617"; }else if(string.CompareOrdinal(EOM.EM.EdgeObject.name,"GSDSign617") == 0){ EOM.bEdgeSignLabel = true; EOM.EdgeSignLabel = "GSDFedSign-617"; }else if(string.CompareOrdinal(EOM.EM.EdgeObject.name,"GSDSign396") == 0){ EOM.bEdgeSignLabel = true; EOM.EdgeSignLabel = "GSDFedSign-396"; }else if(string.CompareOrdinal(EOM.EM.EdgeObject.name,"GSDSign330") == 0){ EOM.bEdgeSignLabel = true; EOM.EdgeSignLabel = "GSDFedSign-330"; } } if(EOM.bMaterialOverride){ if(EOM.bEdgeSignLabel){ EditorGUILayout.TextField("Material search term: ",EOM.EdgeSignLabel); } EOM.EM.EdgeMaterial1 = (Material)EditorGUILayout.ObjectField("Override mat #1: ",EOM.EdgeMaterial1,typeof(Material), false); EOM.EM.EdgeMaterial2 = (Material)EditorGUILayout.ObjectField("Override mat #2: ",EOM.EdgeMaterial2,typeof(Material), false); } if(EOM.bSingle){ EOM.EM.bCombineMesh = false; }else{ EOM.EM.bCombineMesh = EditorGUILayout.Toggle("Combine meshes: ",EOM.bCombineMesh); if(EOM.bCombineMesh){ EOM.EM.bCombineMeshCollider = EditorGUILayout.Toggle("Combined mesh collider: ",EOM.bCombineMeshCollider); } } EOM.EM.bSingle = EditorGUILayout.Toggle("Single object only: ",EOM.bSingle); if(EOM.EM.bSingle != EOM.bSingle){ EOM.EM.EndTime = tNode.NextTime; // EOM.EM.EndPos = tNode.GSDSpline.GetSplineValue(EOM.EM.EndTime,false); EOM.EM.SinglePosition = tNode.tTime+0.025f; if(EOM.EM.bSingle){ EOM.EM.bCombineMesh = false; } } if(EOM.bSingle){ EOM.EM.SinglePosition = EditorGUILayout.Slider("Single location: ",EOM.SinglePosition,tNode.tTime,1f); if(tNode.bIsBridgeStart && tNode.bIsBridgeMatched){ EOM.EM.SingleOnlyBridgePercent = EditorGUILayout.Slider("Bridge %: ",EOM.SingleOnlyBridgePercent,0f,1f); if(!GSDRootUtil.IsApproximately(EOM.SingleOnlyBridgePercent,EOM.EM.SingleOnlyBridgePercent,0.001f)){ EOM.EM.SingleOnlyBridgePercent = Mathf.Clamp(EOM.EM.SingleOnlyBridgePercent,0f,1f); float tDist = (EOM.EM.SingleOnlyBridgePercent * (tNode.BridgeCounterpartNode.tDist - tNode.tDist) + tNode.tDist); EOM.EM.SinglePosition = tNode.GSDSpline.TranslateDistBasedToParam(tDist); } } } EOM.EM.bStatic = EditorGUILayout.Toggle("Static: ",EOM.bStatic); EOM.EM.bMatchTerrain = EditorGUILayout.Toggle("Match ground height: ",EOM.bMatchTerrain); if(!EOM.bSingle){ EOM.EM.MeterSep = EditorGUILayout.Slider("Dist between objects: ",EOM.MeterSep,1f,256f); } EOM.EM.bStartMatchRoadDefinition = EditorGUILayout.Toggle("Match road definition: ",EOM.bStartMatchRoadDefinition); if(EOM.bStartMatchRoadDefinition){ EOM.EM.StartMatchRoadDef = EditorGUILayout.Slider("Position fine tuning: ",EOM.StartMatchRoadDef,0f,1f); if(!GSDRootUtil.IsApproximately(EOM.EM.StartMatchRoadDef,EOM.StartMatchRoadDef,0.001f)){ EOM.EM.StartMatchRoadDef = Mathf.Clamp(EOM.EM.StartMatchRoadDef,0f,1f); } } if(!EOM.bSingle){ if(EOM.EM.StartTime < tNode.MinSplination){ EOM.EM.StartTime = tNode.MinSplination; } if(EOM.EM.EndTime > tNode.MaxSplination){ EOM.EM.EndTime = tNode.MaxSplination; } EditorGUILayout.BeginHorizontal(); EOM.EM.StartTime = EditorGUILayout.Slider("Start param: ",EOM.StartTime,tNode.MinSplination,EOM.EndTime); if(EOM.EM.EndTime < EOM.EM.StartTime){ EOM.EM.EndTime = Mathf.Clamp(EOM.StartTime+0.01f,0f,1f); } if(GUILayout.Button("match node",EditorStyles.miniButton, GUILayout.Width(80f))){ EOM.EM.StartTime = tNode.tTime; } EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); EOM.EM.EndTime = EditorGUILayout.Slider("End param: ",EOM.EndTime,EOM.StartTime,tNode.MaxSplination); if(EOM.EM.StartTime > EOM.EM.EndTime){ EOM.EM.StartTime = Mathf.Clamp(EOM.EndTime-0.01f,0f,1f); } if(GUILayout.Button("match next",EditorStyles.miniButton, GUILayout.Width(80f))){ EOM.EM.EndTime = tNode.NextTime; } EditorGUILayout.EndHorizontal(); } EditorGUILayout.EndVertical(); //Vertical offset: EditorGUILayout.LabelField("Vertical options:"); EditorGUILayout.BeginVertical("box"); EditorGUILayout.BeginHorizontal(); EOM.EM.VerticalRaise = EditorGUILayout.Slider("Vertical raise magnitude:",EOM.VerticalRaise,-512f,512f); if(GUILayout.Button(btnDefaultText,GSDImageButton,GUILayout.Width(16f))){ EOM.EM.VerticalRaise = 0f; } EditorGUILayout.EndHorizontal(); if(EOM.VerticalCurve == null || EOM.VerticalCurve.keys.Length < 2){ EnforceCurve(ref EOM.VerticalCurve); } EditorGUILayout.BeginHorizontal(); EOM.EM.VerticalCurve = EditorGUILayout.CurveField("Curve: ",EOM.VerticalCurve); if(GUILayout.Button(btnDefaultText,GSDImageButton,GUILayout.Width(16f))){ ResetCurve(ref EOM.EM.VerticalCurve); } EditorGUILayout.EndHorizontal(); EditorGUILayout.EndVertical(); //Horizontal offsets: EditorGUILayout.LabelField("Horizontal offset options:"); EditorGUILayout.BeginVertical("box"); tHorizMatching = HorizMatchingDefaultsEnum.None; tHorizMatching = (HorizMatchingDefaultsEnum)EditorGUILayout.Popup((int)tHorizMatching,HorizMatchSubTypeDescriptions, GUILayout.Width(100f)); if(tHorizMatching != HorizMatchingDefaultsEnum.None){ if(tHorizMatching == HorizMatchingDefaultsEnum.MatchCenter){ EOM.EM.HorizontalSep = 0f; }else if(tHorizMatching == HorizMatchingDefaultsEnum.MatchRoadLeft){ EOM.EM.HorizontalSep = (tNode.GSDSpline.tRoad.RoadWidth()*0.5f)*-1; }else if(tHorizMatching == HorizMatchingDefaultsEnum.MatchShoulderLeft){ if(tNode.GSDSpline.tRoad.opt_bShouldersEnabled){ EOM.EM.HorizontalSep = ((tNode.GSDSpline.tRoad.RoadWidth()*0.5f) + tNode.GSDSpline.tRoad.opt_ShoulderWidth)*-1; }else{ EOM.EM.HorizontalSep = ((tNode.GSDSpline.tRoad.RoadWidth()*0.5f))*-1; } }else if(tHorizMatching == HorizMatchingDefaultsEnum.MatchRoadRight){ EOM.EM.HorizontalSep = (tNode.GSDSpline.tRoad.RoadWidth()*0.5f); }else if(tHorizMatching == HorizMatchingDefaultsEnum.MatchShoulderRight){ if(tNode.GSDSpline.tRoad.opt_bShouldersEnabled){ EOM.EM.HorizontalSep = (tNode.GSDSpline.tRoad.RoadWidth()*0.5f) + tNode.GSDSpline.tRoad.opt_ShoulderWidth; }else{ EOM.EM.HorizontalSep = (tNode.GSDSpline.tRoad.RoadWidth()*0.5f); } } tHorizMatching = HorizMatchingDefaultsEnum.None; } if(!GSDRootUtil.IsApproximately(EOM.EM.HorizontalSep,EOM.HorizontalSep)){ EOM.EM.HorizontalSep = Mathf.Clamp(EOM.EM.HorizontalSep,(-1f*HorizRoadMax),HorizRoadMax); } EditorGUILayout.BeginHorizontal(); EOM.EM.HorizontalSep = EditorGUILayout.Slider("Horiz offset magnitude:",EOM.EM.HorizontalSep,(-1f*HorizRoadMax),HorizRoadMax); if(GUILayout.Button(btnDefaultText,GSDImageButton,GUILayout.Width(16f))){ EOM.EM.HorizontalSep = 0f; } if(!GSDRootUtil.IsApproximately(EOM.EM.HorizontalSep,EOM.HorizontalSep)){ EOM.EM.HorizontalSep = Mathf.Clamp(EOM.EM.HorizontalSep,(-1f*HorizRoadMax),HorizRoadMax); } EditorGUILayout.EndHorizontal(); if(EOM.HorizontalCurve == null || EOM.HorizontalCurve.keys.Length < 2){ EnforceCurve(ref EOM.HorizontalCurve); } EditorGUILayout.BeginHorizontal(); EOM.EM.HorizontalCurve = EditorGUILayout.CurveField("Curve: ",EOM.HorizontalCurve); if(GUILayout.Button(btnDefaultText,GSDImageButton,GUILayout.Width(16f))){ ResetCurve(ref EOM.EM.HorizontalCurve); } EditorGUILayout.EndHorizontal(); EditorGUILayout.EndVertical(); EditorGUILayout.LabelField("Rotation options:"); EditorGUILayout.BeginVertical("box"); if(EOM.HorizontalSep < 0f){ EOM.EM.bOncomingRotation = EditorGUILayout.Toggle("Auto rotate oncoming objects: ",EOM.bOncomingRotation); } EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("Custom rotation: "); if(GUILayout.Button(btnDefaultText,GSDImageButton,GUILayout.Width(16f))){ EOM.EM.CustomRotation = new Vector3(0f,0f,0f); } EditorGUILayout.EndHorizontal(); EOM.EM.CustomRotation.x = EditorGUILayout.Slider("x-axis: ",EOM.CustomRotation.x,-360f,360f); EOM.EM.CustomRotation.y = EditorGUILayout.Slider("y-axis: ",EOM.CustomRotation.y,-360f,360f); EOM.EM.CustomRotation.z = EditorGUILayout.Slider("z-axis: ",EOM.CustomRotation.z,-360f,360f); EditorGUILayout.EndVertical(); EditorGUILayout.EndVertical(); } }