Function:ns2texpoly3d
From S2PLOT
(Difference between revisions)
Revision as of 23:01, 7 January 2009 S2plot admin (Talk | contribs) ← Previous diff |
Current revision S2plot admin (Talk | contribs) |
||
Line 1: | Line 1: | ||
==ns2texpoly3d== | ==ns2texpoly3d== | ||
- | A textured polygon. | + | Draw a 3-d textured polygon. |
==Prototype== | ==Prototype== | ||
Line 9: | Line 9: | ||
==Description== | ==Description== | ||
- | A textured polygon. | + | Draw a 3-d textured polygon. The array iP holds the vertex coordinates, array iTC holds the texture coordinates, |
- | + | parameter <tt>in</tt> is the number of vertices, itrans is one of 'o' (opaque), 't' (transparent) or 's' (standard) and | |
+ | ialpha is the alpha channel value. | ||
==See Also== | ==See Also== | ||
<table> | <table> | ||
- | <tr><td>[[Function:ns2spheret |ns2spheret]]</td><td> Draw a textured sphere, with given centre, radius, colour and texture filename.</td></tr> | + | <tr><td>[[Function:ss2c3dt |ss2c3dt]]</td><td> Create an empty 3D texture.</td></tr> |
- | <tr><td>[[Function:ns2vspheret |ns2vspheret]]</td><td> Draw a textured sphere, with given centre, radius, colour and texture filename - vector input.</td></tr> | + | <tr><td>[[Function:ss2g3dt |ss2g3dt]]</td><td> Fetch the pointer to a 3d texture.</td></tr> |
<table> | <table> | ||
Line 20: | Line 21: | ||
<code><pre> | <code><pre> | ||
+ | #include <stdio.h> | ||
+ | #include <stdlib.h> | ||
+ | #include "s2plot.h" | ||
+ | |||
+ | unsigned int texid; /* 3D Texture ID */ | ||
+ | |||
+ | void cb(double *t, int *kc) | ||
+ | { | ||
+ | int nverts = 4; /* Number of vertices in polygon */ | ||
+ | char trans = 't'; /* 3d texture transparency */ | ||
+ | float alpha = 0.7; /* Alpha channel value */ | ||
+ | |||
+ | XYZ iP[4]; /* Array of polygon vertices */ | ||
+ | XYZ iTC[4]; /* Array of texture coordinates */ | ||
+ | static float texidx = 0.0; /* Current z-texture coordinate */ | ||
+ | |||
+ | iP[0].x = iP[3].x = -1.0; /* Define polygon vertices */ | ||
+ | iP[1].x = iP[2].x = +1.0; | ||
+ | iP[0].y = iP[1].y = +1.0; | ||
+ | iP[2].y = iP[3].y = -1.0; | ||
+ | iP[0].z = iP[1].z = iP[2].z = iP[3].z = texidx*2.0 - 1.0; | ||
+ | |||
+ | iTC[0].x = iTC[3].x = 0.0; /* Define texture coordinates */ | ||
+ | iTC[1].x = iTC[2].x = 1.0; | ||
+ | iTC[0].y = iTC[1].y = 1.0; | ||
+ | iTC[2].y = iTC[3].y = 0.0; | ||
+ | iTC[0].z = iTC[1].z = iTC[2].z = iTC[3].z = texidx; | ||
+ | |||
+ | COLOUR col = { 1,1,1 }; /* Draw the polygon boundaries */ | ||
+ | ns2vline(iP[0],iP[1],col); | ||
+ | ns2vline(iP[1],iP[2],col); | ||
+ | ns2vline(iP[2],iP[3],col); | ||
+ | ns2vline(iP[3],iP[0],col); | ||
+ | |||
+ | ns2texpoly3d(iP, iTC, nverts, texid, trans, alpha); /* Draw 3D texture */ | ||
+ | |||
+ | texidx += (1.0/320.0); /* Choose next z-texture coordinate */ | ||
+ | if (texidx > 1.0) texidx = 0.0; | ||
+ | } | ||
+ | |||
+ | int main(int argc, char *argv[]) | ||
+ | { | ||
+ | int Nx = 32, Ny = 32, Nz = 32; /* Texture dimensions */ | ||
+ | int w,h,d; /* Returned dimensions */ | ||
+ | |||
+ | s2opend("/?",argc,argv); /* Open the s2plot display device */ | ||
+ | s2swin(-1,1,-1,1,-1,1); /* Set the world coordinates */ | ||
+ | s2box("BCDET",0,0,"BCDET",0,0,"BCDET",0,0); | ||
+ | |||
+ | texid = ss2c3dt(Nx, Ny, Nz); /* Create a new 3d texture */ | ||
+ | unsigned char *bits = (unsigned char *)ss2g3dt(texid, &w, &h, &d); | ||
+ | /* Get the texture data for modification */ | ||
+ | int i, j, k; | ||
+ | long idx; | ||
+ | float x,y,z; | ||
+ | for (i=0;i<Nx;i++) { | ||
+ | x = -1.0 + i*(2.0/(float)(Nx-1)); | ||
+ | for (j=0;j<Ny;j++) { | ||
+ | y = -1.0 + j*(2.0/(float)(Ny-1)); | ||
+ | for (k=0;k<Nz;k++) { | ||
+ | z = -1.0 + k*(2.0/(float)(Nz-1)); | ||
+ | idx = ((i*Ny + j)*Nz + k)*4; | ||
+ | if ((x*x + y*y + z*z) < 1.0) { /* 3D solid red sphere */ | ||
+ | bits[idx + 1 ] = 255; | ||
+ | ns2point(x,y,z,1,1,1); /* Plot point in sphere */ | ||
+ | } else { | ||
+ | bits[idx + 0 ] = 0; | ||
+ | } | ||
+ | |||
+ | bits[idx + 1 ] = 0; /* Blue channel */ | ||
+ | bits[idx + 2 ] = 0; /* Green channel */ | ||
+ | bits[idx + 3 ] = 255; /* Alpha channel */ | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | |||
+ | fprintf(stderr, "3d texture IS %d x %d x %d\n", w, h, d); | ||
+ | ss2pt(texid); /* Push back the texture */ | ||
+ | |||
+ | cs2scb(cb); /* Install a dynamic callback */ | ||
+ | |||
+ | s2show(1); /* Display the geometry */ | ||
+ | |||
+ | return 0; | ||
+ | } | ||
</pre></code> | </pre></code> | ||
Current revision
ns2texpoly3d
Draw a 3-d textured polygon.
Prototype
void ns2texpoly3d(XYZ *iP, XYZ *iTC, float in, unsigned int texid, char itrans, float ialpha);
Description
Draw a 3-d textured polygon. The array iP holds the vertex coordinates, array iTC holds the texture coordinates, parameter in is the number of vertices, itrans is one of 'o' (opaque), 't' (transparent) or 's' (standard) and ialpha is the alpha channel value.
See Also
ss2c3dt | Create an empty 3D texture. |
ss2g3dt | Fetch the pointer to a 3d texture. |