Skip to content

Commit a8c1301

Browse files
author
Sander van Rossen
committed
Fixed some texture smearing issues
1 parent e41b7e8 commit a8c1301

File tree

2 files changed

+23
-6
lines changed

2 files changed

+23
-6
lines changed

RealtimeCSG/Assets/Plugins/RealtimeCSG/Editor/Scripts/Control/Helpers/GeometryUtility.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
using System.Collections.Generic;
1+
using System.Collections.Generic;
22
using UnityEditor;
33
using UnityEngine;
44
using InternalRealtimeCSG;
@@ -921,7 +921,7 @@ public static bool ContinueTexGenFromSurfaceToSurface(CSGBrush brush, int srcSur
921921
var dstModelPoint2 = modelFromWorld.MultiplyPoint(dstWorldPoint2);
922922

923923
var result = SurfaceUtility.AlignTextureSpaces(localFromModel, texGens[srcTexGenIndex], texGenFlags[srcTexGenIndex], ref surfaces[srcSurfaceIndex], srcModelPoint1, srcModelPoint2,
924-
localFromModel, ref texGens[dstTexGenIndex], texGenFlags[dstTexGenIndex], ref surfaces[dstSurfaceIndex], dstModelPoint1, dstModelPoint2, false);
924+
localFromModel, ref texGens[dstTexGenIndex], texGenFlags[dstTexGenIndex], ref surfaces[dstSurfaceIndex], dstModelPoint1, dstModelPoint2, false, Vector3.one);
925925

926926
// if (src_is_world_space) SurfaceUtility.SetTextureLock(brush, srcSurfaceIndex, false);
927927
// if (dst_is_world_space) SurfaceUtility.SetTextureLock(brush, dstSurfaceIndex, false);

RealtimeCSG/Assets/Plugins/RealtimeCSG/Editor/Scripts/Control/Helpers/SurfaceUtility.cs

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
using InternalRealtimeCSG;
1+
using InternalRealtimeCSG;
22
using System.Collections.Generic;
33
using System.Linq;
44
using UnityEditor;
@@ -695,6 +695,11 @@ static void CopyLastMaterialInternal(CSGBrush dstBrush, int dstSurfaceIndex, boo
695695
var dstTexGenIndex = dstShape.Surfaces[dstSurfaceIndex].TexGenIndex;
696696
var srcTexGenIndex = srcShape.Surfaces[srcSurfaceIndex].TexGenIndex;
697697

698+
var srcBrushScale = srcBrush.transform.lossyScale;
699+
var dstBrushScale = dstBrush.transform.lossyScale;
700+
701+
var srcBrushFromLocal = srcBrush.transform.localToWorldMatrix;
702+
var dstBrushFromLocal = dstBrush.transform.localToWorldMatrix;
698703
var srcBrushFromWorld = srcBrush.transform.worldToLocalMatrix;
699704
var dstBrushFromWorld = dstBrush.transform.worldToLocalMatrix;
700705

@@ -729,9 +734,10 @@ static void CopyLastMaterialInternal(CSGBrush dstBrush, int dstSurfaceIndex, boo
729734
var det = edgeDirection.sqrMagnitude;
730735
if (det < MathConstants.AlignmentTestEpsilon)
731736
{
737+
var tangent = GeometryUtility.CalculateTangent(srcNormal);
732738
// Find 2 pairs of points on each plane, assumes planes are perfectly aligned
733739
srcWorldPoint1 = srcWorldPlane.pointOnPlane;
734-
srcWorldPoint2 = GeometryUtility.ProjectPointOnPlane(srcWorldPlane, srcWorldPoint1 + MathConstants.oneVector3);
740+
srcWorldPoint2 = GeometryUtility.ProjectPointOnPlane(srcWorldPlane, srcWorldPoint1 + tangent);
735741

736742
dstWorldPoint1 = GeometryUtility.ProjectPointOnPlane(dstWorldPlane, srcWorldPoint1);
737743
dstWorldPoint2 = GeometryUtility.ProjectPointOnPlane(dstWorldPlane, srcWorldPoint2);
@@ -754,8 +760,13 @@ static void CopyLastMaterialInternal(CSGBrush dstBrush, int dstSurfaceIndex, boo
754760
var dstModelPoint1 = dstModelFromWorld.MultiplyPoint(dstWorldPoint1);
755761
var dstModelPoint2 = dstModelFromWorld.MultiplyPoint(dstWorldPoint2);
756762

763+
var scale = dstBrushScale;
764+
scale.x /= srcBrushScale.x; if (float.IsNaN(scale.x) || float.IsInfinity(scale.x)) scale.x = 1;
765+
scale.y /= srcBrushScale.y; if (float.IsNaN(scale.y) || float.IsInfinity(scale.y)) scale.y = 1;
766+
scale.z /= srcBrushScale.z; if (float.IsNaN(scale.z) || float.IsInfinity(scale.z)) scale.z = 1;
767+
757768
if (AlignTextureSpaces(srcBrushFromModel, srcTexGens[srcTexGenIndex], srcTexGenFlags[srcTexGenIndex], ref srcSurfaces[srcSurfaceIndex], srcModelPoint1, srcModelPoint2,
758-
dstBrushFromModel, ref dstTexGens[dstTexGenIndex], dstTexGenFlags[dstTexGenIndex], ref dstSurfaces[dstSurfaceIndex], dstModelPoint1, dstModelPoint2, flipX))
769+
dstBrushFromModel, ref dstTexGens[dstTexGenIndex], dstTexGenFlags[dstTexGenIndex], ref dstSurfaces[dstSurfaceIndex], dstModelPoint1, dstModelPoint2, flipX, scale))
759770
{
760771
if (dstTexGens.Length != dstTexGenFlags.Length)
761772
{
@@ -1264,7 +1275,7 @@ public static bool TranslateTextureCoordInLocalSpace(ref TexGen texGen, TexGenFl
12641275
}
12651276

12661277
public static bool AlignTextureSpaces(Matrix4x4 src_Brush_From_Model, TexGen srcTexGen, TexGenFlags srcTexGenFlags, ref Surface srcSurface, Vector3 srcModelPoint1, Vector3 srcModelPoint2,
1267-
Matrix4x4 dst_Brush_From_Model, ref TexGen dstTexGen, TexGenFlags dstTexGenFlags, ref Surface dstSurface, Vector3 dstModelPoint1, Vector3 dstModelPoint2, bool flipX)
1278+
Matrix4x4 dst_Brush_From_Model, ref TexGen dstTexGen, TexGenFlags dstTexGenFlags, ref Surface dstSurface, Vector3 dstModelPoint1, Vector3 dstModelPoint2, bool flipX, Vector3 scale)
12681279
{
12691280
var src_Plane_From_Model = GenerateModelSpaceToPlaneSpaceMatrix(srcSurface, srcTexGenFlags, src_Brush_From_Model);
12701281
var dst_Plane_From_Model = GenerateModelSpaceToPlaneSpaceMatrix(dstSurface, dstTexGenFlags, dst_Brush_From_Model);
@@ -1311,6 +1322,12 @@ public static bool AlignTextureSpaces(Matrix4x4 src_Brush_From_Model, TexGen
13111322
dstTexGen.RotationAngle = angle;
13121323
}
13131324

1325+
if (scale != Vector3.one)
1326+
{
1327+
var dst_Texture_From_Plane = dstTexGen.GeneratePlaneSpaceToTextureSpaceMatrix();
1328+
dstTexGen.Scale = dst_Texture_From_Plane.MultiplyVector(scale);
1329+
}
1330+
13141331
// Re-align dstTexcoord1 with srcTexcoord1 on dstTexGen
13151332
{
13161333
dstTexGen.Translation = Vector2.zero;

0 commit comments

Comments
 (0)