Function:cs2srcb
From S2PLOT
(Difference between revisions)
Revision as of 22:07, 7 January 2009 S2plot admin (Talk | contribs) ← Previous diff |
Current revision S2plot admin (Talk | contribs) |
||
Line 7: | Line 7: | ||
==Description== | ==Description== | ||
- | Register function that is called when remote control data comes in eg. from is2remote running on a wireless iPod touch. This function can consume the event (by returning 1) to prevent further (built-in) handling by S2PLOT. | + | Register function that is called when remote control data comes in. This function can consume the event (by returning 1) to prevent further (built-in) handling by S2PLOT. |
==See Also== | ==See Also== | ||
<table> | <table> | ||
- | <tr><td>[[Functioncs2socb |cs2socb]]</td><td>Register function that will draw direct OpenGL graphics when called.</td></tr> | + | <tr><td>[[Function:cs2socb |cs2socb]]</td><td>Register function that will draw direct OpenGL graphics when called.</td></tr> |
+ | <tr><td>[[Function:s2ldev |s2ldev]]</td><td>List the available S2PLOT devices on stdout.</td></tr> | ||
<tr><td>[[Function:s2disp |s2disp]]</td><td>Draw the scene, but return control when a timeout occurs or when shift-ENTER is pressed.</td></tr> | <tr><td>[[Function:s2disp |s2disp]]</td><td>Draw the scene, but return control when a timeout occurs or when shift-ENTER is pressed.</td></tr> | ||
<tr><td>[[Function:s2show | s2show ]]</td><td>Draw the scene and enter interactive mode if interactive is non-zero. </td></tr> | <tr><td>[[Function:s2show | s2show ]]</td><td>Draw the scene and enter interactive mode if interactive is non-zero. </td></tr> | ||
Line 17: | Line 18: | ||
==Sample Code== | ==Sample Code== | ||
+ | |||
+ | Some additional steps are required to get the remote callback to function. After you have compiled the sample code, you will need to follow these steps: | ||
+ | |||
+ | 1. In the terminal/shell you are planning to run the executable in (cs2srcb), type | ||
<code><pre> | <code><pre> | ||
+ | setenv S2PLOT_REMOTEPORT 3333 | ||
</pre></code> | </pre></code> | ||
+ | Note that you can use another port number instead of 3333 if required. | ||
- | [[S2PLOT:Function List | Back]] to S2PLOT function list. | + | 2. Run the code |
+ | 3. In another terminal/shell type the following: | ||
+ | <code><pre> | ||
+ | telnet localhost 3333 | ||
+ | S2 setcolor 0.9,0.1,0.5 | ||
+ | </pre></code> | ||
+ | 4. The polygon/billboard should now change colour. | ||
- | __NOTOC__ | + | 5. Quitting the executable (shift-Q) should close the terminal session. |
- | __NOEDITSECTION__ | + | |
+ | <code><pre> | ||
+ | #include <stdio.h> | ||
+ | #include <stdlib.h> | ||
+ | #include <time.h> | ||
+ | #include <string.h> | ||
+ | #include "s2plot.h" | ||
- | Back to [[Function:Template | template]] page. | + | unsigned int tid; |
+ | |||
+ | float _bb_r, _bb_g, _bb_b; | ||
+ | |||
+ | int remote_cb(char *data); | ||
+ | void cb(double *t, int *kc); | ||
+ | |||
+ | int main(int argc, char *argv[]) | ||
+ | { | ||
+ | int width = 16, height = 16; /* Dimensions of texture */ | ||
+ | int i, j; /* Loop variables */ | ||
+ | int idx; /* Index into texture array */ | ||
+ | unsigned char *tex; /* Array of texture values */ | ||
+ | |||
+ | srand48((long)time(NULL)); /* Seed random numbers */ | ||
+ | |||
+ | s2opend("/?",argc,argv); /* Open the display */ | ||
+ | s2svp(-1.0,1.0, -1.0,1.0, -1.0,1.0); /* Set the viewport coords */ | ||
+ | s2swin(-1.0,1.0, -1.0,1.0, -1.0,1.0); /* Set the window coordinates */ | ||
+ | s2box("BCDE",0,0,"BCDE",0,0,"BCDE",0,0); /* Draw a bounding box */ | ||
+ | |||
+ | tid = ss2ct(width, height); /* Create a new texture */ | ||
+ | tex = ss2gt(tid, &width, &height); /* Get the texture */ | ||
+ | |||
+ | for (j=0;j<height;j++) { | ||
+ | for (i=0;i<width;i++) { | ||
+ | idx = (j*width + i) * 4; /* Stored as (r,g,b,alpha) */ | ||
+ | tex[idx ] = 255; /* solid red */ | ||
+ | tex[idx+1] = 255; /* Green */ | ||
+ | tex[idx+2] = 255; /* Blue */ | ||
+ | tex[idx+3] = 127 * drand48()+128; /* Random transparency */ | ||
+ | } | ||
+ | } | ||
+ | ss2pt(tid); /* Push texture for usage */ | ||
+ | |||
+ | _bb_g = 0.7; | ||
+ | _bb_b = 0.9; | ||
+ | |||
+ | cs2scb(&cb); /* Install a callback */ | ||
+ | cs2srcb(&remote_cb); /* Install remote callback */ | ||
+ | |||
+ | s2show(1); /* Open the s2plot window */ | ||
+ | |||
+ | return 1; | ||
+ | } | ||
+ | |||
+ | void cb(double *t, int *kc) | ||
+ | { | ||
+ | float x = 0.0, y = 0.3, z = 0.4; /* Location */ | ||
+ | float isize = 0.02; /* Texture scale */ | ||
+ | float str_x = 0.0, str_y = 0.0, str_z = 0.0; /* No stretch */ | ||
+ | float alpha = 0.9; /* Alpha channel */ | ||
+ | char trans = 't'; /* Transparency */ | ||
+ | |||
+ | ds2bb(x,y,z, str_x,str_y,str_z, isize, _bb_r, _bb_g, _bb_b, tid, alpha, trans); | ||
+ | /* Draw the billboard */ | ||
+ | } | ||
+ | |||
+ | int remote_cb(char *data) { | ||
+ | // this remote callback will receive strings coming in on | ||
+ | // the S2PLOT_REMOTEPORT port. | ||
+ | |||
+ | char *contype, *ctype, *cargs; | ||
+ | |||
+ | contype = strtok(data, " "); | ||
+ | |||
+ | // for this demo, we will only parse commands preceded by "S2" | ||
+ | if (!contype || strcmp(contype, "S2")) { | ||
+ | // return 0 to indicate we have not "consumed" this event | ||
+ | fprintf(stderr, "remote_cb: no valid command prefix\n"); | ||
+ | return 0; | ||
+ | } | ||
+ | |||
+ | ctype = strtok(NULL, " "); | ||
+ | if (!ctype) { | ||
+ | fprintf(stderr, "remote_cb: no command present\n"); | ||
+ | return 0; | ||
+ | } | ||
+ | |||
+ | int consumed = 0; | ||
+ | |||
+ | // the only command we accept is "setcolor" to set the | ||
+ | // billboard color | ||
+ | if (!strcmp(ctype, "setcolor")) { | ||
+ | cargs = strtok(NULL, " "); | ||
+ | if (!cargs) { | ||
+ | fprintf(stderr, "remote_cb: no argument for setcolor present\n"); | ||
+ | return 0; | ||
+ | } | ||
+ | float vr, vg, vb; | ||
+ | sscanf(cargs, "%f,%f,%f", &vr, &vg, &vb); | ||
+ | |||
+ | if ((vr >= 0.) && (vr <= 1.) && | ||
+ | (vg >= 0.) && (vg <= 1.) && | ||
+ | (vb >= 0.) && (vb <= 1.)) { | ||
+ | _bb_r = vr; | ||
+ | _bb_g = vg; | ||
+ | _bb_b = vb; | ||
+ | } | ||
+ | |||
+ | |||
+ | consumed = 1; | ||
+ | } else { | ||
+ | fprintf(stderr, "remote_cb: unknown command %s\n", ctype); | ||
+ | } | ||
+ | |||
+ | return consumed; | ||
+ | } | ||
+ | </pre></code> | ||
+ | |||
+ | [[S2PLOT:Function List | Back]] to S2PLOT function list. | ||
+ | |||
+ | __NOTOC__ | ||
+ | __NOEDITSECTION__ |
Current revision
cs2srcb
Register when remote control data is received.
Prototype
void cs2srcb(void *remcb);
Description
Register function that is called when remote control data comes in. This function can consume the event (by returning 1) to prevent further (built-in) handling by S2PLOT.
See Also
cs2socb | Register function that will draw direct OpenGL graphics when called. |
s2ldev | List the available S2PLOT devices on stdout. |
s2disp | Draw the scene, but return control when a timeout occurs or when shift-ENTER is pressed. |
s2show | Draw the scene and enter interactive mode if interactive is non-zero. |
Sample Code
Some additional steps are required to get the remote callback to function. After you have compiled the sample code, you will need to follow these steps:
1. In the terminal/shell you are planning to run the executable in (cs2srcb), type
setenv S2PLOT_REMOTEPORT 3333
Note that you can use another port number instead of 3333 if required.
2. Run the code
3. In another terminal/shell type the following:
telnet localhost 3333
S2 setcolor 0.9,0.1,0.5
4. The polygon/billboard should now change colour.
5. Quitting the executable (shift-Q) should close the terminal session.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include "s2plot.h"
unsigned int tid;
float _bb_r, _bb_g, _bb_b;
int remote_cb(char *data);
void cb(double *t, int *kc);
int main(int argc, char *argv[])
{
int width = 16, height = 16; /* Dimensions of texture */
int i, j; /* Loop variables */
int idx; /* Index into texture array */
unsigned char *tex; /* Array of texture values */
srand48((long)time(NULL)); /* Seed random numbers */
s2opend("/?",argc,argv); /* Open the display */
s2svp(-1.0,1.0, -1.0,1.0, -1.0,1.0); /* Set the viewport coords */
s2swin(-1.0,1.0, -1.0,1.0, -1.0,1.0); /* Set the window coordinates */
s2box("BCDE",0,0,"BCDE",0,0,"BCDE",0,0); /* Draw a bounding box */
tid = ss2ct(width, height); /* Create a new texture */
tex = ss2gt(tid, &width, &height); /* Get the texture */
for (j=0;j<height;j++) {
for (i=0;i<width;i++) {
idx = (j*width + i) * 4; /* Stored as (r,g,b,alpha) */
tex[idx ] = 255; /* solid red */
tex[idx+1] = 255; /* Green */
tex[idx+2] = 255; /* Blue */
tex[idx+3] = 127 * drand48()+128; /* Random transparency */
}
}
ss2pt(tid); /* Push texture for usage */
_bb_g = 0.7;
_bb_b = 0.9;
cs2scb(&cb); /* Install a callback */
cs2srcb(&remote_cb); /* Install remote callback */
s2show(1); /* Open the s2plot window */
return 1;
}
void cb(double *t, int *kc)
{
float x = 0.0, y = 0.3, z = 0.4; /* Location */
float isize = 0.02; /* Texture scale */
float str_x = 0.0, str_y = 0.0, str_z = 0.0; /* No stretch */
float alpha = 0.9; /* Alpha channel */
char trans = 't'; /* Transparency */
ds2bb(x,y,z, str_x,str_y,str_z, isize, _bb_r, _bb_g, _bb_b, tid, alpha, trans);
/* Draw the billboard */
}
int remote_cb(char *data) {
// this remote callback will receive strings coming in on
// the S2PLOT_REMOTEPORT port.
char *contype, *ctype, *cargs;
contype = strtok(data, " ");
// for this demo, we will only parse commands preceded by "S2"
if (!contype || strcmp(contype, "S2")) {
// return 0 to indicate we have not "consumed" this event
fprintf(stderr, "remote_cb: no valid command prefix\n");
return 0;
}
ctype = strtok(NULL, " ");
if (!ctype) {
fprintf(stderr, "remote_cb: no command present\n");
return 0;
}
int consumed = 0;
// the only command we accept is "setcolor" to set the
// billboard color
if (!strcmp(ctype, "setcolor")) {
cargs = strtok(NULL, " ");
if (!cargs) {
fprintf(stderr, "remote_cb: no argument for setcolor present\n");
return 0;
}
float vr, vg, vb;
sscanf(cargs, "%f,%f,%f", &vr, &vg, &vb);
if ((vr >= 0.) && (vr <= 1.) &&
(vg >= 0.) && (vg <= 1.) &&
(vb >= 0.) && (vb <= 1.)) {
_bb_r = vr;
_bb_g = vg;
_bb_b = vb;
}
consumed = 1;
} else {
fprintf(stderr, "remote_cb: unknown command %s\n", ctype);
}
return consumed;
}
Back to S2PLOT function list.