public void removeTriangle(Triangle t) { triangleData.Remove(t); }
public void addTriangle(Triangle newTriangle) { newTriangle.parent=this; triangleData.Add(newTriangle); dirty=true; }
public void Render(Triangle tri) { if (!ready) return; if (tri.parent == null) return; if ((mode & W) != 0) { drawWireframe(tri, color); if ((mode & W) == 0) return; } p1 = tri.p1; p2 = tri.p2; p3 = tri.p3; if (p1.Y > p2.Y) { tempVertex = p1; p1 = p2; p2 = tempVertex; } if (p2.Y > p3.Y) { tempVertex = p2; p2 = p3; p3 = tempVertex; } if (p1.Y > p2.Y) { tempVertex = p1; p1 = p2; p2 = tempVertex; } if (p1.Y >= height) return; if (p3.Y < 0) return; if (p1.Y == p3.Y) return; if (mode == F) { lutID = (int) (tri.n2.X * 127 + 127) + ((int) (tri.n2.Y * 127 + 127) << 8); c = ColorUtility.multiply(color, diffuse[lutID]); s = ColorUtility.scale(specular[lutID], reflectivity); currentColor = ColorUtility.add(c, s); } currentId = (tri.parent.id << 16) | tri.id; x1 = p1.X << 8; x2 = p2.X << 8; x3 = p3.X << 8; y1 = p1.Y; y2 = p2.Y; y3 = p3.Y; x4 = x1 + (x3 - x1) * (y2 - y1) / (y3 - y1); x1 <<= 8; x2 <<= 8; x3 <<= 8; x4 <<= 8; z1 = p1.Z; z2 = p2.Z; z3 = p3.Z; nx1 = p1.nx << 16; nx2 = p2.nx << 16; nx3 = p3.nx << 16; ny1 = p1.ny << 16; ny2 = p2.ny << 16; ny3 = p3.ny << 16; tx1 = p1.tx << 16; tx2 = p2.tx << 16; tx3 = p3.tx << 16; ty1 = p1.ty << 16; ty2 = p2.ty << 16; ty3 = p3.ty << 16; dx = (x4 - x2) >> 16; if (dx == 0) return; temp = 256 * (y2 - y1) / (y3 - y1); z4 = z1 + ((z3 - z1) >> 8) * temp; nx4 = nx1 + ((nx3 - nx1) >> 8) * temp; ny4 = ny1 + ((ny3 - ny1) >> 8) * temp; tx4 = tx1 + ((tx3 - tx1) >> 8) * temp; ty4 = ty1 + ((ty3 - ty1) >> 8) * temp; dz = (z4 - z2) / dx; dnx = (nx4 - nx2) / dx; dny = (ny4 - ny2) / dx; dtx = (tx4 - tx2) / dx; dty = (ty4 - ty2) / dx; if (dx < 0) { temp = x2; x2 = x4; x4 = temp; z2 = z4; tx2 = tx4; ty2 = ty4; nx2 = nx4; ny2 = ny4; } if (y2 >= 0) { dy = y2 - y1; if (dy != 0) { dxL = (x2 - x1) / dy; dxR = (x4 - x1) / dy; dzBase = (z2 - z1) / dy; dnxBase = (nx2 - nx1) / dy; dnyBase = (ny2 - ny1) / dy; dtxBase = (tx2 - tx1) / dy; dtyBase = (ty2 - ty1) / dy; } xBase = x1; xMax = x1; zBase = z1; nxBase = nx1; nyBase = ny1; txBase = tx1; tyBase = ty1; if (y1 < 0) { xBase -= y1 * dxL; xMax -= y1 * dxR; zBase -= y1 * dzBase; nxBase -= y1 * dnxBase; nyBase -= y1 * dnyBase; txBase -= y1 * dtxBase; tyBase -= y1 * dtyBase; y1 = 0; } y2 = (y2 < height) ? y2 : height; offset = y1 * width; for (y = y1; y < y2; y++) renderLine(); } if (y2 < height) { dy = y3 - y2; if (dy != 0) { dxL = (x3 - x2) / dy; dxR = (x3 - x4) / dy; dzBase = (z3 - z2) / dy; dnxBase = (nx3 - nx2) / dy; dnyBase = (ny3 - ny2) / dy; dtxBase = (tx3 - tx2) / dy; dtyBase = (ty3 - ty2) / dy; } xBase = x2; xMax = x4; zBase = z2; nxBase = nx2; nyBase = ny2; txBase = tx2; tyBase = ty2; if (y2 < 0) { xBase -= y2 * dxL; xMax -= y2 * dxR; zBase -= y2 * dzBase; nxBase -= y2 * dnxBase; nyBase -= y2 * dnyBase; txBase -= y2 * dtxBase; tyBase -= y2 * dtyBase; y2 = 0; } y3 = (y3 < height) ? y3 : height; offset = y2 * width; for (y = y2; y < y3; y++) renderLine(); } }
private void drawWireframe(Triangle tri, uint defaultcolor) { drawLine(tri.p1, tri.p2, defaultcolor); drawLine(tri.p2, tri.p3, defaultcolor); drawLine(tri.p3, tri.p1, defaultcolor); }
void drawWireframe(Triangle tri, uint defaultcolor) { drawLine(tri.p1, tri.p2, defaultcolor); drawLine(tri.p2, tri.p3, defaultcolor); drawLine(tri.p3, tri.p1, defaultcolor); }
/// <summary> /// Registers a neighbor triangle /// </summary> /// <param name="triangle"></param> public void registerNeighbor(Triangle triangle) { if (!neighbor.Contains(triangle)) neighbor.Add(triangle); }
public void Render(Triangle tri) { if (!ready) { return; } if (tri.getParent() == null) { return; } if ((mode & Wireframe) != 0) { drawWireframe(tri, color); if ((mode & Wireframe) == 0) { return; } } p1 = tri.p1; p2 = tri.p2; p3 = tri.p3; if (p1.Y > p2.Y) { tempVertex = p1; p1 = p2; p2 = tempVertex; } if (p2.Y > p3.Y) { tempVertex = p2; p2 = p3; p3 = tempVertex; } if (p1.Y > p2.Y) { tempVertex = p1; p1 = p2; p2 = tempVertex; } if (p1.Y >= height) { return; } if (p3.Y < 0) { return; } if (p1.Y == p3.Y) { return; } if (mode == Flat) { lutID = (int)(tri.n2.X * 127 + 127) + ((int)(tri.n2.Y * 127 + 127) << 8); c = ColorUtility.multiply(color, diffuse[lutID]); s = ColorUtility.scale(specular[lutID], reflectivity); currentColor = ColorUtility.add(c, s); } currentId = (tri.getParent().id << 16) | tri.id; x1 = p1.X << 8; x2 = p2.X << 8; x3 = p3.X << 8; y1 = p1.Y; y2 = p2.Y; y3 = p3.Y; x4 = x1 + (x3 - x1) * (y2 - y1) / (y3 - y1); x1 <<= 8; x2 <<= 8; x3 <<= 8; x4 <<= 8; z1 = p1.Z; z2 = p2.Z; z3 = p3.Z; nx1 = p1.nx << 16; nx2 = p2.nx << 16; nx3 = p3.nx << 16; ny1 = p1.ny << 16; ny2 = p2.ny << 16; ny3 = p3.ny << 16; tx1 = p1.tx << 16; tx2 = p2.tx << 16; tx3 = p3.tx << 16; ty1 = p1.ty << 16; ty2 = p2.ty << 16; ty3 = p3.ty << 16; dx = (x4 - x2) >> 16; if (dx == 0) { return; } temp = 256 * (y2 - y1) / (y3 - y1); z4 = z1 + ((z3 - z1) >> 8) * temp; nx4 = nx1 + ((nx3 - nx1) >> 8) * temp; ny4 = ny1 + ((ny3 - ny1) >> 8) * temp; tx4 = tx1 + ((tx3 - tx1) >> 8) * temp; ty4 = ty1 + ((ty3 - ty1) >> 8) * temp; dz = (z4 - z2) / dx; dnx = (nx4 - nx2) / dx; dny = (ny4 - ny2) / dx; dtx = (tx4 - tx2) / dx; dty = (ty4 - ty2) / dx; if (dx < 0) { temp = x2; x2 = x4; x4 = temp; z2 = z4; tx2 = tx4; ty2 = ty4; nx2 = nx4; ny2 = ny4; } if (y2 >= 0) { dy = y2 - y1; if (dy != 0) { dxL = (x2 - x1) / dy; dxR = (x4 - x1) / dy; dzBase = (z2 - z1) / dy; dnxBase = (nx2 - nx1) / dy; dnyBase = (ny2 - ny1) / dy; dtxBase = (tx2 - tx1) / dy; dtyBase = (ty2 - ty1) / dy; } xBase = x1; xMax = x1; zBase = z1; nxBase = nx1; nyBase = ny1; txBase = tx1; tyBase = ty1; if (y1 < 0) { xBase -= y1 * dxL; xMax -= y1 * dxR; zBase -= y1 * dzBase; nxBase -= y1 * dnxBase; nyBase -= y1 * dnyBase; txBase -= y1 * dtxBase; tyBase -= y1 * dtyBase; y1 = 0; } y2 = (y2 < height) ? y2 : height; offset = y1 * width; for (y = y1; y < y2; y++) { renderLine(); } } if (y2 < height) { dy = y3 - y2; if (dy != 0) { dxL = (x3 - x2) / dy; dxR = (x3 - x4) / dy; dzBase = (z3 - z2) / dy; dnxBase = (nx3 - nx2) / dy; dnyBase = (ny3 - ny2) / dy; dtxBase = (tx3 - tx2) / dy; dtyBase = (ty3 - ty2) / dy; } xBase = x2; xMax = x4; zBase = z2; nxBase = nx2; nyBase = ny2; txBase = tx2; tyBase = ty2; if (y2 < 0) { xBase -= y2 * dxL; xMax -= y2 * dxR; zBase -= y2 * dzBase; nxBase -= y2 * dnxBase; nyBase -= y2 * dnyBase; txBase -= y2 * dtxBase; tyBase -= y2 * dtyBase; y2 = 0; } y3 = (y3 < height) ? y3 : height; offset = y2 * width; for (y = y2; y < y3; y++) { renderLine(); } } }
private Triangle[] sortTriangles(Triangle[] tri, int L, int R) { float m = (tri[L].dist + tri[R].dist) / 2; int i = L; int j = R; Triangle temp; do { while (tri[i].dist > m) i++; while (tri[j].dist < m) j--; if (i <= j) { temp = tri[i]; tri[i] = tri[j]; tri[j] = temp; i++; j--; } } while (j >= i); if (L < j) sortTriangles(tri, L, j); if (R > i) sortTriangles(tri, i, R); return tri; }
private Triangle[] getTransparentQueue() { if (transparentQueue.Count == 0) return null; Triangle[] tri = new Triangle[transparentQueue.Count]; transparentQueue.CopyTo(tri); return sortTriangles(tri, 0, tri.Length - 1); }
private Triangle[] getOpaqueQueue() { if (opaqueQueue.Count == 0) return null; Triangle[] tri = new Triangle[opaqueQueue.Count]; opaqueQueue.CopyTo(tri); return sortTriangles(tri, 0, tri.Length - 1); }
private void enqueueTriangle(Triangle tri) { if (tri.parent.material == null) return; if (tri.visible == false) return; if ((tri.parent.material.transparency == 255) && (tri.parent.material.reflectivity == 0)) return; if (tri.parent.material.transparency > 0) transparentQueue.Add(tri); else opaqueQueue.Add(tri); }