Exemplo n.º 1
0
Point3f vectNormalize(Point3f a)
{
    float len2 = a.x * a.x + a.y * a.y + a.z * a.z;
    if (len2 <= 0)
        return (Point3f) { 0, 0, 0 };
    return vectDiv(a, sqrtf(len2));
}
Exemplo n.º 2
0
void captureOctTree(Point3f camera, Point3f target, Point3f up, int width, int height, float *data)
{
    //normalize vectors
    target = vectNormalize(target);
    up = vectNormalize(up);

    Point3f right = vectNormalize(vectMul(target, up));
    Point3f relative_up = vectNormalize(vectMul(right, camera_target));

    target = vectDiv(target, tanf(AOV / 2.f));
    Point3f bottom_left_vec = vectSum(target, vectDiv(relative_up, -2), vectDiv(right, -2));

    Point3f dright = vectDiv(right, (float)width);
    Point3f dup = vectDiv(relative_up, (float)height);

    cl_int status;

    status = clEnqueueAcquireGLObjects(queue, 1, &image, 0, NULL, NULL);
    check_cl(status, "enqueue gl");

    // find the camera
    Point3f origin = camera;
    OctTreeNode *tree = mainOctTree;
    int dx, dy, dz;
    float radius = 1.f;
    Point3f center = (Point3f) { 0.f, 0.f, 0.f };
    Point3f local = vectMulScalar(origin, center, -1);
    cl_int offset = 0;
    while (tree->type >= 0) {
        dx = local.x > 0;
        dy = local.y > 0;
        dz = local.z > 0;
        offset = tree->nodes[dx][dy][dz];
        tree = mainOctTree + offset;

        radius /= 2.f;
        center = (Point3f) {
            center.x + (2 * dx - 1) * radius,
            center.y + (2 * dy - 1) * radius,
            center.z + (2 * dz - 1) * radius
        };

        local = vectMulScalar(origin, center, -1);
    }

    Point3f camera111 = vectMulScalar(origin, (Point3f) { 1.f, 1.f, 1.f }, 1.f);
    Point3f light111 = vectMulScalar(light, (Point3f) { 1.f, 1.f, 1.f }, 1.f);

    // cl_float3 is bigger than Point3f but we're only passing stack-allocated stuff, so reading garbage is safe
    status = clSetKernelArg(kernel, 0, sizeof(cl_float3), &camera111);
    check_cl(status, "set arg 0");
    status = clSetKernelArg(kernel, 1, sizeof(cl_float3), &light111);
    check_cl(status, "set arg 1");
    status = clSetKernelArg(kernel, 2, sizeof(cl_float3), &bottom_left_vec);
    check_cl(status, "set arg 2");
    status = clSetKernelArg(kernel, 3, sizeof(cl_float3), &dup);
    check_cl(status, "set arg 3");
    status = clSetKernelArg(kernel, 4, sizeof(cl_float3), &dright);
    check_cl(status, "set arg 4");
    status = clSetKernelArg(kernel, 5, sizeof(cl_mem), &mainOctCL);
    check_cl(status, "set arg 5");
    status = clSetKernelArg(kernel, 6, sizeof(cl_mem), &image);
    check_cl(status, "set arg 6");
    status = clSetKernelArg(kernel, 7, sizeof(cl_int), &offset);
    check_cl(status, "set arg 7");

    // run kernel
    size_t global_work_size[] = {width, height};
    size_t local_work_size[] = {8, 8};
    status = clEnqueueNDRangeKernel(queue, kernel, 2, NULL, global_work_size, local_work_size, 0, NULL, NULL);
    check_cl(status, "enqueue kernel");

    status = clEnqueueReleaseGLObjects(queue, 1, &image, 0, NULL, NULL);
    check_cl(status, "release gl");

    status = clFinish(queue);
    check_cl(status, "finish");

    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
    glClear(GL_COLOR_BUFFER_BIT);
    glEnable(GL_TEXTURE_2D);
    glBindTexture(GL_TEXTURE_2D, texture);

    glBegin(GL_QUADS);
    glTexCoord2i(0, 1);
    glVertex2f(-1, 1.0f);
    glTexCoord2i(1, 1);
    glVertex2f(1.0f, 1.0f);
    glTexCoord2i(1, 0);
    glVertex2f(1.0f, -1.f);
    glTexCoord2i(0, 0);
    glVertex2f(-1, -1.f);
    glEnd();
    glDisable(GL_TEXTURE_2D);
    glFinish();
}
Exemplo n.º 3
0
int main (int argc, const char * argv[])
{
    printf("Hello, World!\n");
    printf("\n    MVector Version %d Test Harness\n\n",MVECTOR_VERSION_NUM);
    
    VectorH a;
    VectorH b;
    VectorH c;
    VectorH ans;
    double dans;
    
    a = vectCreate(1,2,3);
    b = vectCreate(4,5,6);
    if(vectEquals(a, a)){
        printf("vectEquals: Test passed\n");
    }else{
        printf("vectEquals: Test Failed\n");
        exit(0);
    }
    
    if(vectNotEqual(a, b)){
        printf("vectNotEqual: Test passed\n");
    }else{
        printf("vectNotEqual: Test Failed\n");
        exit(0);
    }
       
    c = vectAdd(a, b);
    ans = vectCreate(5, 7, 9);
    if(vectEquals(c, ans)){
        printf("vectEquals: Test passed\n");
    }else{
        printf("vectEquals: Test Failed\n");
        exit(0);
    }

    ans = vectCreate(11, 12, 13);
    c = vectAddScaler(a, 10);
    if(vectEquals(c, ans)){
        printf("vectAddScaler: Test passed\n");
    }else{
        printf("vectAddScaler: Test Failed\n");
        exit(0);
    }
    
    ans = vectCreate(3, 3, 3);
    c = vectSub(b, a);
    if(vectEquals(c, ans)){
        printf("vectSub: Test passed\n");
    }else{
        printf("vectSub: Test Failed\n");
        exit(0);
    }
    
    ans = vectCreate(2, 3, 4);
    c = vectSubScaler(b, 2);
    if(vectEquals(c, ans)){
        printf("vectSubScaler: Test passed\n");
    }else{
        printf("vectSubScaler: Test Failed\n");
        exit(0);
    }
    
    ans = vectCreate(8, 10, 12);
    c = vectMult(b, 2);
    if(vectEquals(c, ans)){
        printf("vectMult: Test passed\n");
    }else{
        printf("vectMult: Test Failed\n");
        exit(0);
    }
    
    ans = vectDiv(ans, 2);
    if(vectEquals(b, ans)){
        printf("vectDiv: Test passed\n");
    }else{
        printf("vectDiv: Test Failed\n");
        exit(0);
    }
    
    ans = vectCreate(-1, -2, -3);
    c = vectMinus(a);
    if(vectEquals(c, ans)){
        printf("vectMinus: Test passed\n");
    }else{
        printf("vectMinus: Test Failed\n");
        exit(0);
    }
    
    dans = sqrt(4*4+5*5+6*6);
    if ( vectMag(b) == dans){
        printf("vectMag: Test passed\n");
    }else{
        printf("vectMag: Test Failed\n");
        exit(0);
    }

    ans = vectDiv(b, dans);
    c = vectNorm(b);
    if(vectEquals(c,ans)){
        printf("vectNorm: Test passed\n");
    }else{
        printf("vectNorm: Test Failed\n");
        exit(0);
    }
    
    dans = b.x*a.x + a.y*b.y + a.z*b.z;
    if(vectDot(a, b) == dans){
        printf("vectDot: Test passed\n");
    }else{
        printf("vectDot: Test Failed\n");
        exit(0);
    }
    
    a=vectCreate(1, 0, 0);
    b=vectCreate(0, 1, 0);
    ans = vectCreate(0, 0, 1);
    c = vectCross(a, b);
    if(vectEquals(c, ans)){
        printf("vectCross: Test passed\n");
    }else{
        printf("vectCross: Test Failed\n");
        exit(0);
    }
    
    c = vectRotatex(ans, -1*PI/2);
    if(vectEquals(c, b)){
        printf("vectRotatex: Test passed\n");
    }else{
        printf("vectRotatex: Test Failed\n");
        exit(0);
    }    
    
    ans = vectCreate(0, 0, 1);
    c = vectRotatey(a, -PI/2);
    if(vectEquals(c, ans)){
        printf("vectRotatey: Test passed\n");
    }else{
        printf("vectRotatey: Test Failed\n");
        exit(0);
    } 
    
    c = vectRotatez(a, PI/2);
    if(vectEquals(c, b)){
        printf("vectRotatez: Test passed\n");
    }else{
        printf("vectRotatez: Test Failed\n");
        exit(0);
    } 
    
    c = vectRotateAxis(a, ans, PI/2);
    if(vectEquals(c, b)){
        printf("vectRotateAxis: Test passed\n");
    }else{
        printf("vectRotateAxis: Test Failed\n");
        exit(0);
    } 
    
    return 0;
}