public override void Render(ViewControl vc) { Matrix4F normWorld = GetManipulatorMatrix(); if (normWorld == null) { return; } Camera camera = vc.Camera; float s; Util.CalcAxisLengths(camera, normWorld.Translation, out s); m_translatorControl.Render(normWorld, s); Matrix4F sc = new Matrix4F(); Vec3F pos = normWorld.Translation; s /= 12.0f; sc.Scale(s); Matrix4F bl = new Matrix4F(); Util.CreateBillboard(bl, pos, camera.WorldEye, camera.Up, camera.LookAt); Matrix4F recXform = new Matrix4F(); Matrix4F.Multiply(sc, bl, recXform); Util3D.DrawPivot(recXform, Color.Yellow); }
/// <summary> /// shutdown game engine. /// call it one time on application exit. /// </summary> public static void Shutdown() { foreach (var initializable in Globals.MEFContainer.GetExportedValues <XLEBridgeUtils.IShutdownWithEngine>()) { initializable.Shutdown(); } foreach (var keyValue in s_idToDomNode) { DestroyObject( keyValue.Key.Item1, keyValue.Key.Item2, keyValue.Value.TypeId); } s_idToDomNode.Clear(); s_foregroundUpdateTimer.Stop(); s_foregroundUpdateTimer.Dispose(); s_foregroundUpdateTimer = null; s_loggingRedirect.Dispose(); s_loggingRedirect = null; XLEBridgeUtils.Utils.DetachLibrary(); Util3D.Shutdown(); XLEBridgeUtils.Utils.GlobalSceneManager = null; s_entityInterface = null; s_underlyingScene.Dispose(); s_underlyingScene = null; s_retainedRenderResources.Dispose(); s_retainedRenderResources = null; s_engineDevice.Dispose(); s_engineDevice = null; GlobalSelection.Dispose(); GlobalSelection = null; CriticalError = s_notInitialized; }
public NativeDesignView() { GameEngine.Initialize(); Util3D.Init(); QuadView.TopLeft = new NativeDesignControl(this) { ViewType = ViewTypes.Perspective }; QuadView.TopRight = new NativeDesignControl(this) { ViewType = ViewTypes.Right }; QuadView.BottomLeft = new NativeDesignControl(this) { ViewType = ViewTypes.Top }; QuadView.BottomRight = new NativeDesignControl(this) { ViewType = ViewTypes.Front }; // set control names. QuadView.TopLeft.Name = "TopLeft"; QuadView.TopRight.Name = "TopRight"; QuadView.BottomLeft.Name = "BottomLeft"; QuadView.BottomRight.Name = "BottomRight"; ViewMode = ViewModes.Single; ContextChanged += NativeDesignView_ContextChanged; }
private void RenderSystemAxis() { float nz = Camera.Frustum.NearZ; float x = 0.05f * Width; Vec3F pos = new Vec3F(x, Height - x, 0.0f); Matrix4F vp = Camera.ViewMatrix * Camera.ProjectionMatrix; pos = this.Unproject(pos, vp); if (Camera.Frustum.IsOrtho) { pos = pos + Camera.LookAt; } else { pos = pos + Camera.LookAt * (Camera.NearZ * 0.1f); } float s; Util.CalcAxisLengths(Camera, pos, out s); Matrix4F scale = new Matrix4F(); scale.Scale(s * 0.3f); Matrix4F trans = new Matrix4F(pos); Matrix4F xform = scale * trans; Util3D.RenderFlag = BasicRendererFlags.WireFrame | BasicRendererFlags.DisableDepthTest; Util3D.DrawX(xform, Color.Red); Util3D.DrawY(xform, Color.Green); Util3D.DrawZ(xform, Color.Blue); Matrix4F wvp = xform * vp; if (ViewType != ViewTypes.Left && ViewType != ViewTypes.Right) { Vec3F xaxis = new Vec3F(1, 0, 0); Point scPt = Project(wvp, xaxis); GameEngine.DrawText2D("X", Util3D.CaptionFont, scPt.X, scPt.Y, Color.Red); } if (ViewType != ViewTypes.Top && ViewType != ViewTypes.Bottom) { Vec3F yaxis = new Vec3F(0, 1.6f, 0); Point scPt = Project(wvp, yaxis); GameEngine.DrawText2D("Y", Util3D.CaptionFont, scPt.X, scPt.Y, Color.Green); } if (ViewType != ViewTypes.Front && ViewType != ViewTypes.Back) { Vec3F zaxis = new Vec3F(0, 0, 1); Point scPt = Project(wvp, zaxis); GameEngine.DrawText2D("Z", Util3D.CaptionFont, scPt.X, scPt.Y, Color.Blue); } }
public override void Render(object opaqueContext, ViewControl vc) { Matrix4F normWorld = GetManipulatorMatrix(); if (normWorld == null) { return; } var context = opaqueContext as GUILayer.SimpleRenderingContext; if (context == null) { return; } Vec3F pos = normWorld.Translation; float s = Util.CalcAxisScale(vc.Camera, pos, AxisLength, vc.Height); bool highlight = m_hitRegion == HitRegion.XYSquare; Color centerCubeColor = highlight ? Color.Gold : Color.White; Vec3F sv = new Vec3F(s, s, s); Vec3F centerCubeScale = sv * CenterCubeSize; Matrix4F scale = new Matrix4F(); scale.Scale(centerCubeScale); Matrix4F centerCubeXform = scale * normWorld; Util3D.DrawCube(context, centerCubeXform, centerCubeColor); Matrix4F arrowScale = new Matrix4F(); arrowScale.Scale(0.75f); Util3D.DrawArrowCap( context, arrowScale * Matrix4F.CreateTranslation(new Vec3F(1.0f, 0.0f, -0.5f)) * centerCubeXform, highlight ? Color.Gold : Color.Red); Util3D.DrawArrowCap( context, arrowScale * Matrix4F.RotAxisRH(Vec3F.ZAxis, Math.PI) * Matrix4F.CreateTranslation(new Vec3F(-1.0f, 0.0f, -0.5f)) * centerCubeXform, highlight ? Color.Gold : Color.Red); Util3D.DrawArrowCap( context, arrowScale * Matrix4F.RotAxisRH(Vec3F.ZAxis, .5 * Math.PI) * Matrix4F.CreateTranslation(new Vec3F(0.0f, 1.0f, -0.5f)) * centerCubeXform, highlight ? Color.Gold : Color.Green); Util3D.DrawArrowCap( context, arrowScale * Matrix4F.RotAxisRH(Vec3F.ZAxis, 1.5f * Math.PI) * Matrix4F.CreateTranslation(new Vec3F(0.0f, -1.0f, -0.5f)) * centerCubeXform, highlight ? Color.Gold : Color.Green); }
public override void Render(object opaqueContext, ViewControl vc) { Matrix4F normWorld = GetManipulatorMatrix(); if (normWorld == null) { return; } var context = opaqueContext as GUILayer.SimpleRenderingContext; if (context == null) { return; } float RingDiameter = 2 * AxisLength; Color xcolor = (m_hitRegion == HitRegion.XAxis) ? Color.Gold : XAxisColor; Color ycolor = (m_hitRegion == HitRegion.YAxis) ? Color.Gold : YAxisColor; Color Zcolor = (m_hitRegion == HitRegion.ZAxis) ? Color.Gold : ZAxisColor; Color lColor = (m_hitRegion == HitRegion.LookAxis) ? Color.Gold : Color.Cyan; float s = Util.CalcAxisScale(vc.Camera, normWorld.Translation, RingDiameter, vc.Height); Vec3F axScale = new Vec3F(s, s, s); Matrix4F rot = new Matrix4F(); Matrix4F scale = new Matrix4F(); scale.Scale(axScale); rot.RotX(MathHelper.PiOver2); Matrix4F xform = scale * rot * normWorld; Util3D.DrawRing(context, xform, Zcolor); rot.RotZ(-MathHelper.PiOver2); xform = scale * rot * normWorld; Util3D.DrawRing(context, xform, xcolor); xform = scale * normWorld; Util3D.DrawRing(context, xform, ycolor); Matrix4F billboard = Util.CreateBillboard(normWorld.Translation, vc.Camera.WorldEye, vc.Camera.Up, vc.Camera.LookAt); rot.RotX(MathHelper.PiOver2); scale.Scale(s * LookRingScale); xform = scale * rot * billboard; Util3D.DrawRing(context, xform, lColor); }
/// <summary> /// init game engine /// call it one time during startup on the UI thread.</summary> public static void Init() { s_syncContext = SynchronizationContext.Current; s_invalidateCallback = new InvalidateViewsDlg(InvalidateViews); try { GUILayer.EngineDevice.SetDefaultWorkingDirectory(); s_engineDevice = new GUILayer.EngineDevice(); s_engineDevice.AttachDefaultCompilers(); s_retainedRenderResources = new GUILayer.RetainedRenderResources(s_engineDevice); s_underlyingScene = new GUILayer.EditorSceneManager(); Util3D.Init(); XLEBridgeUtils.Utils.GlobalSceneManager = s_underlyingScene; s_entityInterface = s_underlyingScene.GetEntityInterface(); CriticalError = ""; s_inist.PopulateEngineInfo( @"<EngineInfo> <SupportedResources> <ResourceDescriptor Type='Model' Name='Model' Description='Model' Ext='.dae' /> <ResourceDescriptor Type='ModelBookmark' Name='ModelBookmark' Description='ModelBookmark' Ext='.modelbookmark' /> <ResourceDescriptor Type='Texture' Name='Texture' Description='Texture' Ext='.dds,.tga,.bmp,.jpg,.jpeg,.png,.tif,.tiff,.gif,.hpd,.jxr,.wdp,.ico,.hdr,.exr' /> <ResourceDescriptor Type='Prefab' Name='Prefab' Description='Prefab' Ext='.prefab' /> </SupportedResources> </EngineInfo>"); XLEBridgeUtils.Utils.AttachLibrary(s_engineDevice); s_loggingRedirect = new XLEBridgeUtils.LoggingRedirect(); s_foregroundUpdateTimer = new System.Windows.Forms.Timer(); s_foregroundUpdateTimer.Tick += s_foregroundUpdateTimer_Elapsed; s_foregroundUpdateTimer.Interval = 32; s_foregroundUpdateTimer.Start(); } catch (Exception e) { CriticalError = "Error while initialising engine device: " + e.Message; } }
public override void Render(ViewControl vc) { Matrix4F normWorld = GetManipulatorMatrix(); if (normWorld == null) { return; } Util3D.RenderFlag = BasicRendererFlags.WireFrame | BasicRendererFlags.DisableDepthTest; Color xcolor = (m_hitRegion == HitRegion.XAxis) ? Color.LightSalmon : Color.Red; Color ycolor = (m_hitRegion == HitRegion.YAxis) ? Color.LightGreen : Color.Green; Color Zcolor = (m_hitRegion == HitRegion.ZAxis) ? Color.LightBlue : Color.Blue; float s; Util.CalcAxisLengths(vc.Camera, normWorld.Translation, out s); Vec3F axScale = new Vec3F(s, s, s); Matrix4F scale = new Matrix4F(); scale.Scale(axScale); Matrix4F xform = scale * normWorld; Util3D.DrawCircle(xform, Zcolor); Matrix4F rot = new Matrix4F(); rot.RotY(MathHelper.PiOver2); xform = scale * rot * normWorld; Util3D.DrawCircle(xform, xcolor); rot.RotX(MathHelper.PiOver2); xform = scale * rot * normWorld; Util3D.DrawCircle(xform, ycolor); }
public NativeDesignView() { GameEngine.Initialize(QuadView.Handle); Util3D.Init(); QuadView.TopLeft = new NativeDesignControl(this) { ViewType = ViewTypes.Perspective }; QuadView.TopRight = new NativeDesignControl(this) { ViewType = ViewTypes.Right }; QuadView.BottomLeft = new NativeDesignControl(this) { ViewType = ViewTypes.Top }; QuadView.BottomRight = new NativeDesignControl(this) { ViewType = ViewTypes.Front }; ViewMode = ViewModes.Single; ContextChanged += new EventHandler(NativeDesignView_ContextChanged); }
public override void Render(object opaqueContext, ViewControl vc) { Matrix4F normWorld = GetManipulatorMatrix(); if (normWorld == null) { return; } var context = opaqueContext as GUILayer.SimpleRenderingContext; if (context == null) { return; } Vec3F pos = normWorld.Translation; float s = Util.CalcAxisScale(vc.Camera, pos, AxisLength, vc.Height); Color xcolor = (m_hitRegion == HitRegion.XAxis || m_hitRegion == HitRegion.CenterCube) ? Color.Gold : XAxisColor; Color ycolor = (m_hitRegion == HitRegion.YAxis || m_hitRegion == HitRegion.CenterCube) ? Color.Gold : YAxisColor; Color zcolor = (m_hitRegion == HitRegion.ZAxis || m_hitRegion == HitRegion.CenterCube) ? Color.Gold : ZAxisColor; Color centerCubeColor = (m_hitRegion == HitRegion.CenterCube) ? Color.Gold : Color.White; Vec3F sv = new Vec3F(s, s, s); Vec3F axscale = new Vec3F(s * AxisThickness, s, s * AxisThickness); Matrix4F scale = new Matrix4F(); axscale.Y = Math.Abs(s * m_scale.X); scale.Scale(axscale); Matrix4F rot = new Matrix4F(); rot.RotZ(-MathHelper.PiOver2); Matrix4F xform = scale * rot * normWorld; Util3D.DrawCylinder(context, xform, xcolor); axscale.Y = Math.Abs(s * m_scale.Y); scale.Scale(axscale); xform = scale * normWorld; Util3D.DrawCylinder(context, xform, ycolor); rot.RotX(MathHelper.PiOver2); axscale.Y = Math.Abs(s * m_scale.Z); scale.Scale(axscale); xform = scale * rot * normWorld; Util3D.DrawCylinder(context, xform, zcolor); Vec3F centerCubeScale = sv * CenterCubeSize; scale.Scale(centerCubeScale); Matrix4F centerCubeXform = scale * normWorld; Util3D.DrawCube(context, centerCubeXform, centerCubeColor); Vec3F handleScale = new Vec3F(Math.Abs(s * m_scale.X), Math.Abs(s * m_scale.Y), Math.Abs(s * m_scale.Z)); Vec3F handle = sv * AxisHandle; float handleWidth = handle.X / 2; scale.Scale(handle); Matrix4F trans = new Matrix4F(); trans.Translation = new Vec3F(handleScale.X - handleWidth, 0, 0); xform = scale * trans * normWorld; Util3D.DrawCube(context, xform, xcolor); trans.Translation = new Vec3F(0, handleScale.Y - handleWidth, 0); xform = scale * trans * normWorld; Util3D.DrawCube(context, xform, ycolor); trans.Translation = new Vec3F(0, 0, handleScale.Z - handleWidth); xform = scale * trans * normWorld; Util3D.DrawCube(context, xform, zcolor); }
public override void Render(object opaqueContext, ViewControl vc) { Matrix4F normWorld = GetManipulatorMatrix(); if (normWorld == null) { return; } var context = opaqueContext as GUILayer.SimpleRenderingContext; if (context == null) { return; } int axis = (int)m_hitRegion; // axis colors Color saveColor = m_axisColor[axis]; m_axisColor[axis] = m_highlightColor; Color xcolor = m_axisColor[(int)HitRegion.XAxis]; Color ycolor = m_axisColor[(int)HitRegion.YAxis]; Color zcolor = m_axisColor[(int)HitRegion.ZAxis]; Color nxcolor = m_axisColor[(int)HitRegion.NegXAxis]; Color nycolor = m_axisColor[(int)HitRegion.NegYAxis]; Color nzcolor = m_axisColor[(int)HitRegion.NegZAxis]; m_axisColor[axis] = saveColor; if (m_hitRegion != HitRegion.None) { normWorld.Translation = HitMatrix.Translation; } Vec3F pos = normWorld.Translation; float s = Util.CalcAxisScale(vc.Camera, pos, AxisLength, vc.Height); Vec3F sv = new Vec3F(s, s, s); Vec3F axscale = new Vec3F(s * AxisThickness, s, s * AxisThickness); bool negativeAxis = m_hitRegion == HitRegion.NegXAxis || m_hitRegion == HitRegion.NegYAxis || m_hitRegion == HitRegion.NegZAxis; Vec3F dragScale = new Vec3F(Math.Abs(m_scale.X), Math.Abs(m_scale.Y), Math.Abs(m_scale.Z)); Matrix4F rot = new Matrix4F(); Matrix4F scale = new Matrix4F(); axscale.Y = negativeAxis ? s : s * dragScale.X; scale.Scale(axscale); rot.RotZ(-MathHelper.PiOver2); Matrix4F xform = scale * rot * normWorld; Util3D.DrawCylinder(context, xform, xcolor); axscale.Y = negativeAxis ? s : s * dragScale.Y; scale.Scale(axscale); xform = scale * normWorld; Util3D.DrawCylinder(context, xform, ycolor); axscale.Y = negativeAxis ? s : s * dragScale.Z; scale.Scale(axscale); rot.RotX(MathHelper.PiOver2); xform = scale * rot * normWorld; Util3D.DrawCylinder(context, xform, zcolor); rot.RotZ(MathHelper.PiOver2); axscale.Y = negativeAxis ? s * dragScale.X : s; scale.Scale(axscale); xform = scale * rot * normWorld; Util3D.DrawCylinder(context, xform, nxcolor); rot.RotZ(MathHelper.Pi); axscale.Y = negativeAxis ? s * dragScale.Y : s; scale.Scale(axscale); xform = scale * rot * normWorld; Util3D.DrawCylinder(context, xform, nycolor); rot.RotX(-MathHelper.PiOver2); axscale.Y = negativeAxis ? s * dragScale.Z : s; scale.Scale(axscale); xform = scale * rot * normWorld; Util3D.DrawCylinder(context, xform, nzcolor); // draw center cube scale.Scale(s * (1.0f / 16.0f)); xform = scale * normWorld; Util3D.DrawCube(context, xform, Color.White); Vec3F handle = sv * AxisHandle; float handleWidth = handle.X / 2; scale.Scale(handle); Matrix4F trans = new Matrix4F(); // X handle float drag = m_hitRegion == HitRegion.XAxis ? dragScale.X : 1.0f; trans.Translation = new Vec3F(drag * sv.X - handleWidth, 0, 0); xform = scale * trans * normWorld; Util3D.DrawCube(context, xform, xcolor); // y handle drag = m_hitRegion == HitRegion.YAxis ? dragScale.Y : 1.0f; trans.Translation = new Vec3F(0, drag * sv.Y - handleWidth, 0); xform = scale * trans * normWorld; Util3D.DrawCube(context, xform, ycolor); // z handle drag = m_hitRegion == HitRegion.ZAxis ? dragScale.Z : 1.0f; trans.Translation = new Vec3F(0, 0, drag * sv.Z - handleWidth); xform = scale * trans * normWorld; Util3D.DrawCube(context, xform, zcolor); // -x handle drag = m_hitRegion == HitRegion.NegXAxis ? dragScale.X : 1.0f; trans.Translation = new Vec3F(-sv.X * drag + handleWidth, 0, 0); xform = scale * trans * normWorld; Util3D.DrawCube(context, xform, nxcolor); // -y handle drag = m_hitRegion == HitRegion.NegYAxis ? dragScale.Y : 1.0f; trans.Translation = new Vec3F(0, -sv.Y * drag + handleWidth, 0); xform = scale * trans * normWorld; Util3D.DrawCube(context, xform, nycolor); // -z handle drag = m_hitRegion == HitRegion.NegZAxis ? dragScale.Z : 1.0f; trans.Translation = new Vec3F(0, 0, -sv.Z * drag + handleWidth); xform = scale * trans * normWorld; Util3D.DrawCube(context, xform, nzcolor); }
public override void Render(ViewControl vc) { BasicRendererFlags solid = BasicRendererFlags.Solid | BasicRendererFlags.DisableDepthTest; BasicRendererFlags wire = BasicRendererFlags.WireFrame | BasicRendererFlags.DisableDepthTest; Matrix4F normWorld = GetManipulatorMatrix(); if (normWorld == null) { return; } Camera camera = vc.Camera; int axis = (int)m_hitRegion; // axis colors Color saveColor = m_axisColor[axis]; m_axisColor[axis] = m_highlightColor; Color xcolor = m_axisColor[(int)HitRegion.XAxis]; Color ycolor = m_axisColor[(int)HitRegion.YAxis]; Color zcolor = m_axisColor[(int)HitRegion.ZAxis]; Color nxcolor = m_axisColor[(int)HitRegion.NegXAxis]; Color nycolor = m_axisColor[(int)HitRegion.NegYAxis]; Color nzcolor = m_axisColor[(int)HitRegion.NegZAxis]; m_axisColor[axis] = saveColor; Vec3F deltaTrans = Vec3F.ZeroVector; if (m_hitRegion != HitRegion.None) { normWorld.Translation = HitMatrix.Translation; } Vec3F pos = normWorld.Translation; float s; Util.CalcAxisLengths(vc.Camera, pos, out s); Vec3F sv = new Vec3F(s, s, s); Vec3F axscale = new Vec3F(s, s, s); Vec3F negAxscale = new Vec3F(-s, -s, -s); bool negativeAxis = m_hitRegion == HitRegion.NegXAxis || m_hitRegion == HitRegion.NegYAxis || m_hitRegion == HitRegion.NegZAxis; if (negativeAxis) { negAxscale.X *= Math.Abs(m_scale.X); negAxscale.Y *= Math.Abs(m_scale.Y); negAxscale.Z *= Math.Abs(m_scale.Z); } else { axscale.X *= Math.Abs(m_scale.X); axscale.Y *= Math.Abs(m_scale.Y); axscale.Z *= Math.Abs(m_scale.Z); } Matrix4F scale = new Matrix4F(); scale.Scale(axscale); Matrix4F xform = scale * normWorld; Util3D.RenderFlag = wire; Util3D.DrawX(xform, xcolor); Util3D.DrawY(xform, ycolor); Util3D.DrawZ(xform, zcolor); scale.Scale(negAxscale); xform = scale * normWorld; Util3D.DrawX(xform, nxcolor); Util3D.DrawY(xform, nycolor); Util3D.DrawZ(xform, nzcolor); Vec3F handle = sv * HandleRatio; float handleWidth = handle.X / 2; scale.Scale(handle); Matrix4F trans = new Matrix4F(); Util3D.RenderFlag = solid; // X handle trans.Translation = new Vec3F(axscale.X - handleWidth, 0, 0); xform = scale * trans * normWorld; Util3D.DrawCube(xform, xcolor); // y handle trans.Translation = new Vec3F(0, axscale.Y - handleWidth, 0); xform = scale * trans * normWorld; Util3D.DrawCube(xform, ycolor); // z handle trans.Translation = new Vec3F(0, 0, axscale.Z - handleWidth); xform = scale * trans * normWorld; Util3D.DrawCube(xform, zcolor); // -x handle trans.Translation = new Vec3F(negAxscale.X + handleWidth, 0, 0); xform = scale * trans * normWorld; Util3D.DrawCube(xform, nxcolor); // -y handle trans.Translation = new Vec3F(0, negAxscale.Y + handleWidth, 0); xform = scale * trans * normWorld; Util3D.DrawCube(xform, nycolor); // -z handle trans.Translation = new Vec3F(0, 0, negAxscale.Z + handleWidth); xform = scale * trans * normWorld; Util3D.DrawCube(xform, nzcolor); }
void IInitializable.Initialize() { m_controlInfo = new ControlInfo("DesignView", "DesignView", StandardControlGroup.CenterPermanent); m_controlHostService.RegisterControl(m_designView.HostControl, m_controlInfo, this); Application.ApplicationExit += delegate { Util3D.Shutdown(); GameEngine.Shutdown(); }; GameEngine.RefreshView += (sender, e) => m_designView.InvalidateViews(); m_gameDocumentRegistry.DocumentAdded += m_gameDocumentRegistry_DocumentAdded; m_gameDocumentRegistry.DocumentRemoved += m_gameDocumentRegistry_DocumentRemoved; string ns = m_schemaLoader.NameSpace; // register GridRenderer on grid child. DomNodeType gridType = m_schemaLoader.TypeCollection.GetNodeType(ns, "gridType"); gridType.Define(new ExtensionInfo <GridRenderer>()); // register NativeGameWorldAdapter on game type. m_schemaLoader.GameType.Define(new ExtensionInfo <NativeDocumentAdapter>()); // parse schema annotation. foreach (DomNodeType domType in m_schemaLoader.TypeCollection.GetNodeTypes()) { var topLevelAnnotations = domType.GetTagLocal <IEnumerable <XmlNode> >(); if (topLevelAnnotations == null) { continue; } // First, go through and interpret the annotations that are not inherited List <NativeAttributeInfo> nativeAttribs = new List <NativeAttributeInfo>(); foreach (XmlNode annot in topLevelAnnotations) { XmlElement elm = annot as XmlElement; if (elm.LocalName == NativeAnnotations.NativeType) { string typeName = elm.GetAttribute(NativeAnnotations.NativeName); domType.SetTag(NativeAnnotations.NativeType, GameEngine.GetObjectTypeId(typeName)); if (domType.IsAbstract == false) { domType.Define(new ExtensionInfo <NativeObjectAdapter>()); } } else if (elm.LocalName == NativeAnnotations.NativeDocumentType) { string typeName = elm.GetAttribute(NativeAnnotations.NativeName); domType.SetTag(NativeAnnotations.NativeDocumentType, GameEngine.GetDocumentTypeId(typeName)); if (domType.IsAbstract == false) { domType.Define(new ExtensionInfo <NativeDocumentAdapter>()); } } } if (domType.GetTag(NativeAnnotations.NativeType) == null) { continue; } uint typeId = (uint)domType.GetTag(NativeAnnotations.NativeType); bool isBoundableType = false; // Now, go through and interpret annotations that can be inheritted from base clases. // Sometimes a native property can be inheritted from a base class. In this model, we // will create a separate "property id" for each concrete class. When a property is // inheritted, the "property ids" for each type in the inheritance chain will be different // and unrelated. foreach (var inherittedType in domType.Lineage) { var annotations = inherittedType.GetTagLocal <IEnumerable <XmlNode> >(); if (annotations == null) { continue; } foreach (XmlNode annot in annotations) { XmlElement elm = annot as XmlElement; if (elm.LocalName == NativeAnnotations.NativeProperty) { // find a prop name and added to the attribute. string nativePropName = elm.GetAttribute(NativeAnnotations.NativeName); string attribName = elm.GetAttribute(NativeAnnotations.Name); uint propId = GameEngine.GetObjectPropertyId(typeId, nativePropName); if (!string.IsNullOrEmpty(attribName)) { AttributeInfo attribInfo = domType.GetAttributeInfo(elm.GetAttribute(NativeAnnotations.Name)); attribInfo.SetTag(NativeAnnotations.NativeProperty, propId); } else { NativeAttributeInfo attribInfo = new NativeAttributeInfo(domType, nativePropName, typeId, propId); nativeAttribs.Add(attribInfo); } if (nativePropName == "Bounds" || nativePropName == "LocalBounds") { isBoundableType = true; } } else if (elm.LocalName == NativeAnnotations.NativeElement) { ChildInfo info = domType.GetChildInfo(elm.GetAttribute(NativeAnnotations.Name)); string name = elm.GetAttribute(NativeAnnotations.NativeName); info.SetTag(NativeAnnotations.NativeElement, GameEngine.GetObjectChildListId(typeId, name)); } else if (elm.LocalName == NativeAnnotations.NativeVis) { using (var transfer = new NativeObjectAdapter.NativePropertyTransfer()) { using (var stream = transfer.CreateStream()) foreach (var a in elm.Attributes) { var attrib = a as XmlAttribute; if (attrib.Name == "geo") { NativeObjectAdapter.PushAttribute( 0, typeof(string), 1, attrib.Value, transfer.Properties, stream); } } GameEngine.SetTypeAnnotation(typeId, "vis", transfer.Properties); } } } } if (nativeAttribs.Count > 0) { domType.SetTag(nativeAttribs.ToArray()); } if (isBoundableType && domType.IsAbstract == false) { domType.Define(new ExtensionInfo <BoundableObject>()); } } // register BoundableObject m_schemaLoader.GameObjectFolderType.Define(new ExtensionInfo <BoundableObject>()); // doesn't have a bound native attributes -- is this really intended?s #region code to handle gameObjectFolder { // This code is fragile and need to be updated whenever // any relevant part of the schema changes. // purpose: // gameObjectFolderType does not exist in C++ // this code will map gameObjectFolderType to gameObjectGroupType. DomNodeType gobFolderType = m_schemaLoader.GameObjectFolderType; DomNodeType groupType = m_schemaLoader.GameObjectGroupType; // map native bound attrib from gameObject to GobFolder NativeAttributeInfo[] nativeAttribs = m_schemaLoader.GameObjectType.GetTag <NativeAttributeInfo[]>(); foreach (var attrib in nativeAttribs) { if (attrib.Name == "Bounds") { gobFolderType.SetTag(new NativeAttributeInfo[] { attrib }); break; } } // map type. // XLE --> Separate GameObjectFolder type from GameObjectGroup type // gobFolderType.Define(new ExtensionInfo<NativeObjectAdapter>()); // gobFolderType.SetTag(NativeAnnotations.NativeType, groupType.GetTag(NativeAnnotations.NativeType)); // map all native attributes of gameObjectGroup to gameFolder foreach (AttributeInfo srcAttrib in groupType.Attributes) { object nativeIdObject = srcAttrib.GetTag(NativeAnnotations.NativeProperty); if (nativeIdObject == null) { continue; } AttributeInfo destAttrib = gobFolderType.GetAttributeInfo(srcAttrib.Name); if (destAttrib == null) { continue; } destAttrib.SetTag(NativeAnnotations.NativeProperty, nativeIdObject); destAttrib.SetTag(NativeAnnotations.MappedAttribute, srcAttrib); } // map native element from gameObjectGroupType to gameObjectFolderType. object gobsId = groupType.GetChildInfo("gameObject").GetTag(NativeAnnotations.NativeElement); foreach (ChildInfo srcChildInfo in gobFolderType.Children) { if (srcChildInfo.IsList) { srcChildInfo.SetTag(NativeAnnotations.NativeElement, gobsId); } } m_schemaLoader.GameType.GetChildInfo("gameObjectFolder").SetTag(NativeAnnotations.NativeElement, gobsId); } #endregion // set up scripting bindings if (m_scriptingService != null) { m_scriptingService.SetVariable("cv", new GUILayer.TweakableBridge()); } }
/// <summary> /// init game engine /// call it one time during startup on the UI thread.</summary> public static void Init() { // the full dll name can be loaded in a config when needed. if (s_libHandle != IntPtr.Zero) { return; } CriticalError = s_notInitialized; try { Uri uri = new Uri(System.Windows.Forms.Application.StartupPath); string dllDir = uri.LocalPath + "\\NativePlugin"; string dllName = "LvEdRenderingEngine.dll"; if (IntPtr.Size == 4) {// 32 bit s_fullDllName = dllDir + "\\x86\\" + dllName; } else if (IntPtr.Size == 8) {// 64 bit. s_fullDllName = dllDir + "\\x64\\" + dllName; } else { throw new Exception("unsupported address space"); } if (!File.Exists(s_fullDllName)) { throw new FileNotFoundException(s_fullDllName); } s_libHandle = NativeMethods.LoadLibrary(s_fullDllName); if (s_libHandle == IntPtr.Zero) { int hr = Marshal.GetHRForLastWin32Error(); Marshal.ThrowExceptionForHR(hr); } // verify entry points /* * Type type = typeof(GameEngine); * * foreach (MethodInfo minfo in type.GetMethods(BindingFlags.Public | BindingFlags.Static | BindingFlags.NonPublic)) * { * foreach( object obj in minfo.GetCustomAttributes(false)) * { * DllImportAttribute dllimport = obj as DllImportAttribute; * if (dllimport != null) * { * string entryname = dllimport.EntryPoint; * // verify entry point name. * IntPtr fntPtr = NativeMethods.GetProcAddress(s_libHandle, entryname); * if (fntPtr == IntPtr.Zero) * throw new ArgumentException(string.Format("Can't find native function: {0}(...) in {1}", dllimport.EntryPoint, dllName)); * break; * } * } * } */ CriticalError = string.Empty; IntPtr data; s_invalidateCallback = new InvalidateViewsDlg(InvalidateViews); s_logInstance = new LogCallbackType(LogCallback); NativeInitialize(s_logInstance, s_invalidateCallback, out data); if (data != IntPtr.Zero) { string engineInfo = Marshal.PtrToStringUni(data); s_inist.PopulateEngineInfo(engineInfo); } // get SynchronizationContext for current thread. // Note: s_syncContext = SynchronizationContext.Current; //Application.AddMessageFilter(new MessageFilter()); Util3D.Init(); } catch (Exception e) { Console.WriteLine("loading dll: " + s_fullDllName); Console.WriteLine("Engine init failed: " + e.Message); CriticalError = e.Message; } }
private void RenderProperties(IEnumerable <object> objects, bool renderCaption, bool renderBound, bool renderPivot) { bool renderAny = renderCaption || renderBound || renderPivot; if (renderAny == false) { return; } Util3D.RenderFlag = BasicRendererFlags.WireFrame; Matrix4F vp = Camera.ViewMatrix * Camera.ProjectionMatrix; foreach (object obj in objects) { IBoundable bnode = obj.As <IBoundable>(); if (bnode == null || bnode.BoundingBox.IsEmpty || obj.Is <IGameObjectFolder>()) { continue; } INameable nnode = obj.As <INameable>(); ITransformable trans = obj.As <ITransformable>(); if (renderBound) { Util3D.DrawAABB(bnode.BoundingBox); } if (renderCaption && nnode != null) { Vec3F topCenter = bnode.BoundingBox.Center; topCenter.Y = bnode.BoundingBox.Max.Y; Point pt = Project(vp, topCenter); GameEngine.DrawText2D(nnode.Name, Util3D.CaptionFont, pt.X, pt.Y, Color.White); } } if (renderPivot) { Util3D.RenderFlag = BasicRendererFlags.WireFrame | BasicRendererFlags.DisableDepthTest; // create few temp matrics to Matrix4F toWorld = new Matrix4F(); Matrix4F PV = new Matrix4F(); Matrix4F sc = new Matrix4F(); Matrix4F bl = new Matrix4F(); Matrix4F recXform = new Matrix4F(); foreach (object obj in objects) { ITransformable trans = obj.As <ITransformable>(); IBoundable bnode = obj.As <IBoundable>(); if (trans == null || bnode == null || bnode.BoundingBox.IsEmpty || obj.Is <IGameObjectFolder>()) { continue; } Path <DomNode> path = new Path <DomNode>(trans.Cast <DomNode>().GetPath()); toWorld.Set(Vec3F.ZeroVector); TransformUtils.CalcPathTransform(toWorld, path, path.Count - 1); // Offset by pivot PV.Set(trans.Pivot); toWorld.Mul(PV, toWorld); Vec3F pos = toWorld.Translation; float s; Util.CalcAxisLengths(Camera, pos, out s); s /= 12.0f; sc.Scale(s); Util.CreateBillboard(bl, pos, Camera.WorldEye, Camera.Up, Camera.LookAt); Matrix4F.Multiply(sc, bl, recXform); Util3D.DrawPivot(recXform, Color.Yellow); } } }
public void Render(ViewControl vc, Matrix4F normWorld) { float s = Util.CalcAxisScale(vc.Camera, normWorld.Translation, Manipulator.AxisLength, vc.Height); Color xcolor = (m_hitRegion == HitRegion.XAxis || m_hitRegion == HitRegion.XYSquare || m_hitRegion == HitRegion.XZSquare) ? Color.Gold : Manipulator.XAxisColor; Color ycolor = (m_hitRegion == HitRegion.YAxis || m_hitRegion == HitRegion.XYSquare || m_hitRegion == HitRegion.YZSquare) ? Color.Gold : Manipulator.YAxisColor; Color Zcolor = (m_hitRegion == HitRegion.ZAxis || m_hitRegion == HitRegion.XZSquare || m_hitRegion == HitRegion.YZSquare) ? Color.Gold : Manipulator.ZAxisColor; Color XYx = m_hitRegion == HitRegion.XYSquare ? Color.Gold : Manipulator.XAxisColor; Color XYy = m_hitRegion == HitRegion.XYSquare ? Color.Gold : Manipulator.YAxisColor; Color XZx = m_hitRegion == HitRegion.XZSquare ? Color.Gold : Manipulator.XAxisColor; Color XZz = m_hitRegion == HitRegion.XZSquare ? Color.Gold : Manipulator.ZAxisColor; Color YZy = m_hitRegion == HitRegion.YZSquare ? Color.Gold : Manipulator.YAxisColor; Color YZz = m_hitRegion == HitRegion.YZSquare ? Color.Gold : Manipulator.ZAxisColor; var axisScale = new Matrix4F(); axisScale.Scale(new Vec3F(s * Manipulator.AxisThickness, s * (1 - ConeHeight), s * Manipulator.AxisThickness)); var axisrot = new Matrix4F(); // Draw X axis axisrot.RotZ(-MathHelper.PiOver2); Matrix4F scaleRot = axisScale * axisrot; Matrix4F axisXform = scaleRot * normWorld; Util3D.DrawCylinder(axisXform, xcolor); // draw y axisXform = axisScale * normWorld; Util3D.DrawCylinder(axisXform, ycolor); // draw z axisrot.RotX(MathHelper.PiOver2); scaleRot = axisScale * axisrot; axisXform = scaleRot * normWorld; Util3D.DrawCylinder(axisXform, Zcolor); // draw center cube. Matrix4F cubeScale = new Matrix4F(); cubeScale.Scale(CenterCube * s); var cubexform = cubeScale * normWorld; Util3D.DrawCube(cubexform, Color.White); Matrix4F arrowHead = ComputeXhead(normWorld, s); Util3D.DrawCone(arrowHead, xcolor); arrowHead = ComputeYhead(normWorld, s); Util3D.DrawCone(arrowHead, ycolor); arrowHead = ComputeZhead(normWorld, s); Util3D.DrawCone(arrowHead, Zcolor); // draw xy rect. Matrix4F scale = new Matrix4F(); scale.Scale(s * Manipulator.AxisThickness, s * SquareLength, s * Manipulator.AxisThickness); Matrix4F trans = new Matrix4F(); trans.Translation = new Vec3F(0, s * SquareLength, 0); Matrix4F rot = new Matrix4F(); rot.RotZ(-MathHelper.PiOver2); Matrix4F squareXform = scale * rot * trans * normWorld; Util3D.DrawCylinder(squareXform, XYy); trans.Translation = new Vec3F(s * SquareLength, 0, 0); squareXform = scale * trans * normWorld; Util3D.DrawCylinder(squareXform, XYx); // draw xz rect. trans.Translation = new Vec3F(0, 0, s * SquareLength); rot.RotZ(-MathHelper.PiOver2); squareXform = scale * rot * trans * normWorld; Util3D.DrawCylinder(squareXform, XZz); trans.Translation = new Vec3F(s * SquareLength, 0, 0); rot.RotX(MathHelper.PiOver2); squareXform = scale * rot * trans * normWorld; Util3D.DrawCylinder(squareXform, XZx); // draw yz trans.Translation = new Vec3F(0, s * SquareLength, 0); rot.RotX(MathHelper.PiOver2); squareXform = scale * rot * trans * normWorld; Util3D.DrawCylinder(squareXform, YZy); trans.Translation = new Vec3F(0, 0, s * SquareLength); squareXform = scale * trans * normWorld; Util3D.DrawCylinder(squareXform, YZz); }
void IInitializable.Initialize() { m_controlInfo = new ControlInfo("DesignView", "DesignView", StandardControlGroup.CenterPermanent); m_controlHostService.RegisterControl(m_designView.HostControl, m_controlInfo, this); Application.ApplicationExit += delegate { Util3D.Shutdown(); GameEngine.Shutdown(); }; GameEngine.RefreshView += (sender, e) => m_designView.InvalidateViews(); m_gameDocumentRegistry.DocumentAdded += m_gameDocumentRegistry_DocumentAdded; m_gameDocumentRegistry.DocumentRemoved += m_gameDocumentRegistry_DocumentRemoved; string ns = m_schemaLoader.NameSpace; // register GridRenderer on grid child. DomNodeType gridType = m_schemaLoader.TypeCollection.GetNodeType(ns, "gridType"); gridType.Define(new ExtensionInfo <GridRenderer>()); // register NativeGameWorldAdapter on game type. m_schemaLoader.GameType.Define(new ExtensionInfo <NativeGameWorldAdapter>()); // parse schema annotation. foreach (DomNodeType domType in m_schemaLoader.TypeCollection.GetNodeTypes()) { IEnumerable <XmlNode> annotations = domType.GetTagLocal <IEnumerable <XmlNode> >(); if (annotations == null) { continue; } // collect all the properties that only exist in native side. List <NativeAttributeInfo> nativeAttribs = new List <NativeAttributeInfo>(); foreach (XmlNode annot in annotations) { XmlElement elm = annot as XmlElement; if (elm.LocalName == NativeAnnotations.NativeType) { string typeName = elm.GetAttribute(NativeAnnotations.NativeName); domType.SetTag(NativeAnnotations.NativeType, GameEngine.GetObjectTypeId(typeName)); if (domType.IsAbstract == false) { domType.Define(new ExtensionInfo <NativeObjectAdapter>()); } } else if (elm.LocalName == NativeAnnotations.NativeProperty) { // find a prop name and added to the attribute. string nativePropName = elm.GetAttribute(NativeAnnotations.NativeName); string attribName = elm.GetAttribute(NativeAnnotations.Name); uint typeId = (uint)domType.GetTag(NativeAnnotations.NativeType); uint propId = GameEngine.GetObjectPropertyId(typeId, nativePropName); if (!string.IsNullOrEmpty(attribName)) { AttributeInfo attribInfo = domType.GetAttributeInfo(elm.GetAttribute(NativeAnnotations.Name)); attribInfo.SetTag(NativeAnnotations.NativeProperty, propId); } else { NativeAttributeInfo attribInfo = new NativeAttributeInfo(domType, nativePropName, typeId, propId); nativeAttribs.Add(attribInfo); } } else if (elm.LocalName == NativeAnnotations.NativeElement) { ChildInfo info = domType.GetChildInfo(elm.GetAttribute(NativeAnnotations.Name)); uint typeId = (uint)domType.GetTag(NativeAnnotations.NativeType); string name = elm.GetAttribute(NativeAnnotations.NativeName); info.SetTag(NativeAnnotations.NativeElement, GameEngine.GetObjectChildListId(typeId, name)); } } if (nativeAttribs.Count > 0) { domType.SetTag(nativeAttribs.ToArray()); } } // register BoundableObject m_schemaLoader.GameObjectType.Define(new ExtensionInfo <BoundableObject>()); m_schemaLoader.GameObjectFolderType.Define(new ExtensionInfo <BoundableObject>()); #region code to handle gameObjectFolder { // This code is fragile and need to be updated whenever // any relevant part of the schema changes. // purpose: // gameObjectFolderType does not exist in C++ // this code will map gameObjectFolderType to gameObjectGroupType. DomNodeType gobFolderType = m_schemaLoader.GameObjectFolderType; DomNodeType groupType = m_schemaLoader.GameObjectGroupType; // map native bound attrib from gameObject to GobFolder NativeAttributeInfo[] nativeAttribs = m_schemaLoader.GameObjectType.GetTag <NativeAttributeInfo[]>(); foreach (var attrib in nativeAttribs) { if (attrib.Name == "Bounds") { gobFolderType.SetTag(new NativeAttributeInfo[] { attrib }); break; } } // map type. gobFolderType.Define(new ExtensionInfo <NativeObjectAdapter>()); gobFolderType.SetTag(NativeAnnotations.NativeType, groupType.GetTag(NativeAnnotations.NativeType)); // map all native attributes of gameObjectGroup to gameFolder foreach (AttributeInfo srcAttrib in groupType.Attributes) { object nativeIdObject = srcAttrib.GetTag(NativeAnnotations.NativeProperty); if (nativeIdObject == null) { continue; } AttributeInfo destAttrib = gobFolderType.GetAttributeInfo(srcAttrib.Name); if (destAttrib == null) { continue; } destAttrib.SetTag(NativeAnnotations.NativeProperty, nativeIdObject); destAttrib.SetTag(NativeAnnotations.MappedAttribute, srcAttrib); } // map native element from gameObjectGroupType to gameObjectFolderType. object gobsId = groupType.GetChildInfo("gameObject").GetTag(NativeAnnotations.NativeElement); foreach (ChildInfo srcChildInfo in gobFolderType.Children) { if (srcChildInfo.IsList) { srcChildInfo.SetTag(NativeAnnotations.NativeElement, gobsId); } } m_schemaLoader.GameType.GetChildInfo("gameObjectFolder").SetTag(NativeAnnotations.NativeElement, gobsId); } #endregion }
public void Render(Matrix4F normWorld, float s) { BasicRendererFlags solid = BasicRendererFlags.Solid | BasicRendererFlags.DisableDepthTest; BasicRendererFlags wire = BasicRendererFlags.WireFrame | BasicRendererFlags.DisableDepthTest; Color xcolor = (m_hitRegion == HitRegion.XAxis || m_hitRegion == HitRegion.XYSquare || m_hitRegion == HitRegion.XZSquare) ? Color.Gold : Color.Red; Color ycolor = (m_hitRegion == HitRegion.YAxis || m_hitRegion == HitRegion.XYSquare || m_hitRegion == HitRegion.YZSquare) ? Color.Gold : Color.Green; Color Zcolor = (m_hitRegion == HitRegion.ZAxis || m_hitRegion == HitRegion.XZSquare || m_hitRegion == HitRegion.YZSquare) ? Color.Gold : Color.Blue; Color XYx = m_hitRegion == HitRegion.XYSquare ? Color.Gold : Color.Red; Color XYy = m_hitRegion == HitRegion.XYSquare ? Color.Gold : Color.Green; Color XZx = m_hitRegion == HitRegion.XZSquare ? Color.Gold : Color.Red; Color XZz = m_hitRegion == HitRegion.XZSquare ? Color.Gold : Color.Blue; Color YZy = m_hitRegion == HitRegion.YZSquare ? Color.Gold : Color.Green; Color YZz = m_hitRegion == HitRegion.YZSquare ? Color.Gold : Color.Blue; Vec3F axScale = new Vec3F(s, s, s); Matrix4F axisXform = ComputeAxis(normWorld, axScale); Util3D.RenderFlag = wire; Util3D.DrawX(axisXform, xcolor); Util3D.DrawY(axisXform, ycolor); Util3D.DrawZ(axisXform, Zcolor); Matrix4F arrowHead = ComputeXhead(normWorld, s); Util3D.RenderFlag = solid; Util3D.DrawCone(arrowHead, xcolor); arrowHead = ComputeYhead(normWorld, s); Util3D.DrawCone(arrowHead, ycolor); arrowHead = ComputeZhead(normWorld, s); Util3D.DrawCone(arrowHead, Zcolor); Util3D.RenderFlag = wire; // draw xy rect. Matrix4F scale = new Matrix4F(); scale.Scale(axScale * SquareLength); Matrix4F trans = new Matrix4F(); trans.Translation = new Vec3F(0, s * SquareLength, 0); Matrix4F squareXform = scale * trans * normWorld; Util3D.DrawX(squareXform, XYy); trans.Translation = new Vec3F(s * SquareLength, 0, 0); squareXform = scale * trans * normWorld; Util3D.DrawY(squareXform, XYx); // draw xz rect. trans.Translation = new Vec3F(0, 0, s * SquareLength); squareXform = scale * trans * normWorld; Util3D.DrawX(squareXform, XZz); trans.Translation = new Vec3F(s * SquareLength, 0, 0); squareXform = scale * trans * normWorld; Util3D.DrawZ(squareXform, XZx); // draw yz trans.Translation = new Vec3F(0, s * SquareLength, 0); squareXform = scale * trans * normWorld; Util3D.DrawZ(squareXform, YZy); trans.Translation = new Vec3F(0, 0, s * SquareLength); squareXform = scale * trans * normWorld; Util3D.DrawY(squareXform, YZz); }
private void RenderProperties(GUILayer.SimpleRenderingContext context, IEnumerable <object> objects, bool renderCaption, bool renderBound, bool renderPivot) { if (renderCaption || renderBound) { Util3D.SetRenderFlag(context, BasicRendererFlags.WireFrame); Matrix4F vp = Camera.ViewMatrix * Camera.ProjectionMatrix; foreach (object obj in objects) { IBoundable bnode = obj.As <IBoundable>(); if (bnode == null || bnode.BoundingBox.IsEmpty || obj.Is <IGameObjectFolder>()) { continue; } INameable nnode = obj.As <INameable>(); ITransformable trans = obj.As <ITransformable>(); if (renderBound) { Util3D.DrawAABB(context, bnode.BoundingBox); } if (renderCaption && nnode != null) { Vec3F topCenter = bnode.BoundingBox.Center; topCenter.Y = bnode.BoundingBox.Max.Y; Point pt = Project(vp, topCenter); GameEngine.DrawText2D(nnode.Name, Util3D.CaptionFont, pt.X, pt.Y, Color.White); } } } if (renderPivot) { Util3D.SetRenderFlag(context, BasicRendererFlags.WireFrame | BasicRendererFlags.DisableDepthTest); // create few temp matrics to Matrix4F toWorld = new Matrix4F(); Matrix4F PV = new Matrix4F(); Matrix4F sc = new Matrix4F(); Matrix4F bl = new Matrix4F(); Matrix4F recXform = new Matrix4F(); foreach (object obj in objects) { ITransformable trans = obj.As <ITransformable>(); IBoundable bnode = obj.As <IBoundable>(); if (trans == null || bnode == null || bnode.BoundingBox.IsEmpty || obj.Is <IGameObjectFolder>()) { continue; } Path <DomNode> path = new Path <DomNode>(trans.Cast <DomNode>().GetPath()); toWorld.Set(Vec3F.ZeroVector); TransformUtils.CalcPathTransform(toWorld, path, path.Count - 1); // Offset by pivot PV.Set(trans.Pivot); toWorld.Mul(PV, toWorld); Vec3F pos = toWorld.Translation; const float pivotDiameter = 16; // in pixels float s = Util.CalcAxisScale(Camera, pos, pivotDiameter, Height); sc.Scale(s); Util.CreateBillboard(bl, pos, Camera.WorldEye, Camera.Up, Camera.LookAt); recXform = sc * bl; Util3D.DrawPivot(context, recXform, Color.Yellow); } } }
public override void Render(ViewControl vc) { BasicRendererFlags solid = BasicRendererFlags.Solid | BasicRendererFlags.DisableDepthTest; BasicRendererFlags wire = BasicRendererFlags.WireFrame | BasicRendererFlags.DisableDepthTest; Matrix4F normWorld = GetManipulatorMatrix(); if (normWorld == null) { return; } Camera camera = vc.Camera; Vec3F pos = normWorld.Translation; float s; Util.CalcAxisLengths(vc.Camera, pos, out s); Vec3F sv = new Vec3F(s, s, s); Vec3F axscale = new Vec3F(Math.Abs(s * m_scale.X), Math.Abs(s * m_scale.Y), Math.Abs(s * m_scale.Z)); Color xcolor = (m_hitRegion == HitRegion.XAxis || m_hitRegion == HitRegion.FreeRect) ? Color.Gold : Color.Red; Color ycolor = (m_hitRegion == HitRegion.YAxis || m_hitRegion == HitRegion.FreeRect) ? Color.Gold : Color.Green; Color Zcolor = (m_hitRegion == HitRegion.ZAxis || m_hitRegion == HitRegion.FreeRect) ? Color.Gold : Color.Blue; Color freeRect = (m_hitRegion == HitRegion.FreeRect) ? Color.Gold : Color.White; Matrix4F scale = new Matrix4F(); scale.Scale(axscale); Matrix4F xform = scale * normWorld; Util3D.RenderFlag = wire; Util3D.DrawX(xform, xcolor); Util3D.DrawY(xform, ycolor); Util3D.DrawZ(xform, Zcolor); Vec3F rectScale = sv * FreeRectRatio; scale.Scale(rectScale); Matrix4F b = Util.CreateBillboard(pos, camera.WorldEye, camera.Up, camera.LookAt); Matrix4F recXform = Matrix4F.Multiply(scale, b); Util3D.DrawRect(recXform, freeRect); Vec3F handle = sv * HandleRatio; float handleWidth = handle.X / 2; scale.Scale(handle); Matrix4F trans = new Matrix4F(); trans.Translation = new Vec3F(axscale.X - handleWidth, 0, 0); xform = scale * trans * normWorld; Util3D.RenderFlag = solid; Util3D.DrawCube(xform, xcolor); trans.Translation = new Vec3F(0, axscale.Y - handleWidth, 0); xform = scale * trans * normWorld; Util3D.DrawCube(xform, ycolor); trans.Translation = new Vec3F(0, 0, axscale.Z - handleWidth); xform = scale * trans * normWorld; Util3D.DrawCube(xform, Zcolor); }