sBool Wz4PDF::TraceRay(sVector31 &p, sVector30 &n, const sRay &ray, const sF32 md, const sF32 mx, const sInt mi) { sInt i=0; sF32 d=10000; sF32 id=0; sVector31 np; sVector31 tp = ray.Start; do { p = tp; sF32 td = Obj->GetDistance(p); if (td<=d) { d=td; np=p; } tp = tp + ray.Dir * sAbs(td); id+= sAbs(td); }while (d>md && i++!=mi && id<mx); if (d<=md) Obj->GetNormal(np,n); return d<=md; }
sF32 Wz4PDFCube::GetDistance(const sVector31 &p) { sF32 t=sAbs(p.x); t = sMax(t,sAbs(p.y)); t = sMax(t,sAbs(p.z)); t -= 0.5f; if ((p.x>0.5f || p.x<-0.5f) && (p.y>0.5f || p.y<-0.5f) && (p.z>0.5f || p.z<-0.5f)) { sF32 x=p.x>0.0f ? 0.5f:-0.5f; sF32 y=p.y>0.0f ? 0.5f:-0.5f; sF32 z=p.z>0.0f ? 0.5f:-0.5f; x-=p.x; y-=p.y; z-=p.z; t=sSqrt(x*x+y*y+z*z); } return t; }
sBool Wz4ADF::TraceRay(sVector31 &p, sVector30 &n, const sRay &ray, const sF32 md, const sF32 mx, const sInt mi) { if (!SDF) return false; sAABBox box; SDF->GetBox(box); box.Min.x += 1/8192.0f; box.Min.y += 1/8192.0f; box.Min.z += 1/8192.0f; box.Max.x -= 1/8192.0f; box.Max.y -= 1/8192.0f; box.Max.z -= 1/8192.0f; p = ray.Start; sF32 d; sF32 mind=0; sF32 maxd=10000.0; if (ray.HitAABB(mind,maxd,box.Min,box.Max)) { p = ray.Start + ray.Dir * mind; d = 0; n.x = 0.0f; n.y = 1.0f; n.z = 0.0f; while (SDF->IsInBox(p)) { d = SDF->GetDistance(p); if (d<=1.0f/64.0f) { SDF->GetNormal(p,n); return true; } n.x = 0.0f; n.y = 0.0f; n.z = 1.0f; p = p + ray.Dir * sAbs(d); } } return false; }
void PageWin::OnDrag(sDragData &dd) { sU32 key; PageOp *po; PageDoc *pd; sInt i,max; sRect r; ParaWin *parawin; sBool pickit; pd = Doc; if(pd==0) return; max = pd->Ops->GetCount(); if(MMBScrolling(dd,DragStartX,DragStartY)) return; switch(dd.Mode) { case sDD_START: CursorX = sRange<sInt>((dd.MouseX-Client.x0)/PAGEX-1,PAGESX-3,0); CursorY = sRange<sInt>((dd.MouseY-Client.y0)/PAGEY ,PAGESY-1,0); CursorWidth = 3; pickit = 0; if(dd.Buttons&2) { sGui->Post(CMD_POPUP,this); break; } SelectMode = SM_SET; key = sSystem->GetKeyboardShiftState(); if(key&sKEYQ_SHIFT) SelectMode = SM_ADD; if(key&sKEYQ_CTRL) SelectMode = SM_TOGGLE; DragMode = DragKey; if(DragMode==DM_SELECT) { po = FindOp(dd.MouseX,dd.MouseY); if(po) { DragMode = DM_PICK; pickit = 1; if(po->Selected) SelectMode = SM_ADD; } else { DragMode = DM_RECT; } } if(DragMode==DM_DUPLICATE || DragMode==DM_WIDTH || DragMode==DM_MOVE) { po = FindOp(dd.MouseX,dd.MouseY); if(po && !po->Selected) { pickit = 1; SelectMode = SM_SET; } } DragStartX = dd.MouseX; DragStartY = dd.MouseY; DragMoveX = 0; DragMoveY = 0; DragWidth = 0; if(DragMode==DM_PICK || pickit) { if(SelectMode==SM_SET) for(i=0;i<max;i++) pd->Ops->Get(i)->Selected = sFALSE; EditOp = po = FindOp(dd.MouseX,dd.MouseY); if(po) { parawin = (ParaWin *) App->FindActiveWindow(sCID_TOOL_PARAWIN); if(parawin) { parawin->SetOp(po,Doc); pd->UpdatePage(); } if(SelectMode==SM_TOGGLE) po->Selected = !po->Selected; else po->Selected = sTRUE; } } if(DragMode==DM_RECT) { DragRect.Init(dd.MouseX,dd.MouseY,dd.MouseX+1,dd.MouseY+1); EditOp = 0; } if(DragMode==DM_SCROLL) { DragStartX = ScrollX; DragStartY = ScrollY; } break; case sDD_DRAG: switch(DragMode) { case DM_PICK: if(sAbs(dd.DeltaX)>2 || sAbs(dd.DeltaY)>2) DragMode = DM_MOVE; break; case DM_RECT: DragRect.Init(dd.MouseX,dd.MouseY,DragStartX,DragStartY); DragRect.Sort(); break; case DM_MOVE: case DM_DUPLICATE: DragMoveX = (dd.DeltaX+1024*PAGEX+PAGEX/2)/PAGEX-1024; DragMoveY = (dd.DeltaY+1024*PAGEY+PAGEY/2)/PAGEY-1024; break; case DM_WIDTH: DragWidth = (dd.DeltaX+1024*PAGEX+PAGEX/2)/PAGEX-1024; break; case DM_SCROLL: ScrollX = sRange<sInt>(DragStartX-dd.DeltaX,SizeX-RealX,0); ScrollY = sRange<sInt>(DragStartY-dd.DeltaY,SizeY-RealY,0); break; } break; case sDD_STOP: switch(DragMode) { case DM_RECT: for(i=0;i<max;i++) { po = pd->Ops->Get(i); if(SelectMode==SM_SET) po->Selected = sFALSE; po->MakeRect(r,Client); if(r.Hit(DragRect)) { if(SelectMode==SM_TOGGLE) po->Selected = !po->Selected; else po->Selected = sTRUE; } } break; case DM_MOVE: case DM_WIDTH: if(CheckDest(sFALSE)) MoveDest(sFALSE); break; case DM_DUPLICATE: if(CheckDest(sTRUE)) MoveDest(sTRUE); break; } DragMode = 0; DragMoveX = 0; DragMoveY = 0; DragWidth = 0; break; } }
int blockTrigger(struct dataset * s, int ch, int highestDftSample) { if(s == NULL) return -1; if(highestDftSample < BACKTRACK) { fprintf(stderr, "DFT trigger point too close to left edge of ping.\n"); return -1; } fprintf(stderr, "Beginning block triggering using %d blocks at sample %d\n", BACKTRACK / BLOCKSIZE, highestDftSample); int i=0, j=0; int searchStart, searchEnd; searchStart = highestDftSample - BACKTRACK; searchEnd = highestDftSample; int blockMax = 0; int lastBlockMax = 0; int blockJump = 0; int highestJump = 0; int highestJumpIndex = 0; int curBlock=0; int triggeredBlock = 0; fprintf(stdout, "Searching region %d to %d\n", searchStart, searchEnd); for(i=searchStart; i<searchEnd; i+= BLOCKSIZE) { lastBlockMax = blockMax; blockMax = sAbs(getSample(s, ch, i+j)); /* Find maximum of this block */ for(j=0; j<BLOCKSIZE; j++) { signed short curSample = sAbs(getSample(s, ch, i+j)); if(sAbs(curSample) > blockMax) blockMax = curSample; } blockJump = abs(blockMax - lastBlockMax); if(blockJump > highestJump) { highestJump = blockJump; highestJumpIndex = i; triggeredBlock = curBlock; } curBlock++; } fprintf(stderr, "Highest block jump occurs at sample %d\n", highestJumpIndex); fprintf(stderr, "Triggered on block %d\n", triggeredBlock); return highestJumpIndex; }
static sU32 deltaCode(sInt val, sInt& last) { sInt delta = val-last; last = val; return sAbs(delta) * 2 - (delta < 0); }