⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gpsi_3d_lines.c

📁 操作系统SunOS 4.1.3版本的源码
💻 C
字号:
#ifndef lintstatic  char sccsid[] = "@(#)gpsi_3D_lines.c 1.1 92/07/30 Copyr 1990 Sun Micro";#endif/* * Copyright (c) 1990 by Sun Microsystems, Inc. */#include <stdio.h>#include <sdrtns.h>     /* sdrtns.h should always be included */#include <math.h>#include <pixrect/gp1cmds.h>#include <esd.h>#define BATCH_SIZE	1600extern struct vector Enterprise[];static Matrix_3D mat3d = {			    1.0, 0.0, 0.0, 0.0,			    0.0, 1.0, 0.0, 0.0,			    0.4, 0.2, 1.0, 0.0,			    0.0, 0.0, 0.0, 1.0			};static short textptr[3] = {10, 5, 0};/**********************************************************************/char *gpsi_3D_lines()/**********************************************************************/ {    char * enterprise();    char *vector_lissa();    char *shaded_vector_lissa();    char *centrics();    char *textured_hexnut();    char *errmsg;    double ri;    func_name = "gpsi_3D_lines";    TRACE_IN    /* clear all planes */    clear_all();    /* extract test images from tar file */    (void)xtract(GPSI_3D_LINES_CHK);    /* set context */    errmsg = ctx_set(0);    if (errmsg) {	TRACE_OUT	return(errmsg);    }    errmsg = centrics();    if (errmsg) {	TRACE_OUT	return(errmsg);    }    errmsg = chksum_verify(GPSI_3D_LINES_CHK);    if (errmsg) {	TRACE_OUT	return(errmsg);    }    (void)xtract(GPSI_3D_SHAD_LINES_CHK);    /* clear the 24-bit plane */    clear_24bit_plane();    ri = 8.5;    errmsg = shaded_vector_lissa(ri);    if (errmsg) {	TRACE_OUT	return(errmsg);    }    errmsg = chksum_verify(GPSI_3D_SHAD_LINES_CHK);    if (errmsg) {	TRACE_OUT	return(errmsg);    }    (void)xtract(GPSI_TEXTURED_LINES_CHK);    /* clear the 24-bit plane */    clear_24bit_plane();    errmsg = ctx_set(CTX_SET_HIDDEN_SURF, GP1_ZBALL,			CTX_SET_LINE_TEX, textptr, 0, 0,			CTX_SET_MAT_NUM, 1,			CTX_SET_MAT_3D, 1, &mat3d,			CTX_SET_DEPTH_CUE, GP1_DEPTH_CUE_ON,			CTX_SET_RGB_COLOR, 0x00ff00,			CTX_SET_LINE_WIDTH, 5, 0,    			0);    if (errmsg) {	TRACE_OUT	return errmsg;    }    errmsg = textured_hexnut();    if (errmsg) {	TRACE_OUT	return errmsg;    }    errmsg = chksum_verify(GPSI_TEXTURED_LINES_CHK);    TRACE_OUT    return(errmsg);}/**********************************************************************/char *enterprise()/**********************************************************************//* draws the space ship Enterprise */{    register struct vector *vptr;    register short *p;    register int i;    register short *ps;    int res;    func_name = "enterprise";    TRACE_IN    vptr = Enterprise;    /*    vptr = f15;    */    for(;;) {	p = allocbuf();	if (p == (short *)-1) {	    TRACE_OUT	    return (errmsg_list[52]);	}	*p++ = GP1_XF_LINE_FLT_3D;	for (i = 0 ; i < BATCH_SIZE ; i++) {	    ps = p;	    *p++ = vptr->ctrl_field;	    GP1_PUT_F(p, vptr->x);	    GP1_PUT_F(p, vptr->y);	    GP1_PUT_F(p, vptr->z);	    if (vptr->ctrl_field == 0x8000)		break;	    else		vptr++;	}	*ps = 0x8000;	res = postbuf(p);	if (res == -1) {	    TRACE_OUT	    return (errmsg_list[12]);	}	if (vptr->ctrl_field == 0x8000)	    break;    }    TRACE_OUT    return (char *)0;}/**********************************************************************/char *vector_lissa(inc)/**********************************************************************/double inc;/*draws lissajou figure with vector command */{    double cos();    double sin();    register double rd;    register int npts = 360;    register short *p;    register short *vp;    register int k;    float aux;    int res;    func_name = "vector_lissa";    TRACE_IN	rd = inc;	p = allocbuf();	if (p == (short *)-1) {	    TRACE_OUT	    return (errmsg_list[52]);	}	*p++ = GP1_XF_LINE_FLT_3D;	for (k = 0 ; k < npts ; k++) {	    vp = p;	    *p++ = 0x0;	    aux=(float)cos(rd);	    GP1_PUT_F(p, aux);	    aux=(float)sin(rd);	    GP1_PUT_F(p, aux);	    aux=(float)k/(float)npts;	    GP1_PUT_F(p, aux);	    rd += inc;	}	*vp =0x8000;	res = postbuf(p);	if (res == -1) {	    TRACE_OUT	    return (errmsg_list[12]);	}	TRACE_OUT	return (char *)0;}/**********************************************************************/char *dc_vector_lissa(inc)/**********************************************************************/double inc;/*draws lissajou figure with vector command */{        double cos();    double sin();    register double rd;    register int npts = 360;    register short *p;    register short *vp;    register int k;    float aux;    float ONE = 1.0;    float ZERO = 0.0;    int res;    func_name = "vector_lissa";    TRACE_IN	rd = inc;	p = allocbuf();	if (p == (short *)-1) {	    TRACE_OUT	    return (errmsg_list[52]);	}	*p++ = GP1_SET_DEPTH_CUE | GP1_DEPTH_CUE_ON;	*p++ = GP2_SET_RGB_COLOR | GP2_RGB_COLOR_TRIPLE;	GP1_PUT_F(p, ONE);	GP1_PUT_F(p, ONE);	GP1_PUT_F(p, ONE);	*p++ = GP2_SET_DEPTH_CUE_PARAMETERS;	GP1_PUT_F(p, ONE);   	GP1_PUT_F(p, ZERO);	GP1_PUT_F(p, ZERO);	GP1_PUT_F(p, ONE);	GP1_PUT_F(p, ZERO);	GP1_PUT_F(p, ZERO);	GP1_PUT_F(p, ZERO);	*p++ = GP1_XF_LINE_FLT_3D;	for (k = 0 ; k < npts ; k++) {	    vp = p;	    *p++ = 0x0;	    aux=(float)cos(rd);	    GP1_PUT_F(p, aux);	    aux=(float)sin(rd);	    GP1_PUT_F(p, aux);	    aux=(float)k/(float)npts;	    GP1_PUT_F(p, aux);	    rd += inc;	}	*vp =0x8000;	res = postbuf(p);	if (res == -1) {	    TRACE_OUT	    return (errmsg_list[12]);	}	TRACE_OUT	return (char *)0;}/**********************************************************************/char *shaded_vector_lissa(inc)/**********************************************************************/double inc;/*draws lissajou figure with vector command */{        register double rd;    register int npts = 360;    register short *p;    register short *vp;    register int k;    float r;    float g;    float b;    int res;    func_name = "shaded_vector_lissa";    TRACE_IN	rd = inc;	p = allocbuf();	if (p == (short *)-1) {	    TRACE_OUT	    return (errmsg_list[52]);	}	*p++ = GP2_XF_SHADE_LINE_FLT_3D;	for (k = 0 ; k < npts ; k++) {	    vp = p;	    *p++ = 0x0;	    r=(float)cos(rd);	    GP1_PUT_F(p, r);	    g=(float)sin(rd);	    GP1_PUT_F(p, g);	    b=(float)k/(float)npts;	    GP1_PUT_F(p, b);	    GP1_PUT_F(p, r);	    GP1_PUT_F(p, g);	    GP1_PUT_F(p, b);	    rd += inc;	}	*vp =0x8000;	res = postbuf(p);	if (res == -1) {	    TRACE_OUT	    return (errmsg_list[12]);	}	TRACE_OUT	return (char *)0;}/**********************************************************************/char *centrics()/**********************************************************************/{    extern char *centric_lines();    char *errmsg;    double cx;    double cy;    double length = 1.0;    func_name = "centrics";    TRACE_IN    /* set context */    errmsg = ctx_set(0);    if (errmsg) {	TRACE_OUT	return(errmsg);    }    cx = 0.0;    cy = 0.0;    errmsg = centric_lines(cx, cy, length);    if (errmsg) {	TRACE_OUT	return(errmsg);    }    /* set context */    errmsg = ctx_set(CTX_SET_RGB_COLOR, 0x0000ff, 0);    if (errmsg) {	TRACE_OUT	return(errmsg);    }    cx = -0.5;    cy = 0.5;    errmsg = centric_lines(cx, cy, length);    if (errmsg) {	TRACE_OUT	return(errmsg);    }    /* set context */    errmsg = ctx_set(CTX_SET_RGB_COLOR, 0x00ff00, 0);    if (errmsg) {	TRACE_OUT	return(errmsg);    }    cx = 0.5;    cy = 0.5;    errmsg = centric_lines(cx, cy, length);    if (errmsg) {	TRACE_OUT	return(errmsg);    }    /* set context */    errmsg = ctx_set(CTX_SET_RGB_COLOR, 0xff0000, 0);    if (errmsg) {	TRACE_OUT	return(errmsg);    }    cx = 0.5;    cy = -0.5;    errmsg = centric_lines(cx, cy, length);    if (errmsg) {	TRACE_OUT	return(errmsg);    }    /* set context */    errmsg = ctx_set(CTX_SET_RGB_COLOR, 0x00ffff, 0);    if (errmsg) {	TRACE_OUT	return(errmsg);    }    cx = -0.5;    cy = -0.5;    errmsg = centric_lines(cx, cy, length);    if (errmsg) {	TRACE_OUT	return(errmsg);    }    TRACE_OUT    return (char *) 0;}/**********************************************************************/char *centric_lines(cx, cy, length)/**********************************************************************/double cx;double cy;double length;{        register double angl;    register double inc;    register short *p;    register short *vp;    register int i;    int n;    int res;    float x1;    float x2;    float y1;    float y2;    float aux;    func_name = "centric_lines";    TRACE_IN    p = allocbuf();    if (p == (short *)-1) {	TRACE_OUT	return (errmsg_list[52]);    }    *p++ = GP1_XF_LINE_FLT_3D;    n = 720;    inc = M_PI/(double)(n/2);    angl = 0.0;    for (i = 0 ; i < n ; i++) {	(void)centric_line_coord(angl, length, cx, cy, &x1, &y1, &x2, &y2);	*p++ = 0x1;	GP1_PUT_F(p, x1);	GP1_PUT_F(p, y1);	aux = (float)n;	GP1_PUT_F(p, aux);	vp = p;	*p++ = 0x0;	GP1_PUT_F(p, x2);	GP1_PUT_F(p, y2);	GP1_PUT_F(p, aux);	angl += inc;    }    *vp =0x8000;    res = postbuf(p);    if (res == -1) {	TRACE_OUT	return (errmsg_list[12]);    }    TRACE_OUT    return (char *)0;}/**********************************************************************/centric_line_coord(angl, length, centerx, centery, x1, y1, x2, y2)/**********************************************************************/double angl;double centerx;double centery;double length;register float *x1;register float *y1;register float *x2;register float *y2;{    register double l = length/2.0;    func_name = "centric_line_coord";    TRACE_IN    *x1 = l*cos(angl) + centerx;    *y1 = l*sin(angl) + centery;    *x2 = 2.0*centerx - *x1;    *y2 = 2.0*centery - *y1;    TRACE_OUT}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -