Beispiel #1
0
static int
paint_window(ClientData UNUSED(clientData), Tcl_Interp *interp, int objc, Tcl_Obj *const *objv)
{
    struct isst_s *isst;
    Togl   *togl;
    double dt = 1.0;
    int glclrbts = GL_DEPTH_BUFFER_BIT;

    if (objc != 2) {
	Tcl_WrongNumArgs(interp, 1, objv, "pathName");
	return TCL_ERROR;
    }

    if (Togl_GetToglFromObj(interp, objv[1], &togl) != TCL_OK) {
	return TCL_ERROR;
    }

    isst = (struct isst_s *) Togl_GetClientData(togl);

    isst->t2 = bu_gettime();

    dt = isst->t2 - isst->t1;

    if (dt > 1e6*0.08 && isst->dirty) {
	isst->buffer_image.ind = 0;

	render_camera_prep(&isst->camera);
	render_camera_render(&isst->camera, isst->tie, &isst->tile, &isst->buffer_image);

	isst->t1 = bu_gettime();

	glClear(glclrbts);
	glLoadIdentity();
	glColor3f(1,1,1);
	glEnable(GL_TEXTURE_2D);
	glBindTexture(GL_TEXTURE_2D, isst->texid);
	glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, isst->camera.w, isst->camera.h, GL_RGB, GL_UNSIGNED_BYTE, isst->buffer_image.data + sizeof(camera_tile_t));
	glBegin(GL_TRIANGLE_STRIP);

	glTexCoord2d(0, 0); glVertex3f(0, 0, 0);
	glTexCoord2d(0, 1); glVertex3f(0, isst->h, 0);
	glTexCoord2d(1, 0); glVertex3f(isst->w, 0, 0);
	glTexCoord2d(1, 1); glVertex3f(isst->w, isst->h, 0);

	glEnd();

	isst->dirty = 0;

	Togl_SwapBuffers(togl);
    }
    return TCL_OK;
}
Beispiel #2
0
static int
draw(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const *objv)
{
    WHIRLYGIZMO *Wg;
    Togl   *togl;

    if (objc != 2) {
        Tcl_WrongNumArgs(interp, 1, objv, "pathName");
        return TCL_ERROR;
    }

    if (Togl_GetToglFromObj(interp, objv[1], &togl) != TCL_OK) {
        return TCL_ERROR;
    }

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    Wg = (WHIRLYGIZMO *) Togl_GetClientData(togl);
    glDisable(GL_TEXTURE_2D);
    glPushMatrix();
    glRotatef((float) Wg->Rotx, 1, 0, 0);
    glRotatef((float) Wg->Roty, 0, 1, 0);
    glRotatef((float) Wg->Rotz, 0, 0, 1);

    glPushMatrix();
    glTranslatef(-3, -2, 0);
    glRotatef((float) Wg->Angle, 0, 0, 1);
    glEnable(GL_DEPTH_TEST);
    glCallList(Wg->Gear1);
    glEnable(GL_DEPTH_TEST);
    glPopMatrix();

    glPushMatrix();
    glTranslatef(3.1f, -2, 0);
    glRotatef(-2 * (float) Wg->Angle - 9, 0, 0, 1);
    glCallList(Wg->Gear2);
    glPopMatrix();

    glPushMatrix();
    glTranslatef(-3.1f, 4.2f, 0);
    glRotatef(-2 * (float) Wg->Angle - 25, 0, 0, 1);
    glCallList(Wg->Gear3);
    glPopMatrix();

    glPopMatrix();

    Togl_SwapBuffers(togl);

    return TCL_OK;
}
Beispiel #3
0
/* 
 * Togl widget display callback.  This is called by Tcl/Tk when the widget's
 * contents have to be redrawn.  Typically, we clear the color and depth
 * buffers, render our objects, then swap the front/back color buffers.
 */
void
display_cb(Togl *togl)
{
    glClearIndex(black);
    glClear(GL_COLOR_BUFFER_BIT);

    glPushMatrix();
    glTranslatef(0.3, -0.3, 0.0);
    glRotatef(Angle, 0.0, 0.0, 1.0);
    glIndexi(red);
    glBegin(GL_TRIANGLES);
    glVertex2f(-0.5, -0.3);
    glVertex2f(0.5, -0.3);
    glVertex2f(0.0, 0.6);
    glEnd();
    glPopMatrix();

    glPushMatrix();
    glRotatef(Angle, 0.0, 0.0, 1.0);
    glIndexi(green);
    glBegin(GL_TRIANGLES);
    glVertex2f(-0.5, -0.3);
    glVertex2f(0.5, -0.3);
    glVertex2f(0.0, 0.6);
    glEnd();
    glPopMatrix();

    glPushMatrix();
    glTranslatef(-0.3, 0.3, 0.0);
    glRotatef(Angle, 0.0, 0.0, 1.0);
    glIndexi(blue);
    glBegin(GL_TRIANGLES);
    glVertex2f(-0.5, -0.3);
    glVertex2f(0.5, -0.3);
    glVertex2f(0.0, 0.6);
    glEnd();
    glPopMatrix();

    glFlush();
    Togl_SwapBuffers(togl);
}