public async System.Threading.Tasks.Task <bool> Init(Graphics.CGfxMaterialInstance material, float halfWidth = 0.1F) { var rc = CEngine.Instance.RenderContext; Material = material; GeomMesh = new Graphics.Mesh.CGfxMeshPrimitives(); GeomMesh.Init(rc, null, 1); CDrawPrimitiveDesc dpDesc = new CDrawPrimitiveDesc(); dpDesc.SetDefault(); dpDesc.StartIndex = 0xFFFFFFFF; GeomMesh.PushAtomLOD(0, ref dpDesc); var Mesh = new Graphics.Mesh.CGfxMesh(); Mesh.Init(rc, null, GeomMesh); var img = new Graphics.Mesh.CGfxImage2D(); Mesh.Tag = img; UpdateGeomMesh(rc, halfWidth); GraphActor = GamePlay.Actor.GActor.NewMeshActorDirect(Mesh); var meshComp = GraphActor.GetComponent <GamePlay.Component.GMeshComponent>(); await meshComp.SetMaterialInstanceAsync(rc, 0, material, null); //await meshComp.SetMaterial(rc, 0, material, CEngine.Instance.PrebuildPassData.Image2DShadingEnvs, false, true); return(true); }
public Graphics.Mesh.CGfxMeshPrimitives CreateRenderMeshPrimitives(CRenderContext rc) { var ptr = SDK_RcNavMesh_CreateRenderMesh(CoreObject, rc.CoreObject); if (ptr.GetPointer() == IntPtr.Zero) { return(null); } var result = new Graphics.Mesh.CGfxMeshPrimitives(ptr); return(result); }
public bool BuildTriMesh(CRenderContext rc, Graphics.Mesh.CGfxMeshPrimitives mesh, ref CConvexDecompDesc desc, bool doConvex = true) { unsafe { mesh.PreUse(true); if (doConvex) { fixed(CConvexDecompDesc *p = &desc) { return(SDK_SimGeom_BuildTriMesh(CoreObject, rc.CoreObject, mesh.CoreObject, p)); } } else { return(SDK_SimGeom_BuildTriMesh(CoreObject, rc.CoreObject, mesh.CoreObject, (CConvexDecompDesc *)IntPtr.Zero)); } } }
public async System.Threading.Tasks.Task <EngineNS.GamePlay.Actor.GActor> CreateRenderActor(CRenderContext rc, Graphics.Mesh.CGfxMeshPrimitives pri) { EngineNS.GamePlay.Actor.GActor actor = EngineNS.GamePlay.Actor.GActor.NewMeshActorDirect(EngineNS.CEngine.Instance.MeshManager.CreateMesh(rc, pri)); await actor.GetComponent <EngineNS.GamePlay.Component.GMeshComponent>().SetMaterialInstance(EngineNS.CEngine.Instance.RenderContext, 0, RName.GetRName("editor/icon/icon_3D/material/pathfinding.instmtl"), null); actor.Placement.Location = new EngineNS.Vector3(0.0f, 0.0f, 0.0f); actor.Placement.Rotation = EngineNS.Quaternion.RotationAxis(EngineNS.Vector3.UnitY, 0.0f); actor.Placement.Scale = new EngineNS.Vector3(1.0f, 1.0f, 1.0f); actor.SpecialName = "NavMeshDebugger"; return(actor); }
public void OnEditorCommitVisual(CCommandList cmd, Graphics.CGfxCamera camera, GamePlay.Actor.GActor hostactor, GamePlay.SceneGraph.CheckVisibleParam param) { if (hostactor == null || !hostactor.Visible) { return; } var rc = CEngine.Instance.RenderContext; switch (ShapeType) { case EPhysShapeType.PST_Convex: { if (mDebugActor == null) { Graphics.Mesh.CGfxMeshPrimitives mp = IfGetConvexMesh(rc); mDebugActor = EngineNS.GamePlay.Actor.GActor.NewMeshActorDirect(CEngine.Instance.MeshManager.CreateMesh(rc, mp)); EngineNS.Thread.Async.TaskLoader.Release(ref WaitContext, null); var test = SetMaterial(); } mDebugActor.Placement.SetMatrix(ref hostactor.Placement.mDrawTransform); } break; case EPhysShapeType.PST_TriangleMesh: { if (mDebugActor == null) { Graphics.Mesh.CGfxMeshPrimitives mp = IfGetTriMesh(rc); CEngine.Instance.MeshManager.CreateMesh(rc, mp); EngineNS.Thread.Async.TaskLoader.Release(ref WaitContext, null); mDebugActor = EngineNS.GamePlay.Actor.GActor.NewMeshActorDirect(CEngine.Instance.MeshManager.CreateMesh(rc, mp)); var test = SetMaterial(); } mDebugActor.Placement.SetMatrix(ref hostactor.Placement.mDrawTransform); } break; case EPhysShapeType.PST_Box: { if (mDebugActor == null && mReady == false) { mReady = true; var test = CreateDefaultBox(); test = SetMaterial(); } if (mDebugActor != null) { float w = 1.0f; float h = 1.0f; float l = 1.0f; SDK_PhyShape_IfGetBox(ref w, ref h, ref l); mDebugActor.Placement.SetMatrix(ref hostactor.Placement.mDrawTransform); Vector3 scale = Vector3.UnitXYZ; //mDebugActor.Placement.Scale; scale.SetValue(scale.X * w, scale.Y * h, scale.Z * l); mDebugActor.Placement.Scale = scale; } } break; case EPhysShapeType.PST_Sphere: { if (mDebugActor == null && mReady == false) { mReady = true; var test = CreateDefaultSphere(); test = SetMaterial(); } if (mDebugActor != null) { float r = 1.0f; IfGetSphere(ref r); mDebugActor.Placement.SetMatrix(ref hostactor.Placement.mDrawTransform); Vector3 scale = Vector3.UnitXYZ; //mDebugActor.Placement.Scale; scale.SetValue(scale.X * r, scale.Y * r, scale.Z * r); mDebugActor.Placement.Scale = scale; } } break; default: break; } if (mDebugActor != null) { foreach (var comp in mDebugActor.Components) { var meshComp = comp as EngineNS.GamePlay.Component.GVisualComponent; if (meshComp != null) { meshComp.CommitVisual(cmd, camera, param); } } } }
public void AddMeshSource(Graphics.Mesh.CGfxMeshPrimitives meshSource) { //meshSource.GeometryMesh }
public bool InitMesh(CRenderContext rc, Graphics.Mesh.CGfxMeshPrimitives mesh) { mMesh = mesh; mesh.PreUse(); EnablePosition = false; EnableNormal = false; EnableTangent = false; EnableColor = false; EnableUV = false; EnableLightMapUV = false; EnableSkinIndex = false; EnableSkinWeight = false; EnableTerrainIndex = false; EnableTerrainGradient = false; AABB = mesh.AABB; int vertNum = 0; Vertices.Clear(); #region Position var vb = mesh.GeometryMesh.GetVertexBuffer(EVertexSteamType.VST_Position); if (vb != null) { EnablePosition = true; var blob = new Support.CBlobObject(); vb.GetBufferData(rc, blob); unsafe { vertNum = (int)blob.Size / sizeof(Vector3); var ptr = (Vector3 *)blob.Data.ToPointer(); for (int i = 0; i < vertNum; i++) { var vert = new Vertex(); vert.Position = ptr[i]; Vertices.Add(vert); } } } else { return(false); } #endregion #region Normal vb = mesh.GeometryMesh.GetVertexBuffer(EVertexSteamType.VST_Normal); if (vb != null) { EnableNormal = true; var blob = new Support.CBlobObject(); vb.GetBufferData(rc, blob); unsafe { var ptr = (Vector3 *)blob.Data.ToPointer(); for (int i = 0; i < vertNum; i++) { Vertices[i].Normal = ptr[i]; } } } #endregion #region Tangent vb = mesh.GeometryMesh.GetVertexBuffer(EVertexSteamType.VST_Tangent); if (vb != null) { EnableTangent = true; var blob = new Support.CBlobObject(); vb.GetBufferData(rc, blob); unsafe { var ptr = (Vector4 *)blob.Data.ToPointer(); for (int i = 0; i < vertNum; i++) { Vertices[i].Tangent = ptr[i]; } } } #endregion #region Color vb = mesh.GeometryMesh.GetVertexBuffer(EVertexSteamType.VST_Color); if (vb != null) { EnableColor = true; var blob = new Support.CBlobObject(); vb.GetBufferData(rc, blob); unsafe { var ptr = (Byte4 *)blob.Data.ToPointer(); for (int i = 0; i < vertNum; i++) { Vertices[i].Color = ptr[i]; } } } #endregion #region UV vb = mesh.GeometryMesh.GetVertexBuffer(EVertexSteamType.VST_UV); if (vb != null) { EnableUV = true; var blob = new Support.CBlobObject(); vb.GetBufferData(rc, blob); unsafe { var ptr = (Vector2 *)blob.Data.ToPointer(); for (int i = 0; i < vertNum; i++) { Vertices[i].UV = ptr[i]; } } } #endregion #region LightMapUV vb = mesh.GeometryMesh.GetVertexBuffer(EVertexSteamType.VST_LightMap); if (vb != null) { EnableLightMapUV = true; var blob = new Support.CBlobObject(); vb.GetBufferData(rc, blob); unsafe { var ptr = (Vector2 *)blob.Data.ToPointer(); for (int i = 0; i < vertNum; i++) { Vertices[i].LightMapUV = ptr[i]; } } } #endregion #region SkinIndex vb = mesh.GeometryMesh.GetVertexBuffer(EVertexSteamType.VST_SkinIndex); if (vb != null) { EnableSkinIndex = true; var blob = new Support.CBlobObject(); vb.GetBufferData(rc, blob); unsafe { var ptr = (Byte4 *)blob.Data.ToPointer(); for (int i = 0; i < vertNum; i++) { Vertices[i].SkinIndex = ptr[i]; } } } #endregion #region SkinWeight vb = mesh.GeometryMesh.GetVertexBuffer(EVertexSteamType.VST_SkinWeight); if (vb != null) { EnableSkinWeight = true; var blob = new Support.CBlobObject(); vb.GetBufferData(rc, blob); unsafe { var ptr = (Vector4 *)blob.Data.ToPointer(); for (int i = 0; i < vertNum; i++) { Vertices[i].SkinWeight = ptr[i]; } } } #endregion #region TerrainIndex vb = mesh.GeometryMesh.GetVertexBuffer(EVertexSteamType.VST_TerrainIndex); if (vb != null) { EnableTerrainIndex = true; var blob = new Support.CBlobObject(); vb.GetBufferData(rc, blob); unsafe { var ptr = (Byte4 *)blob.Data.ToPointer(); for (int i = 0; i < vertNum; i++) { Vertices[i].TerrainIndex = ptr[i]; } } } #endregion #region TerrainGradient vb = mesh.GeometryMesh.GetVertexBuffer(EVertexSteamType.VST_TerrainGradient); if (vb != null) { EnableTerrainGradient = true; var blob = new Support.CBlobObject(); vb.GetBufferData(rc, blob); unsafe { var ptr = (Byte4 *)blob.Data.ToPointer(); for (int i = 0; i < vertNum; i++) { Vertices[i].TerrainGradient = ptr[i]; } } } #endregion List <int> OriIndices = new List <int>(); #region Face var ib = mesh.GeometryMesh.GetIndexBuffer(); if (ib != null) { var blob = new Support.CBlobObject(); ib.GetBufferData(rc, blob); unsafe { if (ib.Desc.Type == EIndexBufferType.IBT_Int16) { int indexNum = (int)blob.Size / (sizeof(UInt16)); var ptr = (UInt16 *)blob.Data.ToPointer(); for (int i = 0; i < indexNum; i++) { OriIndices.Add(ptr[i]); } } else { int indexNum = (int)blob.Size / (sizeof(int)); var ptr = (int *)blob.Data.ToPointer(); for (int i = 0; i < indexNum; i++) { OriIndices.Add(ptr[i]); } } } } #endregion #region Mtl Faces.Clear(); Atoms = new List <MeshAtom>(); for (UInt32 i = 0; i < mesh.AtomNumber; i++) { var atom = new MeshAtom(); atom.Mtl = (int)i; mesh.GetAtom(i, 0, ref atom.OriginDesc); Atoms.Add(atom); int index = (int)atom.OriginDesc.StartIndex / 3; for (int j = 0; j < atom.OriginDesc.NumPrimitives; j++) { var f = new Face(); f.A = OriIndices[(int)atom.OriginDesc.StartIndex + j * 3 + 0]; f.B = OriIndices[(int)atom.OriginDesc.StartIndex + j * 3 + 1]; f.C = OriIndices[(int)atom.OriginDesc.StartIndex + j * 3 + 2]; f.Mtl = (int)i; atom.Faces.Add(Faces.Count); Faces.Add(f); } } #endregion BuildFixedVertices(0.000001f); BuildFaces(); BuildEdges(); BuildLinkers(); for (int i = 0; i < Atoms.Count; i++) { Atoms[i].FaceLods.Clear(); Atoms[i].FaceLods.Add(Atoms[i].Faces); } return(true); }