void print_and_draw_wiimote_data(void *screen_buffer) { //Makes the var wd point to the data on the wiimote WPADData *wd = WPAD_Data(0); std::cout<<" Data->Err: "<<wd->err<<"\n"; std::cout<<" IR Dots:\n"; int i; for(i=0; i<4; i++) { if(wd->ir.dot[i].visible) { std::cout<<" "<<wd->ir.dot[i].rx<<", "<<wd->ir.dot[i].ry<<"\n"; drawdot(screen_buffer, rmode, 1024, 768, wd->ir.dot[i].rx, wd->ir.dot[i].ry, COLOR_YELLOW); } else { std::cout<<" None\n"; } } //ir.valid - TRUE is the wiimote is pointing at the screen, else it is false if(wd->ir.valid) { float theta = wd->ir.angle / 180.0 * M_PI; //ir.x/ir.y - The x/y coordinates that the wiimote is pointing to, relative to the screen. //ir.angle - how far (in degrees) the wiimote is twisted (based on ir) std::cout<<" Cursor: "<<wd->ir.x<<","<<wd->ir.y<<"\n"; std::cout<<" @ "<<wd->ir.angle<<" deg\n"; drawdot(screen_buffer, rmode, rmode->fbWidth, rmode->xfbHeight, wd->ir.x, wd->ir.y, COLOR_RED); drawdot(screen_buffer, rmode, rmode->fbWidth, rmode->xfbHeight, wd->ir.x + 10*sinf(theta), wd->ir.y - 10*cosf(theta), COLOR_BLUE); } else { std::cout<<" No Cursor\n\n"; } if(wd->ir.raw_valid) { //ir.z - How far away the wiimote is from the screen in meters std::cout<<" Distance: "<<wd->ir.z<<"m\n"; //orient.yaw - The left/right angle of the wiimote to the screen std::cout<<" Yaw: "<<wd->orient.yaw<<" deg\n"; } else { std::cout<<"\n\n"; } std::cout<<" Accel:\n"; //accel.x/accel.y/accel.z - analog values for the accelleration of the wiimote //(Note: Gravity pulls downwards, so even if the wiimote is not moving, //one(or more) axis will have a reading as if it is moving "upwards") std::cout<<" XYZ: "<<wd->accel.x<<","<<wd->accel.y<<","<<wd->accel.z<<"\n"; //orient.pitch - how far the wiimote is "tilted" in degrees std::cout<<" Pitch: "<<wd->orient.pitch<<"\n"; //orient.roll - how far the wiimote is "twisted" in degrees (uses accelerometer) std::cout<<" Roll: "<<wd->orient.roll<<"\n"; print_wiimote_buttons(wd); if(wd->ir.raw_valid) { for(i=0; i<2; i++) { drawdot(screen_buffer, rmode, 4, 4, wd->ir.sensorbar.rot_dots[i].x+2, wd->ir.sensorbar.rot_dots[i].y+2, COLOR_GREEN); } } if(wd->btns_h & WPAD_BUTTON_1) doreload=1; }
void mouse(int button, int state, int x, int y) { if (button == GLUT_MIDDLE_BUTTON) { if (state == GLUT_DOWN) { int i; for (i = 0; i < numcontrols; i++) if (fabs(controls[i][0] - x) + fabs(controls[i][1] - y) < radius) { dragcontrol = i; break; } else if (state == GLUT_UP) { dragcontrol = -1; } } } else if(button == GLUT_LEFT_BUTTON) { if (state == GLUT_DOWN) { glPointSize(5.0); controls[g][0]=x; controls[g][1]=y; controls[g][2]=0; drawdot(controls[g][0],controls[g][1]); g++; numcontrols=g; glutPostRedisplay(); } } }
static void drawpath(PathNode* to, uint32 rgb, bool done) { PathNode* n1 = to; PathNode* n2 = to->parent; while (n2) { drawedge(n1, n2, rgb); if (done && n1 == to) drawdot(n1->state.x, n1->state.y, n1->state.z, 2, 0xFFFF0000); else drawdot(n1->state.x, n1->state.y, n1->state.z, 1, 0xFFFFFFFF); drawdot(n2->state.x, n2->state.y, n2->state.z, 2, 0xFFFFFFFF); n1 = n2; n2 = n1->parent; } }
int Scope::expose(XEvent *evv) { XExposeEvent *ev = &evv->xexpose; int x; int flg=0; int height=gtheight(); drawline(this,gtfgnd(),ev->x,127,ev->x+ev->width,127); for (x = ev->x - ev->x%20;x <ev->x + ev->width; x += 20) drawline(this,gtfgnd(),x,127-3,x,127+3); if(data) for(x=ev->x;x!=ev->x+ev->width;++x) { if(flg) drawline(this,gtfgnd(),x-1,height-data[x-1]-1,x,height-data[x]-1); drawdot(this,gtfgnd(),x,height-data[x]-1); flg=1; } return 0; }
void loadlgf(int mode) { FILE *ps; char inname[150], temp[500], *pdchar; char **signals; short *signets; objectptr *libobj; genericptr *iolabel; int i, sigs; sscanf(_STR, "%149s", inname); ps = fopen(inname, "r"); if (ps == NULL) { sprintf(inname, "%s.lgf", _STR); ps = fopen(inname, "r"); if (ps == NULL) { sprintf(inname, "%s.lfo", _STR); ps = fopen(inname, "r"); if (ps == NULL) { Wprintf("Can't open LGF file %s", inname); return; } } } /* for PostScript file, remove ".lgf" or ".lfo" (to be replaced with ".ps") */ if ((pdchar = strstr(inname, ".l")) != NULL) *pdchar = '\0'; Wprintf("Loaded file: %s", inname); /* Make sure that LGF object library has been loaded by loading it now. */ if (NameToLibrary(LGF_LIB) < 0) { int ilib; strcpy(_STR, LGF_LIB); ilib = createlibrary(FALSE); loadlibrary(ilib); } /* Read header information */ if (fgets(temp, 149, ps) == NULL) { Wprintf("Error: end of file."); return; } for (pdchar = temp; *pdchar != '-' && *pdchar != '\n'; pdchar++); if (*pdchar == '\n') { Wprintf("Not an LGF file?"); return; } if (*(++pdchar) != '5') { Wprintf("Don't know how to read version %c.", *pdchar); return; } if (fgets(temp, 149, ps) == NULL) { Wprintf("Error: end of file."); return; } for (pdchar = temp; *pdchar != 'f' && *pdchar != '\n'; pdchar++); for (; *pdchar != 's' && *pdchar != '\n'; pdchar++); if (*pdchar == '\n') { Wprintf("Something wrong with the LGF file?"); return; } /* Done with header. . . okay to clear current page now unless importing */ if (mode == 0) { reset(topobject, NORMAL); pagereset(areawin->page); } /* Set up filename and object (page) name */ xobjs.pagelist[areawin->page]->filename = (char *) realloc ( xobjs.pagelist[areawin->page]->filename, (strlen(inname) + 1) * sizeof(char)); strcpy(xobjs.pagelist[areawin->page]->filename, inname); /* If the filename has a path component, use only the root */ if ((pdchar = strrchr(inname, '/')) != NULL) sprintf(topobject->name, "%s", pdchar + 1); else sprintf(topobject->name, "%s", inname); renamepage(areawin->page); printname(topobject); /* Read objects */ for(;;) { char *lineptr, keyptr, tmpstring[256]; int dval; short pvalx, pvaly, pvalx2, pvaly2; if (fgets(temp, 499, ps) == NULL) break; /* End-Of-File */ /* ignore whitespace */ for (lineptr = temp; isspace(*lineptr) && *lineptr != '\n'; lineptr++); if (*lineptr == '\n') continue; /* ignore blank lines */ switch(keyptr = *lineptr) { case '#': /* comment */ break; case 'n': /* nodes */ sscanf(++lineptr, "%d", &dval); for (i = 0; i < dval; i++) { do { if (fgets(temp, 499, ps) == NULL) { Wprintf("End of file in node section"); return; } for (lineptr = temp; isspace(*lineptr) && *lineptr != '\n'; lineptr++); } while (*lineptr == '\n'); } break; case 's': /* signal names --- save for future reference */ sscanf(++lineptr, "%d", &sigs); signals = (char **) malloc(sigs * sizeof(char *)); signets = (short *) malloc(sigs * sizeof(short)); for (i = 0; i < sigs; i++) { do { if (fgets(temp, 499, ps) == NULL) { Wprintf("End of file in signal section"); return; } for (lineptr = temp; isspace(*lineptr) && *lineptr != '\n'; lineptr++); } while (*lineptr == '\n'); sscanf(lineptr, "%hd %249s", &signets[i], tmpstring); signals[i] = (char *)malloc((strlen(tmpstring) + 1) * sizeof(char)); sprintf(signals[i], "%s", tmpstring); } break; case 'l': { /* labels */ labelptr *newlabel; char *tstrp; sscanf(++lineptr, "%d", &dval); for (i = 0; i < dval; i++) { do { if (fgets(temp, 499, ps) == NULL) { Wprintf("End of file in signal section"); return; } for (lineptr = temp; isspace(*lineptr) && *lineptr != '\n'; lineptr++); } while (*lineptr == '\n'); /* Allocate label, and put node number into X value, to be replaced */ /* Flag it using an inappropriate rotation value (= 500) */ sscanf(lineptr, "%hd %hd", &pvalx, &pvaly); /* Get rid of newline character, if any */ ridnewline(lineptr); /* forward to the label part of the input line */ tstrp = lineptr - 1; while (isdigit(*(++tstrp))); while (isspace(*(++tstrp))); while (isdigit(*(++tstrp))); while (isspace(*(++tstrp))); while (isdigit(*(++tstrp))); while (isspace(*(++tstrp))); if (tstrp != NULL) { /* could be a blank line */ stringpart *strptr; NEW_LABEL(newlabel, topobject); labeldefaults(*newlabel, False, xmat(pvalx), ymat(pvaly)); (*newlabel)->justify = TOP | NOTBOTTOM; (*newlabel)->color = DEFAULTCOLOR; (*newlabel)->string->data.font = 0; strptr = makesegment(&((*newlabel)->string), NULL); strptr->type = TEXT_STRING; strptr->data.string = (char *)malloc(1 + strlen(tstrp)); strcpy(strptr->data.string, tstrp); (*newlabel)->pin = NORMAL; } }} break; case 'w': { /* wires, implemented as single-segment polygons */ polyptr *newwire; XPoint *tmppnts; sscanf(++lineptr, "%d", &dval); for (i = 0; i < dval; i++) { do { if (fgets(temp, 499, ps) == NULL) { Wprintf("End of file in wire section"); return; } for (lineptr = temp; isspace(*lineptr) && *lineptr != '\n'; lineptr++); } while (*lineptr == '\n'); /* Allocate wire */ NEW_POLY(newwire, topobject); sscanf(lineptr, "%hd %hd %hd %hd", &pvalx, &pvaly, &pvalx2, &pvaly2); (*newwire)->number = 2; (*newwire)->points = (XPoint *)malloc(2 * sizeof(XPoint)); (*newwire)->width = 1.0; (*newwire)->style = UNCLOSED; (*newwire)->color = DEFAULTCOLOR; (*newwire)->passed = NULL; tmppnts = (*newwire)->points; tmppnts->x = xmat(pvalx); tmppnts->y = ymat(pvaly); (++tmppnts)->x = xmat(pvalx2); tmppnts->y = ymat(pvaly2); }} break; case 'p': /* solder dot */ sscanf(++lineptr, "%d", &dval); for (i = 0; i < dval; i++) { do { if (fgets(temp, 499, ps) == NULL) { Wprintf("End of file in solder dot section"); return; } for (lineptr = temp; isspace(*lineptr) && *lineptr != '\n'; lineptr++); } while (*lineptr == '\n'); /* Allocate arc */ sscanf(lineptr, "%hd %hd", &pvalx, &pvaly); drawdot(xmat(pvalx), ymat(pvaly)); } break; case 'b': { /* boxes */ polyptr *newpoly; pointlist newpoints; sscanf(++lineptr, "%d", &dval); for (i = 0; i < dval; i++) { do { if (fgets(temp, 499, ps) == NULL) { Wprintf("End of file in box section"); return; } for (lineptr = temp; isspace(*lineptr) && *lineptr != '\n'; lineptr++); } while (*lineptr == '\n'); NEW_POLY(newpoly, topobject); (*newpoly)->style = DASHED; (*newpoly)->color = DEFAULTCOLOR; (*newpoly)->width = 1.0; (*newpoly)->number = 4; (*newpoly)->points = (pointlist) malloc(4 * sizeof(XPoint)); (*newpoly)->passed = NULL; newpoints = (*newpoly)->points; sscanf(lineptr, "%hd %hd %hd %hd", &pvalx, &pvaly, &pvalx2, &pvaly2); newpoints->x = xmat(pvalx); newpoints->y = ymat(pvaly); (newpoints + 1)->x = xmat(pvalx2); (newpoints + 2)->y = ymat(pvaly2); (newpoints + 2)->x = (newpoints + 1)->x; (newpoints + 3)->x = newpoints->x; (newpoints + 1)->y = newpoints->y; (newpoints + 3)->y = (newpoints + 2)->y; }} break; case 'g': { /* gates */ objinstptr *newinst; labelptr *newlabel; int j, k, hval, flip; sscanf(++lineptr, "%d", &dval); for (i = 0; i < dval; i++) { do { if (fgets(temp, 499, ps) == NULL) { Wprintf("End of file in gates section"); return; } for (lineptr = temp; *lineptr != '\n'; lineptr++); *lineptr = '\0'; for (lineptr = temp; isspace(*lineptr) && *lineptr != '\0'; lineptr++); } while (*lineptr == '\0'); /* double loop through user libraries */ for (j = 0; j < xobjs.numlibs; j++) { for (k = 0; k < xobjs.userlibs[j].number; k++) { libobj = xobjs.userlibs[j].library + k; if (!strcmp(lineptr, (*libobj)->name)) break; } if (k < xobjs.userlibs[j].number) break; } strcpy(tmpstring, lineptr); /* read gate definition */ if (fgets(temp, 499, ps) == NULL) { Wprintf("End of file during gate read"); return; } for (lineptr = temp; isspace(*lineptr) && *lineptr != '\n'; lineptr++); if (j < xobjs.numlibs || k < xobjs.userlibs[xobjs.numlibs - 1].number) { NEW_OBJINST(newinst, topobject); sscanf(lineptr, "%hd %hd %hd %*d %*d %*d %d", &pvalx, &pvaly, &pvalx2, &hval); flip = (pvalx2 >= 4) ? 1 : 0; if (!strcmp(tmpstring, "FROM")) flip = 1 - flip; (*newinst)->position.x = xmat(pvalx); (*newinst)->position.y = ymat(pvaly); (*newinst)->scale = 1.0; (*newinst)->color = DEFAULTCOLOR; (*newinst)->params = NULL; (*newinst)->passed = NULL; if (pvalx2 & 0x01) pvalx2 ^= 0x02; if (pvalx2 >= 4) (*newinst)->rotation = -(((pvalx2 - 4) * 90) + 1); else (*newinst)->rotation = (pvalx2 * 90) + 1; (*newinst)->thisobject = *libobj; (*newinst)->bbox.lowerleft.x = (*libobj)->bbox.lowerleft.x; (*newinst)->bbox.lowerleft.y = (*libobj)->bbox.lowerleft.y; (*newinst)->bbox.width = (*libobj)->bbox.width; (*newinst)->bbox.height = (*libobj)->bbox.height; /* Add label to "TO" and "FROM" */ if (!strcmp(tmpstring, "FROM") || !strcmp(tmpstring, "TO")) { int nval; hval--; fgets(temp, 499, ps); sscanf(temp, "%d", &nval); for (k = 0; k < sigs; k++) if (signets[k] == nval) { stringpart *strptr; NEW_LABEL(newlabel, topobject); /* reconnect newinst if displaced by realloc() */ newinst = (objinstptr *)(topobject->plist + topobject->parts - 2); labeldefaults(*newlabel, False, (*newinst)->position.x, (*newinst)->position.y); (*newlabel)->color = DEFAULTCOLOR; (*newlabel)->pin = LOCAL; (*newlabel)->color = LOCALPINCOLOR; if (!strcmp(tmpstring, "TO")) (*newlabel)->position.x += ((flip) ? 48 : -48); else (*newlabel)->position.x += ((flip) ? 54 : -54); (*newlabel)->justify = NOTBOTTOM; if (flip) (*newlabel)->justify |= (RIGHT | NOTLEFT); (*newlabel)->string->data.font = 0; strptr = makesegment(&((*newlabel)->string), NULL); strptr->type = TEXT_STRING; strptr->data.string = (char *)malloc(1 + strlen(signals[k])); strcpy(strptr->data.string, signals[k]); break; } } } /* read through list of attributes */ else { sscanf(lineptr, "%*d %*d %*d %*d %*d %*d %d", &hval); Wprintf("No library object %s", tmpstring); } for (j = 0; j < hval + 1; j++) { if (fgets(temp, 499, ps) == NULL) { Wprintf("Unexpected end of file"); return; } } /* read to next blank line */ do { if (fgets(temp, 499, ps) == NULL) break; for (lineptr = temp; isspace(*lineptr) && *lineptr != '\n'; lineptr++); } while (*lineptr != '\n'); }} break; case 'h': { /* history */ int j, hval; sscanf(++lineptr, "%d", &dval); for (i = 0; i < dval; i++) { do { if (fgets(temp, 499, ps) == NULL) { Wprintf("End of file in history section"); return; } for (lineptr = temp; isspace(*lineptr) && *lineptr != '\n'; lineptr++); } while (*lineptr == '\n'); /* read through history */ sscanf(lineptr, "%*d %d", &hval); for (j = 0; j < hval; j++) if (fgets(temp, 499, ps) == NULL) { Wprintf("Unexpected end of file"); return; } }} break; case '.': /* blank, don't use for EOF */ break; default: Wprintf("Don't understand statement '%c'", *lineptr); break; } } /* check for unattached labels and delete them */ for (iolabel = topobject->plist; iolabel < topobject->plist + topobject->parts; iolabel++) if (IS_LABEL(*iolabel)) { if (TOLABEL(iolabel)->rotation == 500) { genericptr *tmplabel; free(TOLABEL(iolabel)->string); free(*iolabel); for (tmplabel = iolabel + 1; tmplabel < topobject->plist + topobject->parts; tmplabel++) *(tmplabel - 1) = *tmplabel; topobject->parts--; iolabel--; } } calcbbox(areawin->topinstance); centerview(areawin->topinstance); for (i = 0; i < sigs; i++) free(signals[i]); free(signals); free(signets); }
bool Pathfinder::pathfind(std::vector<PathfindingAction>& path) { #if 0 pout << "Actor " << actor->getObjId(); if (targetitem) { pout << " pathfinding to item: "; targetitem->dumpInfo(); } else { pout << " pathfinding to (" << targetx << "," << targety << "," << targetz << ")" << std::endl; } #endif #ifdef DEBUG if (actor->getObjId() == visualdebug_actor) { RenderSurface* screen = GUIApp::get_instance()->getScreen(); screen->BeginPainting(); if (targetitem) drawbox(targetitem); else drawdot(targetx, targety, targetz, 2, 0xFF0000FF); screen->EndPainting(); } #endif path.clear(); PathNode* startnode = new PathNode(); startnode->state = start; startnode->cost = 0; startnode->parent = 0; startnode->depth = 0; startnode->stepsfromparent = 0; nodelist.push_back(startnode); nodes.push(startnode); unsigned int expandednodes = 0; const unsigned int NODELIMIT_MIN = 30; //! constant const unsigned int NODELIMIT_MAX = 200; //! constant bool found = false; Uint32 starttime = SDL_GetTicks(); while (expandednodes < NODELIMIT_MAX && !nodes.empty() && !found) { PathNode* node = nodes.top(); nodes.pop(); #if 0 pout << "Trying node: (" << node->state.x << "," << node->state.y << "," << node->state.z << ") target=(" << targetx << "," << targety << "," << targetz << ")" << std::endl; #endif if (checkTarget(node)) { // done! // find path length PathNode* n = node; unsigned int length = 0; while (n->parent) { n = n->parent; length++; } #if 0 pout << "Pathfinder: path found (length = " << length << ")" << std::endl; #endif unsigned int i = length; if (length > 0) length++; // add space for final 'stand' action path.resize(length); // now backtrack through the nodes to assemble the final animation while (node->parent) { PathfindingAction action; action.action = node->state.lastanim; action.direction = node->state.direction; action.steps = node->stepsfromparent; path[--i] = action; #if 0 pout << "anim = " << node->state.lastanim << ", dir = " << node->state.direction << ", steps = " << node->stepsfromparent << std::endl; #endif //TODO: check how turns work //TODO: append final 'stand' animation node = node->parent; } if (length) { if (node->state.combat) path[length-1].action = Animation::combatStand; else path[length-1].action = Animation::stand; path[length-1].direction = path[length-2].direction; } expandtime = SDL_GetTicks() - starttime; return true; } expandNode(node); expandednodes++; if(expandednodes >= NODELIMIT_MIN && ((expandednodes) % 5) == 0) { Uint32 elapsed_ms = SDL_GetTicks() - starttime; if(elapsed_ms > 350) break; } } expandtime = SDL_GetTicks() - starttime; #if 0 static sint32 pfcalls = 0; static sint32 pftotaltime = 0; pfcalls++; pftotaltime += expandtime; pout << "maxout average = " << (pftotaltime / pfcalls) << "ms." << std::endl; #endif return false; }