From 1e2e927cf6d6fc2d5b17ce42e8b881a25b684ce9 Mon Sep 17 00:00:00 2001 From: dexy Date: Fri, 7 Dec 2018 13:41:18 +1100 Subject: [PATCH] Fixed grass painting and selection bugs/glitchiness --- Rendering/Renderable.cs | 10 ++++++++++ Rendering/Renderer.cs | 2 ++ Rendering/Shaders/BasicShader.cs | 10 +++++----- WorldForm.cs | 9 +++++++-- 4 files changed, 24 insertions(+), 7 deletions(-) diff --git a/Rendering/Renderable.cs b/Rendering/Renderable.cs index b8c3c6d..4112796 100644 --- a/Rendering/Renderable.cs +++ b/Rendering/Renderable.cs @@ -936,6 +936,10 @@ namespace CodeWalker.Rendering public rage__fwGrassInstanceListDef__InstanceData[] GrassInstanceData { get; set; } public GpuSBuffer GrassInstanceBuffer { get; set; } public int InstanceCount { get; set; } + public Vector3 AABBMin { get; set; } + public Vector3 AABBMax { get; set; } + public Vector3 Position { get; set; } + public Vector3 CamRel { get; set; } public override void Init(YmapGrassInstanceBatch batch) { @@ -955,6 +959,12 @@ namespace CodeWalker.Rendering public override void Load(Device device) { + if (Key != null) + { + AABBMin = Key.AABBMin; + AABBMax = Key.AABBMax; + Position = Key.Position; + } if ((GrassInstanceData != null) && (GrassInstanceData.Length > 0)) { GrassInstanceBuffer = new GpuSBuffer(device, GrassInstanceData); diff --git a/Rendering/Renderer.cs b/Rendering/Renderer.cs index 982472b..3d67492 100644 --- a/Rendering/Renderer.cs +++ b/Rendering/Renderer.cs @@ -2081,6 +2081,8 @@ namespace CodeWalker.Rendering if (!(rndbl.IsLoaded && (rndbl.AllTexturesLoaded || !waitforchildrentoload))) continue; //not loaded yet if ((instb == null) || !instb.IsLoaded) continue; + instb.CamRel = instb.Position - camera.Position;//to gracefully handle batch size changes + RenderableInstanceBatchInst binst = new RenderableInstanceBatchInst(); binst.Batch = instb; binst.Renderable = rndbl; diff --git a/Rendering/Shaders/BasicShader.cs b/Rendering/Shaders/BasicShader.cs index e7b85e8..ad1f93b 100644 --- a/Rendering/Shaders/BasicShader.cs +++ b/Rendering/Shaders/BasicShader.cs @@ -699,7 +699,7 @@ namespace CodeWalker.Rendering if (batch.GrassInstanceBuffer == null) return; - VSEntityVars.Vars.CamRel = new Vector4(gb.CamRel, 0.0f); + VSEntityVars.Vars.CamRel = new Vector4(batch.CamRel, 0.0f); VSEntityVars.Vars.Orientation = Quaternion.Identity; VSEntityVars.Vars.Scale = Vector3.One; VSEntityVars.Vars.HasSkeleton = 0; @@ -711,13 +711,13 @@ namespace CodeWalker.Rendering InstGlobalVars.SetVSCBuffer(context, 5); - InstLocalVars.Vars.vecBatchAabbMin = gb.AABBMin; - InstLocalVars.Vars.vecBatchAabbDelta = gb.AABBMax - gb.AABBMin; - InstLocalVars.Vars.vecPlayerPos = new Vector4(gb.Position - gb.CamRel, 1.0f); + InstLocalVars.Vars.vecBatchAabbMin = batch.AABBMin; + InstLocalVars.Vars.vecBatchAabbDelta = batch.AABBMax - batch.AABBMin; + InstLocalVars.Vars.vecPlayerPos = new Vector4(batch.Position - batch.CamRel, 1.0f); InstLocalVars.Vars._vecCollParams = new Vector2(2.0f, -3.0f);//range, offset InstLocalVars.Vars.fadeAlphaDistUmTimer = new Vector4(0.0f); InstLocalVars.Vars.uMovementParams = new Vector4(0.0f); - InstLocalVars.Vars._fakedGrassNormal = new Vector4(Vector3.Normalize(-gb.CamRel), 0.0f); + InstLocalVars.Vars._fakedGrassNormal = new Vector4(Vector3.Normalize(-batch.CamRel), 0.0f); InstLocalVars.Vars.gScaleRange = gb.Batch.ScaleRange; InstLocalVars.Vars.gWindBendingGlobals = new Vector4(WindVector.X, WindVector.Y, 1.0f, 1.0f); InstLocalVars.Vars.gWindBendScaleVar = new Vector2(WindVector.Z, WindVector.W); diff --git a/WorldForm.cs b/WorldForm.cs index fbb7e48..0e88468 100644 --- a/WorldForm.cs +++ b/WorldForm.cs @@ -1431,12 +1431,18 @@ namespace CodeWalker } } } - if ((selectionItem.GrassBatch != null) || (selectionItem.ArchetypeExtension != null) || (selectionItem.EntityExtension != null) || (selectionItem.CollisionBounds != null)) + if ((selectionItem.ArchetypeExtension != null) || (selectionItem.EntityExtension != null) || (selectionItem.CollisionBounds != null)) { bbmin = selectionItem.AABB.Minimum; bbmax = selectionItem.AABB.Maximum; scale = Vector3.One; } + if (selectionItem.GrassBatch != null) + { + bbmin = selectionItem.GrassBatch.AABBMin; + bbmax = selectionItem.GrassBatch.AABBMax; + scale = Vector3.One; + } if (selectionItem.NavPoly != null) { Renderer.RenderSelectionNavPoly(selectionItem.NavPoly); @@ -3368,7 +3374,6 @@ namespace CodeWalker SelectItem(ms); } } - public void SelectGrassBatch(YmapGrassInstanceBatch batch) { if (batch == null)