Browse Source

Optimized normal transforms.

David Piuva 5 years ago
parent
commit
98fe2c1550
2 changed files with 18 additions and 10 deletions
  1. 14 0
      Source/DFPSR/math/FMatrix3x3.h
  2. 4 10
      Source/SDK/sandbox/sprite/spriteAPI.cpp

+ 14 - 0
Source/DFPSR/math/FMatrix3x3.h

@@ -106,6 +106,20 @@ inline FMatrix3x3 inverse(const FMatrix3x3& m) {
 	return inverseUsingInvDet(m, 1.0f / determinant(m));
 	return inverseUsingInvDet(m, 1.0f / determinant(m));
 }
 }
 
 
+inline FMatrix3x3 transpose(const FMatrix3x3& m) {
+	FMatrix3x3 result;
+    result.xAxis.x = m.xAxis.x;
+    result.xAxis.y = m.yAxis.x;
+    result.xAxis.z = m.zAxis.x;
+    result.yAxis.x = m.xAxis.y;
+    result.yAxis.y = m.yAxis.y;
+    result.yAxis.z = m.zAxis.y;
+    result.zAxis.x = m.xAxis.z;
+    result.zAxis.y = m.yAxis.z;
+    result.zAxis.z = m.zAxis.z;
+	return result;
+}
+
 }
 }
 
 
 #endif
 #endif

+ 4 - 10
Source/SDK/sandbox/sprite/spriteAPI.cpp

@@ -864,7 +864,7 @@ static IRect renderModel(Model model, OrthoView view, ImageF32 depthBuffer, Imag
 	}
 	}
 
 
 	// Combine normal transforms
 	// Combine normal transforms
-	FMatrix3x3 normalToWorldSpace = view.normalToWorldSpace;
+	FMatrix3x3 modelToNormalSpace = modelToWorldSpace.transform * transpose(view.normalToWorldSpace);
 
 
 	// Render polygons as triangle fans
 	// Render polygons as triangle fans
 	for (int part = 0; part < model_getNumberOfParts(model); part++) {
 	for (int part = 0; part < model_getNumberOfParts(model); part++) {
@@ -873,10 +873,7 @@ static IRect renderModel(Model model, OrthoView view, ImageF32 depthBuffer, Imag
 			int vertA = 0;
 			int vertA = 0;
 			FVector4D vertexColorA = model_getVertexColor(model, part, poly, vertA) * 255.0f;
 			FVector4D vertexColorA = model_getVertexColor(model, part, poly, vertA) * 255.0f;
 			int indexA = model_getVertexPointIndex(model, part, poly, vertA);
 			int indexA = model_getVertexPointIndex(model, part, poly, vertA);
-			
-			// TODO: Merge transforms into normalToWorldSpace in advance
-			FVector3D normalA = normalToWorldSpace.transformTransposed(modelToWorldSpace.transform.transform(unpackNormals(model_getTexCoord(model, part, poly, vertA))));
-			
+			FVector3D normalA = modelToNormalSpace.transform(unpackNormals(model_getTexCoord(model, part, poly, vertA)));
 			FVector3D pointA = projectedPoints[indexA];
 			FVector3D pointA = projectedPoints[indexA];
 			LVector2D subPixelA = LVector2D(safeRoundInt64(pointA.x * constants::unitsPerPixel), safeRoundInt64(pointA.y * constants::unitsPerPixel));
 			LVector2D subPixelA = LVector2D(safeRoundInt64(pointA.x * constants::unitsPerPixel), safeRoundInt64(pointA.y * constants::unitsPerPixel));
 			for (int vertB = 1; vertB < vertexCount - 1; vertB++) {
 			for (int vertB = 1; vertB < vertexCount - 1; vertB++) {
@@ -885,11 +882,8 @@ static IRect renderModel(Model model, OrthoView view, ImageF32 depthBuffer, Imag
 				int indexC = model_getVertexPointIndex(model, part, poly, vertC);
 				int indexC = model_getVertexPointIndex(model, part, poly, vertC);
 				FVector4D vertexColorB = model_getVertexColor(model, part, poly, vertB) * 255.0f;
 				FVector4D vertexColorB = model_getVertexColor(model, part, poly, vertB) * 255.0f;
 				FVector4D vertexColorC = model_getVertexColor(model, part, poly, vertC) * 255.0f;
 				FVector4D vertexColorC = model_getVertexColor(model, part, poly, vertC) * 255.0f;
-				
-				// TODO: Merge transforms into normalToWorldSpace in advance
-				FVector3D normalB = normalToWorldSpace.transformTransposed(modelToWorldSpace.transform.transform(unpackNormals(model_getTexCoord(model, part, poly, vertB))));
-				FVector3D normalC = normalToWorldSpace.transformTransposed(modelToWorldSpace.transform.transform(unpackNormals(model_getTexCoord(model, part, poly, vertC))));
-				
+				FVector3D normalB = modelToNormalSpace.transform(unpackNormals(model_getTexCoord(model, part, poly, vertB)));
+				FVector3D normalC = modelToNormalSpace.transform(unpackNormals(model_getTexCoord(model, part, poly, vertC)));
 				FVector3D pointB = projectedPoints[indexB];
 				FVector3D pointB = projectedPoints[indexB];
 				FVector3D pointC = projectedPoints[indexC];
 				FVector3D pointC = projectedPoints[indexC];
 				LVector2D subPixelB = LVector2D(safeRoundInt64(pointB.x * constants::unitsPerPixel), safeRoundInt64(pointB.y * constants::unitsPerPixel));
 				LVector2D subPixelB = LVector2D(safeRoundInt64(pointB.x * constants::unitsPerPixel), safeRoundInt64(pointB.y * constants::unitsPerPixel));