Пример #1
0
        public ModelViewer(ITagContainer diContainer)
        {
            this.diContainer     = diContainer;
            device               = diContainer.GetTag <GraphicsDevice>();
            resourcePool         = diContainer.GetTag <IResourcePool>();
            textureLoader        = diContainer.GetTag <IAssetLoader <Texture> >();
            Window               = diContainer.GetTag <WindowContainer>().NewWindow("Model Viewer");
            Window.InitialBounds = new Rect(float.NaN, float.NaN, 1100.0f, 600.0f);
            Window.AddTag(this);
            editor = new TwoColumnEditorTag(Window, diContainer);
            var onceAction = new OnceAction();

            Window.AddTag(onceAction);
            Window.OnContent += onceAction.Invoke;
            var menuBar = new MenuBarWindowTag(Window);

            menuBar.AddButton("Open", HandleMenuOpen);
            fbArea            = Window.GetTag <FramebufferArea>();
            fbArea.OnResize  += HandleResize;
            fbArea.OnRender  += HandleRender;
            modelMaterialEdit = new ModelMaterialEdit(Window, diContainer);
            diContainer.GetTag <OpenDocumentSet>().AddEditor(this);

            openFileModal                    = new OpenFileModal(diContainer);
            openFileModal.Filter             = "*.dff";
            openFileModal.IsFilterChangeable = false;
            openFileModal.OnOpenedResource  += Load;
            imGuiRenderer                    = Window.Container.ImGuiRenderer;

            locationBuffer = new LocationBuffer(device);
            AddDisposable(locationBuffer);

            var localDiContainer = diContainer.ExtendedWith(locationBuffer);

            camera = new Camera(localDiContainer);
            AddDisposable(camera);

            controls = new OrbitControlsTag(Window, camera.Location, localDiContainer);
            AddDisposable(controls);

            gridRenderer = new DebugGridRenderer(diContainer);
            gridRenderer.Material.LinkTransformsTo(camera);
            gridRenderer.Material.World.Ref = Matrix4x4.Identity;
            AddDisposable(gridRenderer);

            triangleRenderer = new DebugTriangleLineRenderer(diContainer);
            triangleRenderer.Material.LinkTransformsTo(camera);
            triangleRenderer.Material.World.Ref = Matrix4x4.Identity;
            AddDisposable(triangleRenderer);

            planeRenderer = new DebugPlaneRenderer(diContainer);
            planeRenderer.Material.LinkTransformsTo(camera);
            planeRenderer.Material.World.Ref = Matrix4x4.Identity;
            AddDisposable(planeRenderer);

            editor.AddInfoSection("Statistics", HandleStatisticsContent);
            editor.AddInfoSection("Materials", HandleMaterialsContent);
            editor.AddInfoSection("Skeleton", HandleSkeletonContent);
            editor.AddInfoSection("Collision", HandleCollisionContent);
        }
Пример #2
0
        public ActorEditor(ITagContainer diContainer)
        {
            this.diContainer     = diContainer;
            device               = diContainer.GetTag <GraphicsDevice>();
            resourcePool         = diContainer.GetTag <IResourcePool>();
            Window               = diContainer.GetTag <WindowContainer>().NewWindow("Actor Editor");
            Window.InitialBounds = new Rect(float.NaN, float.NaN, 1100.0f, 600.0f);
            Window.AddTag(this);
            editor = new TwoColumnEditorTag(Window, diContainer);
            var onceAction = new OnceAction();

            Window.AddTag(onceAction);
            Window.OnContent += onceAction.Invoke;
            var menuBar = new MenuBarWindowTag(Window);

            menuBar.AddButton("Open", HandleMenuOpen);
            fbArea           = Window.GetTag <FramebufferArea>();
            fbArea.OnResize += HandleResize;
            fbArea.OnRender += HandleRender;
            diContainer.GetTag <OpenDocumentSet>().AddEditor(this);

            openFileModal                    = new OpenFileModal(diContainer);
            openFileModal.Filter             = "*.aed";
            openFileModal.IsFilterChangeable = false;
            openFileModal.OnOpenedResource  += Load;

            locationBuffer = new LocationBuffer(device);
            AddDisposable(locationBuffer);
            localDiContainer = diContainer.ExtendedWith(locationBuffer);
            camera           = new Camera(localDiContainer);
            AddDisposable(camera);
            controls = new OrbitControlsTag(Window, camera.Location, localDiContainer);
            AddDisposable(controls);
            localDiContainer.AddTag(camera);

            gridRenderer = new DebugGridRenderer(diContainer);
            gridRenderer.Material.LinkTransformsTo(camera);
            gridRenderer.Material.World.Ref = Matrix4x4.Identity;
            AddDisposable(gridRenderer);
            localDiContainer.AddTag <IStandardTransformMaterial>(gridRenderer.Material);

            editor.AddInfoSection("Info", HandleInfoContent);
            editor.AddInfoSection("Animation Playback", HandlePlaybackContent);
            editor.AddInfoSection("Body animations", () => HandlePartContent(false, () => body?.AnimationsContent() ?? false), false);
            editor.AddInfoSection("Wings animations", () => HandlePartContent(true, () => wings?.AnimationsContent() ?? false), false);
            editor.AddInfoSection("Body skeleton", () => HandlePartContent(false, () => body?.skeletonRenderer.Content() ?? false), false);
            editor.AddInfoSection("Wings skeleton", () => HandlePartContent(true, () => wings?.skeletonRenderer.Content() ?? false), false);
            editor.AddInfoSection("Head IK", HandleHeadIKContent, false);
        }
Пример #3
0
        public EffectEditor(ITagContainer diContainer)
        {
            device               = diContainer.GetTag <GraphicsDevice>();
            resourcePool         = diContainer.GetTag <IResourcePool>();
            gameTime             = diContainer.GetTag <GameTime>();
            Window               = diContainer.GetTag <WindowContainer>().NewWindow("Effect Editor");
            Window.InitialBounds = new Rect(float.NaN, float.NaN, 1100f, 600f);
            Window.AddTag(this);
            editor = new TwoColumnEditorTag(Window, diContainer);
            var onceAction = new OnceAction();

            Window.AddTag(onceAction);
            Window.OnContent += onceAction.Invoke;
            var menuBar = new MenuBarWindowTag(Window);

            menuBar.AddButton("Open", HandleMenuOpen);
            fbArea           = Window.GetTag <FramebufferArea>();
            fbArea.OnResize += HandleResize;
            fbArea.OnRender += HandleRender;
            diContainer.GetTag <OpenDocumentSet>().AddEditor(this);

            openFileModal = new OpenFileModal(diContainer)
            {
                Filter             = "*.ed",
                IsFilterChangeable = false
            };
            openFileModal.OnOpenedResource += Load;

            locationBuffer   = new LocationBuffer(device);
            this.diContainer = diContainer.ExtendedWith(locationBuffer);
            AddDisposable(this.diContainer);
            this.diContainer.AddTag(camera = new Camera(this.diContainer));
            this.diContainer.AddTag <IQuadMeshBuffer <EffectVertex> >(new DynamicQuadMeshBuffer <EffectVertex>(device.ResourceFactory, 1024));
            this.diContainer.AddTag <IQuadMeshBuffer <SparkVertex> >(new DynamicQuadMeshBuffer <SparkVertex>(device.ResourceFactory, 256));
            controls = new OrbitControlsTag(Window, camera.Location, this.diContainer);
            AddDisposable(controls);
            gridRenderer = new DebugGridRenderer(this.diContainer);
            gridRenderer.Material.LinkTransformsTo(camera);
            gridRenderer.Material.World.Ref = Matrix4x4.Identity;
            AddDisposable(gridRenderer);

            AddDisposable(textureLoader = new CachedAssetLoader <Texture>(new TextureAssetLoader(diContainer)));
            AddDisposable(clumpLoader   = new CachedClumpAssetLoader(diContainer));
            this.diContainer.AddTag <IAssetLoader <Texture> >(textureLoader);
            this.diContainer.AddTag <IAssetLoader <ClumpBuffers> >(clumpLoader);

            editor.AddInfoSection("Info", HandleInfoContent);
            editor.AddInfoSection("Playback", HandlePlaybackContent);
        }
Пример #4
0
        public SceneEditor(ITagContainer diContainer)
        {
            this.diContainer = diContainer;
            resourcePool     = diContainer.GetTag <IResourcePool>();
            Window           = diContainer.GetTag <WindowContainer>().NewWindow("Scene Editor");
            Window.AddTag(this);
            Window.InitialBounds = new Rect(float.NaN, float.NaN, 1100.0f, 600.0f);
            editor = new TwoColumnEditorTag(Window, diContainer);
            var onceAction = new OnceAction();

            Window.AddTag(onceAction);
            Window.OnContent += onceAction.Invoke;
            locationBuffer    = new LocationBuffer(diContainer.GetTag <GraphicsDevice>());
            AddDisposable(locationBuffer);
            var menuBar = new MenuBarWindowTag(Window);

            menuBar.AddButton("Open", HandleMenuOpen);
            openFileModal                    = new OpenFileModal(diContainer);
            openFileModal.Filter             = "*.scn";
            openFileModal.IsFilterChangeable = false;
            openFileModal.OnOpenedResource  += Load;

            camera = new Camera(diContainer.ExtendedWith(locationBuffer));
            AddDisposable(camera);
            controls     = new FlyControlsTag(Window, camera.Location, diContainer);
            gridRenderer = new DebugGridRenderer(diContainer);
            gridRenderer.Material.LinkTransformsTo(camera);
            gridRenderer.Material.World.Ref = Matrix4x4.Identity;
            AddDisposable(gridRenderer);
            fbArea           = Window.GetTag <FramebufferArea>();
            fbArea.OnResize += HandleResize;
            fbArea.OnRender += camera.Update;
            fbArea.OnRender += locationBuffer.Update;
            fbArea.OnRender += gridRenderer.Render;

            localDiContainer = diContainer
                               .FallbackTo(Window)
                               .ExtendedWith(this, Window, gridRenderer, locationBuffer)
                               .AddTag <IAssetLoader <Texture> >(new CachedAssetLoader <Texture>(diContainer.GetTag <IAssetLoader <Texture> >()))
                               .AddTag <IAssetLoader <ClumpBuffers> >(new CachedClumpAssetLoader(diContainer))
                               .AddTag(camera);
            new DatasetComponent(localDiContainer);
            new WorldComponent(localDiContainer);
            new ModelComponent(localDiContainer);
            new FOModelComponent(localDiContainer);
            new TriggerComponent(localDiContainer);
            new SelectionComponent(localDiContainer);
        }
Пример #5
0
        public DebugSkeletonRenderer(ITagContainer diContainer, ClumpBuffers geometryBuffers, Skeleton skeleton)
        {
            Geometry = geometryBuffers;
            Skeleton = skeleton;
            var camera = diContainer.GetTag <Camera>();

            locationBuffer   = diContainer.GetTag <LocationBuffer>();
            worldBufferRange = locationBuffer.Add(skeleton.Location);

            void LinkTransformsFor(IStandardTransformMaterial m)
            {
                m.LinkTransformsTo(camera);
                m.World.BufferRange = worldBufferRange;
            }

            BoneMaterial = new DebugSkinnedMaterial(diContainer);
            LinkTransformsFor(BoneMaterial);
            BoneMaterial.Pose.Skeleton = skeleton;
            SkinMaterial = new DebugSkinAllMaterial(diContainer);
            LinkTransformsFor(SkinMaterial);
            SkinMaterial.Alpha.Ref  = 1.0f;
            SkinHighlightedMaterial = new DebugSkinSingleMaterial(diContainer);
            LinkTransformsFor(SkinHighlightedMaterial);
            SkinHighlightedMaterial.BoneIndex.Ref = -1;
            LinesMaterial = new DebugLinesMaterial(diContainer);
            LinkTransformsFor(LinesMaterial);
            device = diContainer.GetTag <GraphicsDevice>();

            var vertices     = Enumerable.Empty <ColoredVertex>();
            var skinVertices = Enumerable.Empty <SkinVertex>();
            var indices      = Enumerable.Empty <ushort>();

            foreach (var(bone, index) in skeleton.Bones.Indexed())
            {
                if (bone.Parent == null)
                {
                    continue;
                }
                var to       = bone.GlobalPosition;
                var from     = bone.Parent.GlobalPosition;
                var length   = (to - from).Length();
                var baseSize = length * RhombusBaseSize;

                var normal = MathEx.CmpZero(length)
                    ? Vector3.UnitY
                    : (to - from) / length;
                var tangent    = Vector3.Normalize(normal.SomeOrthogonal()) * baseSize;
                var bitangent  = Vector3.Normalize(Vector3.Cross(normal, tangent)) * baseSize;
                var baseCenter = from + normal * length * RhombusBaseOffset;

                vertices = vertices.Concat(new[]
                {
                    from,
                    baseCenter - tangent - bitangent,
                    baseCenter + tangent - bitangent,
                    baseCenter + tangent + bitangent,
                    baseCenter - tangent + bitangent,
                    to
                }.Select(p => new ColoredVertex(p, Colors[index % Colors.Length])));
                skinVertices = skinVertices.Concat(Enumerable.Repeat(new SkinVertex()
                {
                    bone0   = unchecked ((byte)Skeleton.Parents[index]),
                    weights = Vector4.UnitX
                }, RhombusVertexCount));
                indices = indices.Concat(RhombusIndices.Select(i => (ushort)(i + index * RhombusVertexCount)));
            }

            var vertexArray     = vertices.ToArray();
            var skinVertexArray = skinVertices.ToArray();
            var indexArray      = indices.ToArray();

            vertexBuffer = device.ResourceFactory.CreateBuffer(new BufferDescription(
                                                                   (uint)vertexArray.Length * ColoredVertex.Stride, BufferUsage.VertexBuffer));
            skinBuffer = device.ResourceFactory.CreateBuffer(new BufferDescription(
                                                                 (uint)skinVertexArray.Length * SkinVertex.Stride, BufferUsage.VertexBuffer));
            indexBuffer = device.ResourceFactory.CreateBuffer(new BufferDescription(
                                                                  (uint)indexArray.Length * sizeof(ushort), BufferUsage.IndexBuffer));
            device.UpdateBuffer(vertexBuffer, 0, vertexArray);
            device.UpdateBuffer(skinBuffer, 0, skinVertexArray);
            device.UpdateBuffer(indexBuffer, 0, indexArray);

            var lineVertices = new ColoredVertex[]
            {
                new ColoredVertex(Vector3.Zero, Colors[0]),
                new ColoredVertex(Vector3.UnitX * LineLength, Colors[0]),
                new ColoredVertex(Vector3.Zero, Colors[1]),
                new ColoredVertex(Vector3.UnitY * LineLength, Colors[1]),
                new ColoredVertex(Vector3.Zero, Colors[2]),
                new ColoredVertex(Vector3.UnitZ * LineLength, Colors[2])
            };

            lineBuffer = device.ResourceFactory.CreateBuffer(new BufferDescription(
                                                                 (uint)lineVertices.Length * ColoredVertex.Stride, BufferUsage.VertexBuffer));
            device.UpdateBuffer(lineBuffer, 0, lineVertices);

            var boneDepthsArr = new int[Skeleton.Bones.Count];

            for (int i = 0; i < Skeleton.Bones.Count; i++)
            {
                boneDepthsArr[i] = Skeleton.Parents[i] < 0 ? 0 : boneDepthsArr[Skeleton.Parents[i]] + 1;
            }
            boneDepths = boneDepthsArr;
        }
Пример #6
0
        public TileSceneRenderData(ITagContainer diContainer, TileScene scene, DeviceBuffer counterBuffer)
        {
            this.diContainer = diContainer;
            this.scene       = scene;
            locationBuffer   = diContainer.GetTag <LocationBuffer>();
            var textureLoader = diContainer.GetTag <IAssetLoader <Texture> >();
            var camera        = diContainer.GetTag <OrthoCamera>();

            var worldLocationRange = locationBuffer.Add(new Location());
            var locationRanges     = new List <DeviceBufferRange>(scene.Objects.Count + 1)
            {
                worldLocationRange
            };

            this.locationRanges = locationRanges;
            worldMaterials      = scene.WorldBuffers.Materials.Select(rwMaterial =>
            {
                IMapMaterial material;
                if (rwMaterial.isTextured)
                {
                    var texMaterial = new MapStandardMaterial(diContainer);
                    (texMaterial.MainTexture.Texture, texMaterial.Sampler.Sampler) = textureLoader.LoadTexture(TextureBasePaths, rwMaterial);
                    material = texMaterial;
                }
                else
                {
                    material = new MapUntexturedMaterial(diContainer);
                }
                material.Projection.BufferRange = camera.ProjectionRange;
                material.View.BufferRange       = camera.ViewRange;
                material.World.Value            = Matrix4x4.Identity;
                material.Uniforms.Ref           = ModelStandardMaterialUniforms.Default;
                material.PixelCounter.Buffer    = counterBuffer;
                AddDisposable(material);
                return(material as IMaterial);
            }).ToList() !;

            objectMaterials = scene.Objects.Select(obj => obj.ClumpBuffers.SubMeshes.Select(subMesh =>
            {
                var objectLocation           = new Location();
                objectLocation.LocalPosition = obj.Position;
                objectLocation.LocalRotation = obj.Rotation;
                var objectLocationRange      = locationBuffer.Add(objectLocation);
                locationRanges.Add(objectLocationRange);

                var rwMaterial = subMesh.Material;
                IMapMaterial material;
                if (rwMaterial.isTextured)
                {
                    var texMaterial = new MapStandardMaterial(diContainer);
                    (texMaterial.MainTexture.Texture, texMaterial.Sampler.Sampler) = textureLoader.LoadTexture(TextureBasePaths, rwMaterial);
                    material = texMaterial;
                }
                else
                {
                    material = new MapUntexturedMaterial(diContainer);
                }
                material.Projection.BufferRange         = camera.ProjectionRange;
                material.View.BufferRange               = camera.ViewRange;
                material.World.BufferRange              = objectLocationRange;
                material.Uniforms.Ref                   = ModelStandardMaterialUniforms.Default;
                material.Uniforms.Ref.vertexColorFactor = 0.0f;
                material.Uniforms.Ref.tint              = rwMaterial.color.ToFColor() * obj.Tint;
                material.PixelCounter.Buffer            = counterBuffer;
                AddDisposable(material);
                return(material as IMaterial);
            }).ToList() as IReadOnlyList <IMaterial>).ToList();
        }
Пример #7
0
        public WorldViewer(ITagContainer diContainer)
        {
            this.diContainer = diContainer;
            resourcePool     = diContainer.GetTag <IResourcePool>();
            Window           = diContainer.GetTag <WindowContainer>().NewWindow("World Viewer");
            Window.AddTag(this);
            Window.InitialBounds = new Rect(float.NaN, float.NaN, 1100.0f, 600.0f);
            editor = new TwoColumnEditorTag(Window, diContainer);
            var onceAction = new OnceAction();

            Window.AddTag(onceAction);
            Window.OnContent += onceAction.Invoke;
            Window.OnContent += UpdateIntersectionPrimitive;
            Window.OnKeyDown += HandleKeyDown;
            var menuBar = new MenuBarWindowTag(Window);

            menuBar.AddButton("Open", HandleMenuOpen);
            var gridRenderer = new DebugGridRenderer(diContainer);

            //gridRenderer.Material.LinkTransformsTo(controls.Projection, controls.View, controls.World);
            AddDisposable(gridRenderer);
            modelMaterialEdit = new ModelMaterialEdit(Window, diContainer);
            modelMaterialEdit.OpenEntriesByDefault = false;
            diContainer.GetTag <OpenDocumentSet>().AddEditor(this);
            openFileModal                    = new OpenFileModal(diContainer);
            openFileModal.Filter             = "*.bsp";
            openFileModal.IsFilterChangeable = false;
            openFileModal.OnOpenedResource  += Load;

            locationBuffer = new LocationBuffer(diContainer.GetTag <GraphicsDevice>());
            AddDisposable(locationBuffer);
            camera = new Camera(diContainer.ExtendedWith(locationBuffer));
            AddDisposable(camera);
            controls           = new FlyControlsTag(Window, camera.Location, diContainer);
            worldTransform     = new UniformBuffer <Matrix4x4>(diContainer.GetTag <GraphicsDevice>().ResourceFactory);
            worldTransform.Ref = Matrix4x4.Identity;
            AddDisposable(worldTransform);
            fbArea           = Window.GetTag <FramebufferArea>();
            fbArea.OnResize += HandleResize;
            fbArea.OnRender += locationBuffer.Update;
            fbArea.OnRender += worldTransform.Update;
            fbArea.OnRender += camera.Update;
            fbArea.OnRender += gridRenderer.Render;
            fbArea.OnRender += HandleRender;

            editor.AddInfoSection("Statistics", HandleStatisticsContent);
            editor.AddInfoSection("Materials", HandleMaterialsContent, false);
            editor.AddInfoSection("Sections", HandleSectionsContent, false);
            editor.AddInfoSection("ViewFrustum Culling", HandleViewFrustumCulling, false);
            editor.AddInfoSection("Collision", HandleCollision, false);
            editor.AddInfoSection("Raycast", HandleRaycast, true);

            boundsRenderer       = new DebugBoxLineRenderer(diContainer);
            boundsRenderer.Color = IColor.Red;
            boundsRenderer.Material.LinkTransformsTo(camera);
            boundsRenderer.Material.LinkTransformsTo(world: worldTransform);
            AddDisposable(boundsRenderer);

            planeRenderer = new DebugPlaneRenderer(diContainer);
            planeRenderer.Material.LinkTransformsTo(camera);
            planeRenderer.Material.LinkTransformsTo(world: worldTransform);
            AddDisposable(planeRenderer);

            frustumRenderer = new DebugHexahedronLineRenderer(diContainer);
            frustumRenderer.Material.LinkTransformsTo(camera);
            frustumRenderer.Material.LinkTransformsTo(world: worldTransform);
            AddDisposable(frustumRenderer);

            triangleRenderer = new DebugTriangleLineRenderer(diContainer);
            triangleRenderer.Material.LinkTransformsTo(camera);
            triangleRenderer.Material.LinkTransformsTo(world: worldTransform);
            AddDisposable(triangleRenderer);

            rayRenderer = new DebugLineRenderer(diContainer);
            rayRenderer.Material.LinkTransformsTo(camera);
            rayRenderer.Material.LinkTransformsTo(world: worldTransform);
            AddDisposable(rayRenderer);

            worldRenderer = new WorldRenderer(diContainer.ExtendedWith(camera, locationBuffer));
            AddDisposable(worldRenderer);
        }