private static GameObject BuildMarker(int iconX, int iconY, float markerSize, Texture gizmoTexture, Color nativeColor, int drawingLayer, int propID, Shader shader) { GameObject marker = JUtil.CreateSimplePlane("RPMPFDMarker" + iconX + iconY + propID, markerSize, drawingLayer); Material material = new Material(shader); material.mainTexture = gizmoTexture; material.mainTextureScale = Vector2.one / 3f; material.mainTextureOffset = new Vector2(iconX * (1f / 3f), iconY * (1f / 3f)); material.color = Color.white; material.SetVector("_Color", nativeColor); marker.renderer.material = material; marker.transform.position = Vector3.zero; JUtil.ShowHide(false, marker); return(marker); }
internal HorizontalBar(ConfigNode node, float screenWidth, float screenHeight, int drawingLayer, Shader displayShader, GameObject cameraBody) { JUtil.LogMessage(this, "Configuring for {0}", node.GetValue("name")); if (!node.HasValue("variableName")) { throw new Exception("HorizontalBar " + node.GetValue("name") + " missing variableName"); } variable = VariableOrNumber.Instantiate(node.GetValue("variableName")); if (!node.HasValue("texture")) { throw new Exception("HorizontalBar " + node.GetValue("name") + " missing texture"); } Texture2D tex = GameDatabase.Instance.GetTexture(node.GetValue("texture"), false); if (tex == null) { throw new Exception("HorizontalBar " + node.GetValue("name") + " texture " + node.GetValue("texture") + " can't be loaded."); } tex.wrapMode = TextureWrapMode.Clamp; if (node.HasValue("useLog10") && bool.TryParse(node.GetValue("useLog10"), out useLog10) == false) { // I think this is redundant useLog10 = false; } if (!node.HasValue("scale")) { throw new Exception("HorizontalBar " + node.GetValue("name") + " missing scale"); } scale = ConfigNode.ParseVector2(node.GetValue("scale")); if (useLog10) { scale.x = JUtil.PseudoLog10(scale.x); scale.y = JUtil.PseudoLog10(scale.y); } if (!node.HasValue("textureSize")) { throw new Exception("HorizontalBar " + node.GetValue("name") + " missing textureSize"); } if (!float.TryParse(node.GetValue("textureSize"), out textureSize)) { throw new Exception("HorizontalBar " + node.GetValue("name") + " failed parsing textureSize"); } textureSize = 0.5f * textureSize / (float)tex.width; if (!node.HasValue("textureLimit")) { throw new Exception("HorizontalBar " + node.GetValue("name") + " missing textureLimit"); } textureLimit = ConfigNode.ParseVector2(node.GetValue("textureLimit")); textureLimit.x = 1.0f - textureLimit.x / (float)tex.width; textureLimit.y = 1.0f - textureLimit.y / (float)tex.width; if (!node.HasValue("position")) { throw new Exception("HorizontalBar " + node.GetValue("name") + " missing position"); } Vector4 position = ConfigNode.ParseVector4(node.GetValue("position")); if (node.HasValue("enablingVariable") && node.HasValue("enablingVariableRange")) { string[] range = node.GetValue("enablingVariableRange").Split(','); if (range.Length != 2) { throw new Exception("HorizontalBar " + node.GetValue("name") + " has an invalid enablingVariableRange"); } enablingVariable = new VariableOrNumberRange(node.GetValue("enablingVariable").Trim(), range[0].Trim(), range[1].Trim()); } barObject = JUtil.CreateSimplePlane("HorizontalBar" + node.GetValue("name"), new Vector2(0.5f * position.z, 0.5f * position.w), new Rect(0.0f, 0.0f, 1.0f, 1.0f), drawingLayer); Material barMaterial = new Material(displayShader); barMaterial.color = Color.white; barMaterial.mainTexture = tex; // Position in camera space has (0, 0) in the center, so we need to // translate everything appropriately. Y is odd since the coordinates // supplied are Left-Handed (0Y on top, growing down), not RH. barObject.transform.position = new Vector3(position.x + 0.5f * (position.z - screenWidth), 0.5f * (screenHeight - position.w) - position.y, 1.4f); barObject.GetComponent <Renderer>().material = barMaterial; barObject.transform.parent = cameraBody.transform; JUtil.ShowHide(true, barObject); }
/// <summary> /// Initialize the renderable game objects for the HUD. /// </summary> /// <param name="screenWidth"></param> /// <param name="screenHeight"></param> void InitializeRenderables(RenderTexture screen) { float screenWidth = (float)screen.width; float screenHeight = (float)screen.height; Shader displayShader = JUtil.LoadInternalShader("RPM-DisplayShader"); if (!string.IsNullOrEmpty(cameraTransform)) { cameraObject = new FlyingCamera(part, screen, hudCamera.aspect); cameraObject.PointCamera(cameraTransform, hudFov); } if (!string.IsNullOrEmpty(staticOverlay)) { Material overlayMaterial = new Material(displayShader); overlayMaterial.color = Color.white; Texture overlayTexture = GameDatabase.Instance.GetTexture(staticOverlay.EnforceSlashes(), false); overlayMaterial.mainTexture = overlayTexture; overlayMesh = JUtil.CreateSimplePlane("JSIHeadsUpDisplayOverlay" + hudCamera.GetInstanceID(), screenWidth * 0.5f, drawingLayer); overlayMesh.transform.position = new Vector3(0, 0, 1.0f); overlayMesh.GetComponent <Renderer>().material = overlayMaterial; overlayMesh.transform.parent = cameraBody.transform; JUtil.ShowHide(false, overlayMesh); } if (!string.IsNullOrEmpty(horizonTexture)) { Shader ladderShader = JUtil.LoadInternalShader("RPM-CroppedDisplayShader"); Material ladderMaterial = new Material(ladderShader); // _CropBound is in device normalized coordinates (-1 - +1) Vector4 cropBound = new Vector4(-horizonSize.x / screenWidth, -horizonSize.y / screenHeight, horizonSize.x / screenWidth, horizonSize.y / screenHeight); ladderMaterial.SetVector("_CropBound", cropBound); ladderMaterial.color = Color.white; ladderMaterial.mainTexture = GameDatabase.Instance.GetTexture(horizonTexture.EnforceSlashes(), false); if (ladderMaterial.mainTexture != null) { float diagonal = horizonSize.magnitude / Mathf.Min(horizonSize.x, horizonSize.y) * 0.5f; Vector2 horizonDrawSize = diagonal * horizonSize; horizonTextureSize.x = 0.5f * (horizonTextureSize.x / ladderMaterial.mainTexture.width); horizonTextureSize.y = 0.5f * (horizonTextureSize.y / ladderMaterial.mainTexture.height); ladderMaterial.mainTexture.wrapMode = TextureWrapMode.Clamp; ladderMesh = JUtil.CreateSimplePlane("JSIHeadsUpDisplayLadder" + hudCamera.GetInstanceID(), horizonDrawSize, new Rect(0.0f, 0.0f, 1.0f, 1.0f), drawingLayer); ladderMesh.transform.position = new Vector3(0, 0, 1.45f); ladderMesh.GetComponent <Renderer>().material = ladderMaterial; ladderMesh.transform.parent = cameraBody.transform; JUtil.ShowHide(false, ladderMesh); if (progradeColorValue.a > 0.0f && showLadderPrograde) { Material progradeIconMaterial = new Material(displayShader); progradeIconMaterial.color = Color.white; Rect texCoord; if (string.IsNullOrEmpty(ladderProgradeTexture)) { progradeIconMaterial.mainTexture = JUtil.GetGizmoTexture(); texCoord = GizmoIcons.GetIconLocation(GizmoIcons.IconType.PROGRADE); } else { Texture2D progradeTexture = GameDatabase.Instance.GetTexture(ladderProgradeTexture.EnforceSlashes(), false); if (progradeTexture == null) { JUtil.LogErrorMessage(this, "Failed to find ladder prograde texture \"{0}\".", ladderProgradeTexture); } progradeIconMaterial.mainTexture = progradeTexture; texCoord = new Rect(0.0f, 0.0f, 1.0f, 1.0f); } progradeIconMaterial.SetVector("_Color", progradeColorValue); progradeLadderIcon = JUtil.CreateSimplePlane("JSIHeadsUpDisplayLadderProgradeIcon" + hudCamera.GetInstanceID(), new Vector2(iconPixelSize * 0.5f, iconPixelSize * 0.5f), texCoord, drawingLayer); progradeLadderIcon.transform.position = new Vector3(0.0f, 0.0f, 1.41f); progradeLadderIcon.GetComponent <Renderer>().material = progradeIconMaterial; progradeLadderIcon.transform.parent = cameraBody.transform; } } } if (!string.IsNullOrEmpty(headingBar)) { Material headingMaterial = new Material(displayShader); headingMaterial.color = Color.white; headingMaterial.mainTexture = GameDatabase.Instance.GetTexture(headingBar.EnforceSlashes(), false); if (headingMaterial.mainTexture != null) { headingBarTextureWidth = 0.5f * (headingBarWidth / (float)headingMaterial.mainTexture.width); headingMaterial.mainTexture.wrapMode = TextureWrapMode.Repeat; headingMesh = JUtil.CreateSimplePlane("JSIHeadsUpDisplayHeading" + hudCamera.GetInstanceID(), new Vector2(headingBarPosition.z * 0.5f, headingBarPosition.w * 0.5f), new Rect(0.0f, 0.0f, 1.0f, 1.0f), drawingLayer); headingMesh.transform.position = new Vector3(headingBarPosition.x + 0.5f * (headingBarPosition.z - screenWidth), 0.5f * (screenHeight - headingBarPosition.w) - headingBarPosition.y, 1.4f); headingMesh.GetComponent <Renderer>().material = headingMaterial; headingMesh.transform.parent = cameraBody.transform; JUtil.ShowHide(false, headingMesh); if (progradeColorValue.a > 0.0f && showHeadingBarPrograde) { Material progradeIconMaterial = new Material(displayShader); progradeIconMaterial.color = Color.white; Rect texCoord; if (string.IsNullOrEmpty(headingBarProgradeTexture)) { progradeIconMaterial.mainTexture = JUtil.GetGizmoTexture(); texCoord = GizmoIcons.GetIconLocation(GizmoIcons.IconType.PROGRADE); } else { Texture2D progradeTexture = GameDatabase.Instance.GetTexture(headingBarProgradeTexture.EnforceSlashes(), false); if (progradeTexture == null) { JUtil.LogErrorMessage(this, "Failed to find heading bar prograde texture \"{0}\".", headingBarProgradeTexture); } progradeIconMaterial.mainTexture = progradeTexture; texCoord = new Rect(0.0f, 0.0f, 1.0f, 1.0f); } progradeIconMaterial.SetVector("_Color", progradeColorValue); progradeHeadingIconOrigin = headingBarPosition.x + 0.5f * (headingBarPosition.z - screenWidth); progradeHeadingIcon = JUtil.CreateSimplePlane("JSIHeadsUpDisplayHeadingProgradeIcon" + hudCamera.GetInstanceID(), new Vector2(iconPixelSize * 0.5f, iconPixelSize * 0.5f), texCoord, drawingLayer); progradeHeadingIcon.transform.position = new Vector3(progradeHeadingIconOrigin, 0.5f * (screenHeight - headingBarPosition.w) - headingBarPosition.y, 1.35f); progradeHeadingIcon.GetComponent <Renderer>().material = progradeIconMaterial; progradeHeadingIcon.transform.parent = headingMesh.transform; } } } if (!string.IsNullOrEmpty(verticalBar)) { ConfigNode[] nodes = GameDatabase.Instance.GetConfigNodes("JSIHUD_VERTICAL_BAR"); string[] vBars = verticalBar.Split(';'); for (int i = 0; i < vBars.Length; ++i) { for (int j = 0; j < nodes.Length; ++j) { if (nodes[j].HasValue("name") && vBars[i].Trim() == nodes[j].GetValue("name")) { try { VerticalBar vb = new VerticalBar(nodes[j], screenWidth, screenHeight, drawingLayer, displayShader, cameraBody); verticalBars.Add(vb); } catch (Exception e) { JUtil.LogErrorMessage(this, "Error parsing JSIHUD_VERTICAL_BAR: {0}", e); } break; } } } } if (!string.IsNullOrEmpty(horizontalBar)) { ConfigNode[] nodes = GameDatabase.Instance.GetConfigNodes("JSIHUD_HORIZONTAL_BAR"); string[] hBars = horizontalBar.Split(';'); for (int i = 0; i < hBars.Length; ++i) { for (int j = 0; j < nodes.Length; ++j) { if (nodes[j].HasValue("name") && hBars[i].Trim() == nodes[j].GetValue("name")) { try { HorizontalBar hb = new HorizontalBar(nodes[j], screenWidth, screenHeight, drawingLayer, displayShader, cameraBody); horizontalBars.Add(hb); } catch (Exception e) { JUtil.LogErrorMessage(this, "Error parsing JSIHUD_HORIZONTAL_BAR: {0}", e); } break; } } } } }
private void ConfigureElements(float screenWidth, float screenHeight) { // How big is the nav ball, anyway? navballRadius = 0.0f; MeshFilter meshFilter = navBall.GetComponent <MeshFilter>(); if (meshFilter != null) { // NOTE: I assume this really is a nav*ball*, not something // weird, and that it's centered on the origin. navballRadius = meshFilter.mesh.bounds.size.x * 0.5f; if (!(navballRadius > 0.0f)) { throw new Exception("JSIPrimaryFlightDisplay navball had an invalid size"); } } else { throw new Exception("JSIPrimaryFlightDisplay could not get the navball mesh"); } // Figure out how we have to manipulate the camera to get the // navball in the right place, and in the right size. float cameraSpan = navballRadius * screenHeight / navBallDiameter; float pixelSize = cameraSpan / (screenHeight * 0.5f); ballCamera.orthographicSize = cameraSpan; float newXPos = navBallCenter.x - screenWidth * 0.5f; float newYPos = screenHeight * 0.5f - navBallCenter.y; navBallOrigin = navBall.transform.position; navBallOrigin.x += newXPos * pixelSize; navBallOrigin.y += newYPos * pixelSize; navBall.transform.position = navBallOrigin; // Because we use this value to offset the markers, we don't // want/need depth info. navBallOrigin.z = 0.0f; float overlayDepth = navBall.transform.position.z - navballRadius - 0.1f; Shader displayShader = JUtil.LoadInternalShader("RPM-DisplayShader"); if (!string.IsNullOrEmpty(staticOverlay)) { Material overlayMaterial = new Material(displayShader); overlayMaterial.mainTexture = GameDatabase.Instance.GetTexture(staticOverlay.EnforceSlashes(), false); overlay = JUtil.CreateSimplePlane("RPMPFDOverlay" + internalProp.propID, cameraSpan, drawingLayer); overlay.layer = drawingLayer; overlay.transform.position = new Vector3(0, 0, overlayDepth); overlay.renderer.material = overlayMaterial; overlay.transform.parent = cameraBody.transform; } if (!string.IsNullOrEmpty(headingBar)) { Material headingMaterial = new Material(displayShader); headingMaterial.mainTexture = GameDatabase.Instance.GetTexture(headingBar.EnforceSlashes(), false); float hbXPos = headingBarPosition.x - screenWidth * 0.5f; float hbYPos = screenHeight * 0.5f - headingBarPosition.y; heading = JUtil.CreateSimplePlane("RPMPFDHeading" + internalProp.propID, new Vector2(headingBarPosition.z * pixelSize, headingBarPosition.w * pixelSize), new Rect(0.0f, 0.0f, 1.0f, 1.0f), drawingLayer); heading.transform.position = new Vector3(hbXPos * pixelSize, hbYPos * pixelSize, headingAboveOverlay ? (overlayDepth - 0.1f) : (overlayDepth + 0.1f)); heading.transform.parent = cameraBody.transform; heading.renderer.material = headingMaterial; heading.renderer.material.SetTextureScale("_MainTex", new Vector2(headingSpan, 1f)); } Texture2D gizmoTexture = JUtil.GetGizmoTexture(); markerDepth = navBall.transform.position.z - navballRadius - 0.05f; float scaledMarkerSize = markerSize * 0.5f * pixelSize; markerPrograde = BuildMarker(0, 2, scaledMarkerSize, gizmoTexture, progradeColorValue, drawingLayer, internalProp.propID, displayShader); markerRetrograde = BuildMarker(1, 2, scaledMarkerSize, gizmoTexture, progradeColorValue, drawingLayer, internalProp.propID, displayShader); markerManeuver = BuildMarker(2, 0, scaledMarkerSize, gizmoTexture, maneuverColorValue, drawingLayer, internalProp.propID, displayShader); markerManeuverMinus = BuildMarker(1, 2, scaledMarkerSize, gizmoTexture, maneuverColorValue, drawingLayer, internalProp.propID, displayShader); markerTarget = BuildMarker(2, 1, scaledMarkerSize, gizmoTexture, targetColorValue, drawingLayer, internalProp.propID, displayShader); markerTargetMinus = BuildMarker(2, 2, scaledMarkerSize, gizmoTexture, targetColorValue, drawingLayer, internalProp.propID, displayShader); markerNormal = BuildMarker(0, 0, scaledMarkerSize, gizmoTexture, normalColorValue, drawingLayer, internalProp.propID, displayShader); markerNormalMinus = BuildMarker(1, 0, scaledMarkerSize, gizmoTexture, normalColorValue, drawingLayer, internalProp.propID, displayShader); markerRadial = BuildMarker(1, 1, scaledMarkerSize, gizmoTexture, radialColorValue, drawingLayer, internalProp.propID, displayShader); markerRadialMinus = BuildMarker(0, 1, scaledMarkerSize, gizmoTexture, radialColorValue, drawingLayer, internalProp.propID, displayShader); markerDockingAlignment = BuildMarker(0, 2, scaledMarkerSize, gizmoTexture, dockingColorValue, drawingLayer, internalProp.propID, displayShader); markerNavWaypoint = BuildMarker(0, 2, scaledMarkerSize, gizmoTexture, waypointColorValue, drawingLayer, internalProp.propID, displayShader); }