void bp_camera_init (camera_t *camera) { COPY3 (camera->location, origin); COPY3 (camera->direction, z); COPY3 (camera->up, y); COPY3 (camera->sky, y); SMUL (camera->right, 4.0/3.0, x); }
bool CalculatePolygonNormalFlat(float* position, float* buffer, int bufferLength, int elementSize, int polygonVertices) { for (int i = 0; i < bufferLength; i += (elementSize * polygonVertices)) { float v1[3], v2[3], n[3], sum[] = {0.0f, 0.0f, 0.0f}; for (int j = 0; j < polygonVertices - 2; ++j) { float *p1 = &position[i], *p2 = &position[i + (j + 2) * elementSize], *p3 = &position[i + (j + 1) * elementSize]; MINUS3(p2, p1, v1); MINUS3(p3, p1, v2); CROSS3(v1, v2, n); normalize3(n); PLUS3(n, sum, sum); } for (int j = 0; j < polygonVertices; ++j) { COPY3(&buffer[i + j * elementSize], sum); } } return true; }
bool CalculateGridNormalFlat(float* position, float* buffer, int bufferLength, int elementSize) { if (elementSize < 3) { return false; } for (int i = 0; i < bufferLength; i += 4 * elementSize) { float *p1 = &position[i], *p2 = &position[i + elementSize], *p3 = &position[i + 2 * elementSize], *p4 = &position[i + 3 * elementSize]; float v1[3], v2[3], n1[3], n2[3], n1pn2[3]; //v1 = p2-p1 MINUS3(p2, p1, v1); MINUS3(p4, p1, v2); //n1 = v1 x v2 CROSS3(v1, v2, n1); MINUS3(p4, p1, v1); MINUS3(p3, p1, v2); CROSS3(v1, v2, n2); normalize3(n1); normalize3(n2); PLUS3(n1, n2, n1pn2); normalize3(n1pn2); COPY3(&buffer[i], n1pn2); COPY3(&buffer[i + elementSize], n1pn2); COPY3(&buffer[i + 2 * elementSize], n1pn2); COPY3(&buffer[i + 3 * elementSize], n1pn2); } return true; }
bool CalculateGridNormalSmooth(float* position, float* buffer, int bufferLength, int elementSize, int numX, int numY) { if (elementSize < 3) { return false; } for (int i = 0; i < bufferLength; i += 4 * elementSize) { float *p1 = &position[i], *p2 = &position[i + elementSize], *p3 = &position[i + 2 * elementSize], *p4 = &position[i + 3 * elementSize]; float v1[3], v2[3], n1[3], n2[3], n1pn2[3]; //v1 = p2-p1 MINUS3(p2, p1, v1); MINUS3(p4, p1, v2); //n1 = v1 x v2 CROSS3(v1, v2, n1); MINUS3(p4, p1, v1); MINUS3(p3, p1, v2); CROSS3(v1, v2, n2); normalize3(n1); normalize3(n2); PLUS3(n1, n2, n1pn2); normalize3(n1pn2); COPY3(&buffer[i], n1pn2); COPY3(&buffer[i + elementSize], n1); COPY3(&buffer[i + 2 * elementSize], n2); COPY3(&buffer[i + 3 * elementSize], n1pn2); } // average normals in x axis for (int i = 0; i < numX - 1; ++i) { for (int j = 0; j < numY - 2; ++j) { float sum[3]; float *p2, *p3, *pj0, *pj1; p2 = getGridNormal(buffer, numX, numY, elementSize, i, j, 2); p3 = getGridNormal(buffer, numX, numY, elementSize, i, j, 3); pj0 = getGridNormal(buffer, numX, numY, elementSize, i, j + 1, 0); pj1 = getGridNormal(buffer, numX, numY, elementSize, i, j + 1, 1); PLUS3(pj0, p2, sum); COPY3(p2, sum); COPY3(pj0, sum); PLUS3(pj1, p3, sum); COPY3(p3, sum); COPY3(pj1, sum); } } // average normals in y axis for (int j = 0; j < numY - 1; ++j) { for (int i = 0; i < numX - 2; ++i) { float sum[3]; float *p1, *p3, *pi0, *pi2; p1 = getGridNormal(buffer, numX, numY, elementSize, i, j, 1); p3 = getGridNormal(buffer, numX, numY, elementSize, i, j, 3); pi0 = getGridNormal(buffer, numX, numY, elementSize, i + 1, j, 0); pi2 = getGridNormal(buffer, numX, numY, elementSize, i + 1, j, 2); PLUS3(pi0, p1, sum); COPY3(p1, sum); COPY3(pi0, sum); PLUS3(pi2, p3, sum); COPY3(p3, sum); COPY3(pi2, sum); } } return true; }