// Normalleri kontrol eder. Normaller ışığın doğru yansıması ve gölgelerin doğru oluşması için gereklidir. private static void NormalCheck(ref Mesh_Maker.Triangle triangle) { Vector3 crossProduct = Vector3.Cross(triangle.vertices[1] - triangle.vertices[0], triangle.vertices[2] - triangle.vertices[0]); Vector3 averageNormal = (triangle.normals[0] + triangle.normals[1] + triangle.normals[2]) / 3.0f; float dotProduct = Vector3.Dot(averageNormal, crossProduct); if (dotProduct < 0) { Vector3 temp = triangle.vertices[2]; triangle.vertices[2] = triangle.vertices[0]; triangle.vertices[0] = temp; temp = triangle.normals[2]; triangle.normals[2] = triangle.normals[0]; triangle.normals[0] = temp; Vector2 temp2 = triangle.uvs[2]; triangle.uvs[2] = triangle.uvs[0]; triangle.uvs[0] = temp2; Vector4 temp3 = triangle.tangents[2]; triangle.tangents[2] = triangle.tangents[0]; triangle.tangents[0] = temp3; } }
// Method private static void Cut_this_Face(ref Mesh_Maker.Triangle triangle, int submesh) { _isLeftSideCache[0] = _blade.GetSide(triangle.vertices[0]); // true = left _isLeftSideCache[1] = _blade.GetSide(triangle.vertices[1]); _isLeftSideCache[2] = _blade.GetSide(triangle.vertices[2]); int leftCount = 0; int rightCount = 0; for (int i = 0; i < 3; i++) { if (_isLeftSideCache[i]) { // Sol _leftTriangleCache.vertices[leftCount] = triangle.vertices[i]; _leftTriangleCache.uvs[leftCount] = triangle.uvs[i]; _leftTriangleCache.normals[leftCount] = triangle.normals[i]; _leftTriangleCache.tangents[leftCount] = triangle.tangents[i]; leftCount++; } else { // right _rightTriangleCache.vertices[rightCount] = triangle.vertices[i]; _rightTriangleCache.uvs[rightCount] = triangle.uvs[i]; _rightTriangleCache.normals[rightCount] = triangle.normals[i]; _rightTriangleCache.tangents[rightCount] = triangle.tangents[i]; rightCount++; } } // Yeni Üçgenleri bulur x3 // Vertices bulur //bir üçgen if (leftCount == 1) { _triangleCache.vertices[0] = _leftTriangleCache.vertices[0]; _triangleCache.uvs[0] = _leftTriangleCache.uvs[0]; _triangleCache.normals[0] = _leftTriangleCache.normals[0]; _triangleCache.tangents[0] = _leftTriangleCache.tangents[0]; _triangleCache.vertices[1] = _rightTriangleCache.vertices[0]; _triangleCache.uvs[1] = _rightTriangleCache.uvs[0]; _triangleCache.normals[1] = _rightTriangleCache.normals[0]; _triangleCache.tangents[1] = _rightTriangleCache.tangents[0]; _triangleCache.vertices[2] = _rightTriangleCache.vertices[1]; _triangleCache.uvs[2] = _rightTriangleCache.uvs[1]; _triangleCache.normals[2] = _rightTriangleCache.normals[1]; _triangleCache.tangents[2] = _rightTriangleCache.tangents[1]; } else // rightCount == 1 { _triangleCache.vertices[0] = _rightTriangleCache.vertices[0]; _triangleCache.uvs[0] = _rightTriangleCache.uvs[0]; _triangleCache.normals[0] = _rightTriangleCache.normals[0]; _triangleCache.tangents[0] = _rightTriangleCache.tangents[0]; _triangleCache.vertices[1] = _leftTriangleCache.vertices[0]; _triangleCache.uvs[1] = _leftTriangleCache.uvs[0]; _triangleCache.normals[1] = _leftTriangleCache.normals[0]; _triangleCache.tangents[1] = _leftTriangleCache.tangents[0]; _triangleCache.vertices[2] = _leftTriangleCache.vertices[1]; _triangleCache.uvs[2] = _leftTriangleCache.uvs[1]; _triangleCache.normals[2] = _leftTriangleCache.normals[1]; _triangleCache.tangents[2] = _leftTriangleCache.tangents[1]; } // Keşisim noktalarını bulmaya geldik float distance = 0; float normalizedDistance = 0.0f; Vector3 edgeVector = Vector3.zero; // kenar uzunluğu ve yönü ölçer edgeVector = _triangleCache.vertices[1] - _triangleCache.vertices[0]; _blade.Raycast(new Ray(_triangleCache.vertices[0], edgeVector.normalized), out distance); normalizedDistance = distance / edgeVector.magnitude; _newTriangleCache.vertices[0] = Vector3.Lerp(_triangleCache.vertices[0], _triangleCache.vertices[1], normalizedDistance); _newTriangleCache.uvs[0] = Vector2.Lerp(_triangleCache.uvs[0], _triangleCache.uvs[1], normalizedDistance); _newTriangleCache.normals[0] = Vector3.Lerp(_triangleCache.normals[0], _triangleCache.normals[1], normalizedDistance); _newTriangleCache.tangents[0] = Vector4.Lerp(_triangleCache.tangents[0], _triangleCache.tangents[1], normalizedDistance); edgeVector = _triangleCache.vertices[2] - _triangleCache.vertices[0]; _blade.Raycast(new Ray(_triangleCache.vertices[0], edgeVector.normalized), out distance); normalizedDistance = distance / edgeVector.magnitude; _newTriangleCache.vertices[1] = Vector3.Lerp(_triangleCache.vertices[0], _triangleCache.vertices[2], normalizedDistance); _newTriangleCache.uvs[1] = Vector2.Lerp(_triangleCache.uvs[0], _triangleCache.uvs[2], normalizedDistance); _newTriangleCache.normals[1] = Vector3.Lerp(_triangleCache.normals[0], _triangleCache.normals[2], normalizedDistance); _newTriangleCache.tangents[1] = Vector4.Lerp(_triangleCache.tangents[0], _triangleCache.tangents[2], normalizedDistance); if (_newTriangleCache.vertices[0] != _newTriangleCache.vertices[1]) { _newVerticesCache.Add(_newTriangleCache.vertices[0]); _newVerticesCache.Add(_newTriangleCache.vertices[1]); } // Yeni üçgenler oluşturur if (leftCount == 1) { _triangleCache.vertices[0] = _leftTriangleCache.vertices[0]; _triangleCache.uvs[0] = _leftTriangleCache.uvs[0]; _triangleCache.normals[0] = _leftTriangleCache.normals[0]; _triangleCache.tangents[0] = _leftTriangleCache.tangents[0]; _triangleCache.vertices[1] = _newTriangleCache.vertices[0]; _triangleCache.uvs[1] = _newTriangleCache.uvs[0]; _triangleCache.normals[1] = _newTriangleCache.normals[0]; _triangleCache.tangents[1] = _newTriangleCache.tangents[0]; _triangleCache.vertices[2] = _newTriangleCache.vertices[1]; _triangleCache.uvs[2] = _newTriangleCache.uvs[1]; _triangleCache.normals[2] = _newTriangleCache.normals[1]; _triangleCache.tangents[2] = _newTriangleCache.tangents[1]; // Doğru yöne bakıp bakmadığını kontrol eder. NormalCheck(ref _triangleCache); // Ekleme _leftSide.AddTriangle(_triangleCache, submesh); _triangleCache.vertices[0] = _rightTriangleCache.vertices[0]; _triangleCache.uvs[0] = _rightTriangleCache.uvs[0]; _triangleCache.normals[0] = _rightTriangleCache.normals[0]; _triangleCache.tangents[0] = _rightTriangleCache.tangents[0]; _triangleCache.vertices[1] = _newTriangleCache.vertices[0]; _triangleCache.uvs[1] = _newTriangleCache.uvs[0]; _triangleCache.normals[1] = _newTriangleCache.normals[0]; _triangleCache.tangents[1] = _newTriangleCache.tangents[0]; _triangleCache.vertices[2] = _newTriangleCache.vertices[1]; _triangleCache.uvs[2] = _newTriangleCache.uvs[1]; _triangleCache.normals[2] = _newTriangleCache.normals[1]; _triangleCache.tangents[2] = _newTriangleCache.tangents[1]; // Doğru yöne bakıp bakmadığını kontrol eder. NormalCheck(ref _triangleCache); // Ekleme _rightSide.AddTriangle(_triangleCache, submesh); // Üçüncü _triangleCache.vertices[0] = _rightTriangleCache.vertices[0]; _triangleCache.uvs[0] = _rightTriangleCache.uvs[0]; _triangleCache.normals[0] = _rightTriangleCache.normals[0]; _triangleCache.tangents[0] = _rightTriangleCache.tangents[0]; _triangleCache.vertices[1] = _rightTriangleCache.vertices[1]; _triangleCache.uvs[1] = _rightTriangleCache.uvs[1]; _triangleCache.normals[1] = _rightTriangleCache.normals[1]; _triangleCache.tangents[1] = _rightTriangleCache.tangents[1]; _triangleCache.vertices[2] = _newTriangleCache.vertices[1]; _triangleCache.uvs[2] = _newTriangleCache.uvs[1]; _triangleCache.normals[2] = _newTriangleCache.normals[1]; _triangleCache.tangents[2] = _newTriangleCache.tangents[1]; // Doğru yöne bakıp bakmadığını kontrol eder. NormalCheck(ref _triangleCache); // Ekleme _rightSide.AddTriangle(_triangleCache, submesh); } else { // Sağ İlk _triangleCache.vertices[0] = _rightTriangleCache.vertices[0]; _triangleCache.uvs[0] = _rightTriangleCache.uvs[0]; _triangleCache.normals[0] = _rightTriangleCache.normals[0]; _triangleCache.tangents[0] = _rightTriangleCache.tangents[0]; _triangleCache.vertices[1] = _newTriangleCache.vertices[0]; _triangleCache.uvs[1] = _newTriangleCache.uvs[0]; _triangleCache.normals[1] = _newTriangleCache.normals[0]; _triangleCache.tangents[1] = _newTriangleCache.tangents[0]; _triangleCache.vertices[2] = _newTriangleCache.vertices[1]; _triangleCache.uvs[2] = _newTriangleCache.uvs[1]; _triangleCache.normals[2] = _newTriangleCache.normals[1]; _triangleCache.tangents[2] = _newTriangleCache.tangents[1]; // Doğru yöne bakıp bakmadığını kontrol eder. NormalCheck(ref _triangleCache); // Ekleme _rightSide.AddTriangle(_triangleCache, submesh); _triangleCache.vertices[0] = _leftTriangleCache.vertices[0]; _triangleCache.uvs[0] = _leftTriangleCache.uvs[0]; _triangleCache.normals[0] = _leftTriangleCache.normals[0]; _triangleCache.tangents[0] = _leftTriangleCache.tangents[0]; _triangleCache.vertices[1] = _newTriangleCache.vertices[0]; _triangleCache.uvs[1] = _newTriangleCache.uvs[0]; _triangleCache.normals[1] = _newTriangleCache.normals[0]; _triangleCache.tangents[1] = _newTriangleCache.tangents[0]; _triangleCache.vertices[2] = _newTriangleCache.vertices[1]; _triangleCache.uvs[2] = _newTriangleCache.uvs[1]; _triangleCache.normals[2] = _newTriangleCache.normals[1]; _triangleCache.tangents[2] = _newTriangleCache.tangents[1]; // Doğru yöne bakıp bakmadığını kontrol eder. NormalCheck(ref _triangleCache); // Ekleme _leftSide.AddTriangle(_triangleCache, submesh); // Üçüncü _triangleCache.vertices[0] = _leftTriangleCache.vertices[0]; _triangleCache.uvs[0] = _leftTriangleCache.uvs[0]; _triangleCache.normals[0] = _leftTriangleCache.normals[0]; _triangleCache.tangents[0] = _leftTriangleCache.tangents[0]; _triangleCache.vertices[1] = _leftTriangleCache.vertices[1]; _triangleCache.uvs[1] = _leftTriangleCache.uvs[1]; _triangleCache.normals[1] = _leftTriangleCache.normals[1]; _triangleCache.tangents[1] = _leftTriangleCache.tangents[1]; _triangleCache.vertices[2] = _newTriangleCache.vertices[1]; _triangleCache.uvs[2] = _newTriangleCache.uvs[1]; _triangleCache.normals[2] = _newTriangleCache.normals[1]; _triangleCache.tangents[2] = _newTriangleCache.tangents[1]; // Doğru yöne bakıp bakmadığını kontrol eder. NormalCheck(ref _triangleCache); // Ekleme _leftSide.AddTriangle(_triangleCache, submesh); } }