예제 #1
0
	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();
		}
	}
예제 #2
0
	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();
		}
	}