int GetWrapedTable(int setSquare, int tempDir, int tableSize, int tableRows) { var tempSquare = (Math.Abs(tempDir) == 4) ? -1 * (int)Math.Sign(tempDir) : (Math.Abs(tempDir) % 5) * (int)Math.Sign(tempDir); if ((setSquare % tableRows) + tempSquare == -1 || (setSquare % tableRows) + tempSquare == tableRows) { tempSquare = (tableRows - 1) * ((((setSquare % tableRows) + tempSquare) == tableRows) ? -1 : 1); } setSquare += tempSquare; if (Math.Abs(tempDir) != 1 && Math.Abs(tempDir) != 0) { tempSquare = tableRows * (int)Math.Sign(tempDir); setSquare += tempSquare; } if (setSquare < 0) { setSquare = tableSize - Math.Abs(setSquare); } setSquare %= tableSize; return(setSquare); }
public static float Root3(float t) { const float pow = 1f / 3f; float sign = Mathf.Sign(t); float root = Mathf.Pow(sign * t, pow); return(sign * root); }
void Tick() { if (Event.current.type == EventType.Repaint) { float deltaTime = Time.realtimeSinceStartup - lastUpdate; // Right at the start of a transition the deltaTime will // not be reliable, so use a very small value instead // until the next repaint if (value == 0f || value == 1f) { deltaTime = 0.001f; } deltaTime = Mathf.Clamp(deltaTime, 0.00001F, 0.1F); // Larger regions fade slightly slower deltaTime /= Mathf.Sqrt(Mathf.Max(lastRect.height, 100)); lastUpdate = Time.realtimeSinceStartup; float targetValue = open ? 1F : 0F; if (!Mathf.Approximately(targetValue, value)) { value += deltaTime * animationSpeed * Mathf.Sign(targetValue - value); value = Mathf.Clamp01(value); editor.Repaint(); if (!fancyEffects) { value = targetValue; } } else { value = targetValue; } } }
public void WalkContour(int x, int z, int i, ushort[] flags, List <int> verts) { // Choose the first non-connected edge int dir = 0; while ((flags[i] & (ushort)(1 << dir)) == 0) { dir++; } int startDir = dir; int startI = i; int area = voxelArea.areaTypes[i]; int iter = 0; #if ASTARDEBUG Vector3 previousPos; Vector3 currentPos; previousPos = ConvertPos( x, 0, z ); Vector3 previousPos2 = ConvertPos( x, 0, z ); #endif while (iter++ < 40000) { //Are we facing a region edge if ((flags[i] & (ushort)(1 << dir)) != 0) { #if ASTARDEBUG Vector3 pos = ConvertPos(x, 0, z) + new Vector3((voxelArea.DirectionX[dir] != 0) ? Mathf.Sign(voxelArea.DirectionX[dir]) : 0, 0, (voxelArea.DirectionZ[dir]) != 0 ? Mathf.Sign(voxelArea.DirectionZ[dir]) : 0) * 0.6F; //int dir2 = (dir+1) & 0x3; //pos += new Vector3 ((voxelArea.DirectionX[dir2] != 0) ? Mathf.Sign(voxelArea.DirectionX[dir2]) : 0,0,(voxelArea.DirectionZ[dir2]) != 0 ? Mathf.Sign(voxelArea.DirectionZ[dir2]) : 0)*1.2F; //Debug.DrawLine (ConvertPos (x,0,z),pos,Color.cyan); Debug.DrawLine(previousPos2, pos, Color.blue); previousPos2 = pos; #endif //Choose the edge corner bool isBorderVertex = false; bool isAreaBorder = false; int px = x; int py = GetCornerHeight(x, z, i, dir, ref isBorderVertex); int pz = z; switch (dir) { case 0: pz += voxelArea.width;; break; case 1: px++; pz += voxelArea.width; break; case 2: px++; break; } /*case 1: px++; break; * case 2: px++; pz += voxelArea.width; break; * case 3: pz += voxelArea.width; break; */ int r = 0; CompactVoxelSpan s = voxelArea.compactSpans[i]; if (s.GetConnection(dir) != NotConnected) { int nx = x + voxelArea.DirectionX[dir]; int nz = z + voxelArea.DirectionZ[dir]; int ni = (int)voxelArea.compactCells[nx + nz].index + s.GetConnection(dir); r = (int)voxelArea.compactSpans[ni].reg; if (area != voxelArea.areaTypes[ni]) { isAreaBorder = true; } } if (isBorderVertex) { r |= RC_BORDER_VERTEX; } if (isAreaBorder) { r |= RC_AREA_BORDER; } verts.Add(px); verts.Add(py); verts.Add(pz); verts.Add(r); //Debug.DrawRay (previousPos,new Vector3 ((dir == 1 || dir == 2) ? 1 : 0, 0, (dir == 0 || dir == 1) ? 1 : 0),Color.cyan); flags[i] = (ushort)(flags[i] & ~(1 << dir)); // Remove visited edges dir = (dir + 1) & 0x3; // Rotate CW } else { int ni = -1; int nx = x + voxelArea.DirectionX[dir]; int nz = z + voxelArea.DirectionZ[dir]; CompactVoxelSpan s = voxelArea.compactSpans[i]; if (s.GetConnection(dir) != NotConnected) { CompactVoxelCell nc = voxelArea.compactCells[nx + nz]; ni = (int)nc.index + s.GetConnection(dir); } if (ni == -1) { Debug.LogWarning("Degenerate triangles might have been generated.\n" + "Usually this is not a problem, but if you have a static level, try to modify the graph settings slightly to avoid this edge case."); return; } x = nx; z = nz; i = ni; // & 0x3 is the same as % 4 (modulo 4) dir = (dir + 3) & 0x3; // Rotate CCW #if ASTARDEBUG currentPos = ConvertPos( x, 0, z ); Debug.DrawLine(previousPos + Vector3.up * 0, currentPos, Color.blue); previousPos = currentPos; #endif } if (startI == i && startDir == dir) { break; } } #if ASTARDEBUG Color col = new Color(Random.value, Random.value, Random.value); for (int q = 0, j = (verts.Count / 4) - 1; q < (verts.Count / 4); j = q, q++) { int i4 = q * 4; int j4 = j * 4; Vector3 p1 = ConvertPosWithoutOffset( verts[i4 + 0], verts[i4 + 1], verts[i4 + 2] ); Vector3 p2 = ConvertPosWithoutOffset( verts[j4 + 0], verts[j4 + 1], verts[j4 + 2] ); Debug.DrawLine(p1, p2, col); } #endif }
public static float SignedAngle(Vector2 from, Vector2 to) { float num = Vector2.Angle(from, to); float num2 = Mathf.Sign(from.x * to.y - from.y * to.x); return num * num2; }