static void st_find_begin(t_pos *pos, int cs, t_env *env, int i) { pos->x = POSX(cs); pos->y = POSY(cs); if (OR(cs) == N) { pos->y = pos->y - i < 0 ? HEIGHT - i : pos->y - i; pos->x = pos->x - i < 0 ? WIDTH - i : pos->x - i; while (pos->y < 0) pos->y = HEIGHT - abs(pos->y); while (pos->x < 0) pos->x = WIDTH - abs(pos->x); } else if (OR(cs) == S) { pos->y = pos->y + i > HEIGHT - 1 ? ((pos->y + i) - (HEIGHT - 1)) - 1 : pos->y + i; pos->x = pos->x + i > WIDTH - 1 ? ((pos->x + i) - (WIDTH - 1)) - 1 : pos->x + i; while (pos->y > HEIGHT - 1) pos->y = (pos->y - (HEIGHT - 1)) - 1; while (pos->x > WIDTH - 1) pos->x = (pos->x - (WIDTH - 1)) - 1; } else st_finish_begin(pos, cs, env, i); }
static void st_inform_players(t_env *env, int cs) { int i; i = 0; while (i < env->max_fd) { if (env->fd_socket[i].type == CLIENT) { if (POSY(i) == POSY(cs) && POSX(i) == POSX(cs) && env->fd_socket[i].level == env->fd_socket[cs].level) { TOTY(i) = POSY(i); TOTX(i) = POSX(i); ft_reply_in_buff(env, i, "elevation en cours"); } } i++; } }
void ft_snapshot(t_env *env, int cs, int stuff[NB_STUFF]) { t_snapshot snapshot; char *str; snapshot.master = cs; snapshot.pos.x = POSX(cs); snapshot.pos.y = POSY(cs); snapshot.players = ft_get_players_same_level(env, cs); snapshot.stuff[PLAYERS] = stuff[PLAYERS]; snapshot.stuff[LINEMATE] = stuff[LINEMATE]; snapshot.stuff[DERAUMERE] = stuff[DERAUMERE]; snapshot.stuff[SIBUR] = stuff[SIBUR]; snapshot.stuff[MENDIANE] = stuff[MENDIANE]; snapshot.stuff[PHIRAS] = stuff[PHIRAS]; snapshot.stuff[THYSTAME] = stuff[THYSTAME]; ft_lstpush(&env->elevation, ft_lstnew(&snapshot, sizeof(snapshot))); asprintf(&str, "%d %d %d", POSX(cs), POSY(cs), env->fd_socket[cs].level); st_inform_players(env, cs); ft_action_special(cs, 300, ft_check_incantation, str); ft_memdel((void **)&str); }
static t_egg st_fill_egg(t_env *env, int cs) { t_egg new_egg; srand(time(0)); new_egg.num = env->count_egg; new_egg.state = GESTATION; new_egg.father = cs; new_egg.life = 10; new_egg.pos.x = POSX(cs); new_egg.pos.y = POSY(cs); new_egg.pos.o = rand() % 4; if (new_egg.pos.o < 1) new_egg.pos.o = 1; new_egg.team = ft_strdup(env->fd_socket[cs].my_team); return (new_egg); }
void output_sdl (SDL_Surface *tileset, SDL_Surface *typeface, SDL_Surface *uisurf, SDL_Surface *screen, struct state *s, struct ui *ui, int variant[MAX_WIDTH][MAX_HEIGHT], int pop_variant[MAX_WIDTH][MAX_HEIGHT], int ktime) { /* Clear screen */ SDL_Rect rect = {0, 0, screen->w, screen->h}; SDL_FillRect(screen, &rect, (SDL_MapRGB(screen->format, 20, 20, 20))); /* Draw */ int i=0,j=0,k=0; int srci=0, srcj=0; /* cliffs variables */ int cliff_buf[MAX_CLIFF]; for (j=0; j<s->grid.height; ++j) { for (i=-1; i<s->grid.width+1; ++i) { /* cliffs */ if (is_a_cliff(i, j, &s->grid, cliff_buf)) { for(k=0; k<MAX_CLIFF; ++k) { if (cliff_buf[k]) { blit_subpic (tileset, screen, 7+k, 0, POSX(ui, i), POSY(j)); } } continue; } if (!is_within_the_grid(i,j,&s->grid)) { continue; } /* normal tiles */ int owner = s->grid.tiles[i][j].pl; int done = 0; switch (s->grid.tiles[i][j].cl) { case abyss: break; default: /* draw grass */ blit_subpic (tileset, screen, 0 + variant[i][j]%6, 0 + variant[i][j]/6%3, POSX(ui,i), POSY(j)); /* draw everything else */ switch (s->grid.tiles[i][j].cl) { case village: srci=0; srcj=7 + 3*owner; break; case town: srci=1; srcj=7 + 3*owner; break; case castle: srci=2; srcj=7 + 3*owner; break; case mountain: case mine: srci=0 + variant[i][j]%5; srcj=5; break; case grassland: { /* drawing population */ int pop = s->grid.tiles[i][j].units[owner][citizen]; if (pop > 0) { srci = 0 + pop_to_symbol(pop); srcj = 8 + 3*(owner); blit_subpic_noise (tileset, screen, srci, srcj, POSX(ui, i), POSY(j), pop_variant[i][j]); if (rand()%20 == 0) { int d = 1; if (owner != s->controlled) d = 11; pop_variant[i][j] = (pop_variant[i][j] + d) % 10000; } } } done = 1; default: done = 1; } if (!done) { blit_subpic_2h (tileset, screen, srci, srcj, POSX(ui, i), POSY(j)); if (s->grid.tiles[i][j].cl == mine) { if (s->grid.tiles[i][j].pl > 0) /* add a currency sign if its mining */ blit_subpic_2h (tileset, screen, 5, 5, POSX(ui, i), POSY(j)); else /* no currency sign */ blit_subpic (tileset, screen, 5, 5, POSX(ui, i), POSY(j)); } } } /* flags */ int p; for (p=0; p<MAX_PLAYER; ++p) { if (p != s->controlled) { if (s->fg[p].flag[i][j] != 0 && ((ktime/5 + p) / 5)%10 < 10) { blit_subpic_2h (tileset, screen, 4, 7+3*p, POSX(ui, i), POSY(j)); } } else if (s->fg[p].flag[i][j] != 0) { blit_subpic_2h (tileset, screen, 3, 7+3*p, POSX(ui, i), POSY(j)); } } } } /* draw cursor */ blit_subpic_2h (tileset, screen, 6, 5, POSX(ui, ui->cursor.i-1), POSY(ui->cursor.j)); blit_subpic_2h (tileset, screen, 7, 5, POSX(ui, ui->cursor.i), POSY(ui->cursor.j)); blit_subpic_2h (tileset, screen, 8, 5, POSX(ui, ui->cursor.i+1), POSY(ui->cursor.j)); /* Text */ int screen_y = (POSY(s->grid.height) + 1) * TILE_HEIGHT; char buf[128]; output_string(typeface, screen, "Gold: ", TILE_WIDTH, screen_y); sprintf(buf, "%li ", s->country[s->controlled].gold); output_string_alt(typeface, s->controlled, screen, buf, TILE_WIDTH + 6*TYPE_WIDTH, screen_y); sprintf(buf, "Prices: 150 300 600"); output_string(typeface, screen, buf, TILE_WIDTH, screen_y + 1*TYPE_HEIGHT); int y,m,d; time_to_ymd(s->time, &y, &m, &d); output_string(typeface, screen, "Date: ", TILE_WIDTH + 54*TYPE_WIDTH, screen_y + 0*TYPE_HEIGHT); sprintf(buf, "%i-%02i-%02i", y, m, d); output_string_alt(typeface, s->controlled, screen, buf, TILE_WIDTH + 60*TYPE_WIDTH, screen_y + 0*TYPE_HEIGHT); output_string(typeface, screen, "Speed:", TILE_WIDTH + 54*TYPE_WIDTH, screen_y + 1*TYPE_HEIGHT); switch(s->speed){ case sp_fastest: sprintf(buf,"Fastest"); break; case sp_faster: sprintf(buf,"Faster "); break; case sp_fast: sprintf(buf,"Fast "); break; case sp_normal: sprintf(buf,"Normal "); break; case sp_slow: sprintf(buf,"Slow "); break; case sp_slower: sprintf(buf,"Slower "); break; case sp_slowest: sprintf(buf,"Slowest"); break; case sp_pause: sprintf(buf,"Pause "); break; } output_string(typeface, screen, buf, TILE_WIDTH + 61*TYPE_WIDTH, screen_y + 1*TYPE_HEIGHT); sprintf(buf, "Population:"); output_string(typeface, screen, buf, TILE_WIDTH + 23*TYPE_WIDTH, screen_y + 0*TYPE_HEIGHT); int p; for (p=1; p<MAX_PLAYER; ++p) { sprintf(buf, "%3i", s->grid.tiles[ui->cursor.i][ui->cursor.j].units[p][citizen]); output_string_alt(typeface, p, screen, buf, TILE_WIDTH + (23 + 4*(p-1))*TYPE_WIDTH, screen_y + 1*TYPE_HEIGHT); } output_string(typeface, screen, "[Space] flag", TILE_WIDTH + 0*TYPE_WIDTH, screen_y + 3*TYPE_HEIGHT); output_string(typeface, screen, "[R] or [V] build", TILE_WIDTH + 27*TYPE_WIDTH, screen_y + 3*TYPE_HEIGHT); output_string(typeface, screen, "[X],[C] mass remove", TILE_WIDTH + 0*TYPE_WIDTH, screen_y + 4*TYPE_HEIGHT); output_string(typeface, screen, "[S] slower [F] faster", TILE_WIDTH + 54*TYPE_WIDTH, screen_y + 3*TYPE_HEIGHT); output_string(typeface, screen, "[P] pause", TILE_WIDTH + 54*TYPE_WIDTH, screen_y + 4*TYPE_HEIGHT); /* line */ int line_width=555; struct SDL_Rect src_line_rect = {0, 0, line_width, 1}; struct SDL_Rect dst_line_rect = {TILE_WIDTH + 75*TYPE_WIDTH/2 - line_width/2, screen_y + (TYPE_HEIGHT*5/2), line_width, 1}; SDL_BlitSurface(uisurf, &src_line_rect, screen, &dst_line_rect); }
void XGraphicsOpenGL::DrawPie( float x, float y, float radius, float angStart, float angEnd, XCOLOR color, int maxSlice ) { if( angStart == angEnd ) return; GLfloat r, g, b, a; r = XCOLOR_RGB_R(color) / 255.0f; g = XCOLOR_RGB_G(color) / 255.0f; b = XCOLOR_RGB_B(color) / 255.0f; a = XCOLOR_RGB_A(color) / 255.0f; GLfloat pos[MAX_VERTEX * 2]; GLfloat col[MAX_VERTEX * 4]; float angSlice = 360.0f / (float)maxSlice; // float ang = 0; int i = 0; POSX(i) = x; POSY(i) = y; COLOR(i, r, g, b, a); i++; POSX(i) = x + (sinf(D2R(angStart)) * radius); // 시작각도 버텍스 하나 만들어줌 POSY(i) = y + (-cosf(D2R(angStart)) * radius); COLOR(i, r, g, b, a); i++; ang += angSlice; int num = 0; while( ang < angEnd ) { if( ang >= angStart ) // 각도범위에 포함되면 버텍스를 추가 { float rAng = D2R(ang); // 디그리 각도를 라디안각도로 변환 POSX(i) = x + (sinf(rAng) * radius); POSY(i) = y + (-cosf(rAng) * radius); COLOR(i, r, g, b, a) i++; num++; // 삼각형 개수 if( XBREAK(i >= MAX_VERTEX) ) // 버퍼 오버플로우 되지 않도록 break; } ang += angSlice; } // 마지막각도에 버텍스 하나 더 추가 POSX(i) = x + (sinf(D2R(angEnd)) * radius); POSY(i) = y + (-cosf(D2R(angEnd)) * radius); COLOR(i,r,g,b,a); i++; num++; // gl draw glPushMatrix(); glLoadIdentity(); glDisable( GL_TEXTURE_2D ); glBindBuffer(GL_ARRAY_BUFFER, 0); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); // 이건 안해줘도 되네. glVertexPointer(2, GL_FLOAT, 0, pos); glEnableClientState(GL_VERTEX_ARRAY); glColorPointer(4, GL_FLOAT, 0, col); glEnableClientState(GL_COLOR_ARRAY); glDisableClientState(GL_TEXTURE_COORD_ARRAY); glDrawArrays(GL_TRIANGLE_FAN, 0, i); // i==버텍스개수 glDisableClientState(GL_COLOR_ARRAY); glEnable( GL_TEXTURE_2D ); glPopMatrix(); /* FVF_2DVERTEX *aVertex = m_aVertex; aVertex[0].vPos.x = x; aVertex[0].vPos.y = y; // 파이의 중심점 aVertex[0].dwColor = color; aVertex[1].vPos.x = x + (sinf(D2R(angStart)) * radius); // 시작각도 버텍스 하나 만들어줌 aVertex[1].vPos.y = y + (-cosf(D2R(angStart)) * radius); aVertex[1].dwColor = color; ang += angSlice; aVertex = &m_aVertex[2]; const FVF_2DVERTEX *pEnd = &m_aVertex[ MAX_2DVERTEX ]; int num = 0; while( ang < angEnd ) { if( ang >= angStart ) // 각도범위에 포함되면 버텍스를 추가 { float rAng = D2R(ang); // 디그리 각도를 라디안각도로 변환 aVertex->vPos.x = x + (sinf(rAng) * radius); aVertex->vPos.y = y + (-cosf(rAng) * radius); aVertex->dwColor = color; aVertex++; num++; // 삼각형 개수 if( aVertex > pEnd ) // 버퍼 오버플로우 되지 않도록 break; } ang += angSlice; } // 마지막각도에 버텍스 하나 더 추가 aVertex->vPos.x = x + (sinf(D2R(angEnd)) * radius); aVertex->vPos.y = y + (-cosf(D2R(angEnd)) * radius); aVertex->dwColor = color; num++; D3DXMATRIX m; D3DXMatrixIdentity( &m ); m_pd3dDevice->SetTexture( 0, NULL ); m_pd3dDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE ); m_pd3dDevice->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA ); m_pd3dDevice->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA ); m_pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_DISABLE ); m_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_DIFFUSE ); m_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1); m_pd3dDevice->SetTransform( D3DTS_WORLD, &m ); m_pd3dDevice->SetFVF( D3DFVF_2DVERTEX ); m_pd3dDevice->DrawPrimitiveUP( D3DPT_TRIANGLEFAN, num, m_aVertex, sizeof(FVF_2DVERTEX) ); */ }
OP_ERROR SOP_FluidSolver2D::cookMySop(OP_Context &context) { oldf = f; double t = context.getTime(); int f = context.getFrame(); UT_Interrupt *boss; GU_PrimVolume *volume; OP_Node::flags().timeDep = 1; fluidSolver->fps = OPgetDirector()->getChannelManager()->getSamplesPerSec(); int newResX = RESX(t); int newResY = RESY(t); if ( newResX != fluidSolver->res.x || newResY != fluidSolver->res.y) { fluidSolver->changeFluidRes(newResX,newResY); } UT_Vector3 fluidPos(POSX(t), POSY(t), POSZ(t)); UT_Vector3 fluidRot(ROTX(t), ROTY(t), ROTZ(t)); fluidRot.degToRad(); fluidSolver->fluidSize.x = FLUIDSIZEX(t); fluidSolver->fluidSize.y = FLUIDSIZEY(t); fluidSolver->borderNegX = BORDERNEGX(t); fluidSolver->borderPosX = BORDERPOSX(t); fluidSolver->borderNegY = BORDERNEGY(t); fluidSolver->borderPosY = BORDERPOSY(t); fluidSolver->preview = PREVIEW(t); fluidSolver->previewType = PREVIEWTYPE(t); fluidSolver->bounds = BOUNDS(t); fluidSolver->substeps = SUBSTEPS(t); fluidSolver->jacIter = JACITER(t); fluidSolver->densDis = DENSDIS(t); fluidSolver->densBuoyStrength = DENSBUOYSTRENGTH(t); float ddirX = DENSBUOYDIRX(t); float ddirY = DENSBUOYDIRY(t); fluidSolver->densBuoyDir = cu::make_float2(ddirX,ddirY); fluidSolver->velDamp = VELDAMP(t); fluidSolver->vortConf = VORTCONF(t); fluidSolver->noiseStr = NOISESTR(t); fluidSolver->noiseFreq = NOISEFREQ(t); fluidSolver->noiseOct = NOISEOCT(t); fluidSolver->noiseLacun = NOISELACUN(t); fluidSolver->noiseSpeed = NOISESPEED(t); fluidSolver->noiseAmp = NOISEAMP(t); if (error() < UT_ERROR_ABORT) { boss = UTgetInterrupt(); gdp->clearAndDestroy(); // Start the interrupt server if (boss->opStart("Building Volume")){ static float zero = 0.0; #ifdef HOUDINI_11 GB_AttributeRef fluidAtt = gdp->addAttrib("cudaFluidPreview", sizeof(int), GB_ATTRIB_INT, &zero); gdp->attribs().getElement().setValue<int>(fluidAtt, fluidSolver->preview); GB_AttributeRef solverIdAtt = gdp->addAttrib("solverId", sizeof(int), GB_ATTRIB_INT, &zero); gdp->attribs().getElement().setValue<int>(solverIdAtt, fluidSolver->id); #else GA_WOAttributeRef fluidAtt = gdp->addIntTuple(GA_ATTRIB_DETAIL, "cudaFluidPreview", 1); gdp->element().setValue<int>(fluidAtt, fluidSolver->preview); GA_WOAttributeRef solverIdAtt = gdp->addIntTuple(GA_ATTRIB_DETAIL, "solverId", 1); gdp->element().setValue<int>(solverIdAtt, fluidSolver->id); #endif UT_Matrix3 xform; const UT_XformOrder volXFormOrder; volume = (GU_PrimVolume *)GU_PrimVolume::build(gdp); #ifdef HOUDINI_11 volume->getVertex().getPt()->getPos() = fluidPos; #else volume->getVertexElement(0).getPt()->setPos(fluidPos); #endif xform.identity(); xform.scale(fluidSolver->fluidSize.x*0.5, fluidSolver->fluidSize.y*0.5, 0.25); xform.rotate(fluidRot.x(), fluidRot.y(), fluidRot.z(), volXFormOrder); volume->setTransform(xform); xform.identity(); xform.rotate(fluidRot.x(), fluidRot.y(), fluidRot.z(), volXFormOrder); xform.invert(); if(lockInputs(context) >= UT_ERROR_ABORT) return error(); if(getInput(0)){ GU_Detail* emittersInput = (GU_Detail*)inputGeo(0, context); GEO_PointList emittersList = emittersInput->points(); int numEmitters = emittersList.entries(); if (numEmitters != fluidSolver->nEmit) { delete fluidSolver->emitters; fluidSolver->nEmit = numEmitters; fluidSolver->emitters = new FluidEmitter[numEmitters]; } GEO_AttributeHandle radAh, amountAh; radAh = emittersInput->getPointAttribute("radius"); amountAh = emittersInput->getPointAttribute("amount"); for (int i = 0; i < numEmitters; i++) { UT_Vector4 emitPos = emittersList[i]->getPos(); UT_Vector3 emitPos3(emitPos); emitPos3 -= fluidPos; emitPos3 = emitPos3*xform; fluidSolver->emitters[i].posX = emitPos3.x(); fluidSolver->emitters[i].posY = emitPos3.y(); radAh.setElement(emittersList[i]); amountAh.setElement(emittersList[i]); fluidSolver->emitters[i].radius = radAh.getF(0); fluidSolver->emitters[i].amount = amountAh.getF(0); } } else { fluidSolver->nEmit = 0; } if(getInput(1)) { GU_Detail* collidersInput = (GU_Detail*)inputGeo(1, context); GEO_PointList collidersList = collidersInput->points(); int numColliders = collidersList.entries(); if (numColliders != fluidSolver->nColliders) { delete fluidSolver->colliders; fluidSolver->nColliders = numColliders; fluidSolver->colliders = new Collider[numColliders]; } GEO_AttributeHandle colRadAh; colRadAh = collidersInput->getPointAttribute("radius"); for (int i = 0; i < numColliders; i++) { UT_Vector4 colPos = collidersList[i]->getPos(); UT_Vector3 colPos3(colPos); colPos3 -= fluidPos; colPos3 = colPos3*xform; if (f > STARTFRAME(t)) { fluidSolver->colliders[i].oldPosX = fluidSolver->colliders[i].posX; fluidSolver->colliders[i].oldPosY = fluidSolver->colliders[i].posY; } else { fluidSolver->colliders[i].oldPosX = colPos3.x(); fluidSolver->colliders[i].oldPosY = colPos3.y(); } fluidSolver->colliders[i].posX = colPos3.x(); fluidSolver->colliders[i].posY = colPos3.y(); colRadAh.setElement(collidersList[i]); fluidSolver->colliders[i].radius = colRadAh.getF(0); } } else { fluidSolver->nColliders = 0; } unlockInputs(); if (f <= STARTFRAME(t)) { fluidSolver->resetFluid(); if (fluidSolver->preview != 1) { { UT_VoxelArrayWriteHandleF handle = volume->getVoxelWriteHandle(); handle->constant(0); } } } else { if (f!=oldf) { fluidSolver->solveFluid(); } if (fluidSolver->preview != 1) { cu::cudaMemcpy( fluidSolver->host_dens, fluidSolver->dev_dens, fluidSolver->res.x*fluidSolver->res.y*sizeof(float), cu::cudaMemcpyDeviceToHost ); { UT_VoxelArrayWriteHandleF handle = volume->getVoxelWriteHandle(); handle->size(fluidSolver->res.x, fluidSolver->res.y, 1); for (int i = 0; i < fluidSolver->res.x; i++) { for (int j = 0; j < fluidSolver->res.y; j++) { handle->setValue(i, j, 0, fluidSolver->host_dens[(j*fluidSolver->res.x + i)]); } } } } } select(GU_SPrimitive); } // Tell the interrupt server that we've completed. Must do this // regardless of what opStart() returns. boss->opEnd(); } gdp->notifyCache(GU_CACHE_ALL); return error(); }
static void blockIntra( mpeg_decode* dec, int pos ) { int j; idct_block_t *block; const uint16_t *table = vld_mpeg1; int qscale; dec->Codec.IDCT.Ptr->Process(dec->Codec.IDCT.Ptr,POSX(pos),POSY(pos)); block = dec->blockptr; qscale = dec->qscale; for (j=0;j<6;++j) { int bitpos; int len; ClearBlock(block); loadbits(dec); { int dct_dc_size, dct_dc_diff; dct_dc_diff = 0; dct_dc_size = j<4 ? getDCsizeLum(dec) : getDCsizeChr(dec); //max11bit if (dct_dc_size) dct_dc_diff = getDCdiff(dct_dc_size,dec); dct_dc_size = j<4 ? 0 : j-4+1; DEBUG_MSG2(DEBUG_VCODEC2,T("dc=%d diff=%d"), dec->last_dc[dct_dc_size]+dct_dc_diff, dct_dc_diff ); dct_dc_diff += dec->last_dc[dct_dc_size]; dec->last_dc[dct_dc_size] = dct_dc_diff; *block = (idct_block_t)(dct_dc_diff << 3); len = 1; } bitpos = dec->bitpos; for (;;) // event vld { int code,level; loadbits_pos(dec,bitpos); code = showbits_pos(dec,bitpos,16); vld_code; level = code & 63; if (level < 62) { level *= qscale; code >>= 6; code &= 63; len += code; // run if (len >= 64) break; code = dec->zigzag[len]; level *= dec->IntraMatrix[len]; level >>= 3; level = (level-1)|1; if (getbits1_pos(dec,bitpos)) level = -level; block[code] = (idct_block_t)level; ++len; } else { if (level==63) break; // this value is escaped loadbits_pos(dec,bitpos); len += showbits_pos(dec,bitpos,6); flushbits_pos(dec,bitpos,6); if (len >= 64) break; code = showbits_pos(dec,bitpos,8); flushbits_pos(dec,bitpos,8); level = (code << 24) >> 24; //sign extend the lower 8 bits code = dec->zigzag[len]; if (level == -128) { level = showbits_pos(dec,bitpos,8)-256; flushbits_pos(dec,bitpos,8); } else if (level == 0) { level = showbits_pos(dec,bitpos,8); flushbits_pos(dec,bitpos,8); } if (level<0) { level= -level; level *= qscale * dec->IntraMatrix[len]; level >>= 3; level= (level-1)|1; level= -level; block[code] = (idct_block_t)level; ++len; } else {
OP_ERROR SOP_FluidSolver3D::cookMySop(OP_Context &context) { oldf = f; f = context.getFrame(); double t = context.getTime(); fluidSolver->fps = OPgetDirector()->getChannelManager()->getSamplesPerSec(); UT_Interrupt *boss; GU_PrimVolume *volume; GU_PrimVolume *velXVolume; GU_PrimVolume *velYVolume; GU_PrimVolume *velZVolume; OP_Node::flags().timeDep = 1; int newResX = RESX(t); int newResY = RESY(t); int newResZ = RESZ(t); if ( newResX != fluidSolver->res.width || newResY != fluidSolver->res.height || newResZ != fluidSolver->res.depth) { fluidSolver->changeFluidRes(newResX,newResY,newResZ); } UT_Vector3 fluidPos(POSX(t), POSY(t), POSZ(t)); UT_Vector3 fluidRot(ROTX(t), ROTY(t), ROTZ(t)); fluidRot.degToRad(); fluidSolver->fluidSize.x = FLUIDSIZEX(t); fluidSolver->fluidSize.y = FLUIDSIZEY(t); fluidSolver->fluidSize.z = FLUIDSIZEZ(t); fluidSolver->borderNegX = BORDERNEGX(t); fluidSolver->borderPosX = BORDERPOSX(t); fluidSolver->borderNegY = BORDERNEGY(t); fluidSolver->borderPosY = BORDERPOSY(t); fluidSolver->borderNegZ = BORDERNEGZ(t); fluidSolver->borderPosZ = BORDERPOSZ(t); fluidSolver->substeps = SUBSTEPS(t); fluidSolver->jacIter = JACITER(t); fluidSolver->densDis = DENSDIS(t); fluidSolver->densBuoyStrength = DENSBUOYSTRENGTH(t); float ddirX = DENSBUOYDIRX(t); float ddirY = DENSBUOYDIRY(t); float ddirZ = DENSBUOYDIRZ(t); fluidSolver->densBuoyDir = cu::make_float3(ddirX,ddirY,ddirZ); fluidSolver->velDamp = VELDAMP(t); fluidSolver->vortConf = VORTCONF(t); fluidSolver->noiseStr = NOISESTR(t); fluidSolver->noiseFreq = NOISEFREQ(t); fluidSolver->noiseOct = NOISEOCT(t); fluidSolver->noiseLacun = NOISELACUN(t); fluidSolver->noiseSpeed = NOISESPEED(t); fluidSolver->noiseAmp = NOISEAMP(t); fluidSolver->preview = PREVIEW(t); fluidSolver->drawCube = DRAWCUBE(t); fluidSolver->opaScale = OPASCALE(t); fluidSolver->stepMul = STEPMUL(t); fluidSolver->displayRes = DISPLAYRES(t); fluidSolver->doShadows = DOSHADOWS(t); float lightPosX = LIGHTPOSX(t); float lightPosY = LIGHTPOSY(t); float lightPosZ = LIGHTPOSZ(t); fluidSolver->lightPos = cu::make_float3(lightPosX,lightPosY,lightPosZ); fluidSolver->shadowDens = SHADOWDENS(t); fluidSolver->shadowStepMul = SHADOWSTEPMUL(t); fluidSolver->shadowThres = SHADOWTHRES(t); fluidSolver->displaySlice = DISPLAYSLICE(t); fluidSolver->sliceType = SLICETYPE(t); fluidSolver->sliceAxis = SLICEAXIS(t); fluidSolver->slicePos = SLICEPOS(t); fluidSolver->sliceBounds = SLICEBOUNDS(t); if (error() < UT_ERROR_ABORT) { boss = UTgetInterrupt(); gdp->clearAndDestroy(); // Start the interrupt server if (boss->opStart("Building Volume")){ static float zero = 0.0; GB_AttributeRef fluidAtt = gdp->addAttrib("cudaFluid3DPreview", sizeof(int), GB_ATTRIB_INT, &zero); gdp->attribs().getElement().setValue<int>(fluidAtt, fluidSolver->preview); GB_AttributeRef fluidSliceAtt = gdp->addAttrib("sliceDisplay", sizeof(int), GB_ATTRIB_INT, &zero); gdp->attribs().getElement().setValue<int>(fluidSliceAtt, fluidSolver->displaySlice); GB_AttributeRef solverIdAtt = gdp->addAttrib("solverId", sizeof(int), GB_ATTRIB_INT, &zero); gdp->attribs().getElement().setValue<int>(solverIdAtt, fluidSolver->id); GEO_AttributeHandle name_gah; int def = -1; gdp->addPrimAttrib("name", sizeof(int), GB_ATTRIB_INDEX, &def); name_gah = gdp->getPrimAttribute("name"); UT_Matrix3 xform; const UT_XformOrder volXFormOrder; volume = (GU_PrimVolume *)GU_PrimVolume::build(gdp); volume->getVertex().getPt()->getPos() = fluidPos; xform.identity(); xform.scale(fluidSolver->fluidSize.x*0.5, fluidSolver->fluidSize.y*0.5, fluidSolver->fluidSize.z*0.5); xform.rotate(fluidRot.x(), fluidRot.y(), fluidRot.z(), volXFormOrder); volume->setTransform(xform); name_gah.setElement(volume); name_gah.setString("density"); velXVolume = (GU_PrimVolume *)GU_PrimVolume::build(gdp); velXVolume->getVertex().getPt()->getPos() = fluidPos; velXVolume->setTransform(xform); name_gah.setElement(velXVolume); name_gah.setString("vel.x"); velYVolume = (GU_PrimVolume *)GU_PrimVolume::build(gdp); velYVolume->getVertex().getPt()->getPos() = fluidPos; velYVolume->setTransform(xform); name_gah.setElement(velYVolume); name_gah.setString("vel.y"); velZVolume = (GU_PrimVolume *)GU_PrimVolume::build(gdp); velZVolume->getVertex().getPt()->getPos() = fluidPos; velZVolume->setTransform(xform); name_gah.setElement(velZVolume); name_gah.setString("vel.z"); xform.identity(); xform.rotate(fluidRot.x(), fluidRot.y(), fluidRot.z(), volXFormOrder); xform.invert(); if(lockInputs(context) >= UT_ERROR_ABORT) return error(); if(getInput(0)){ GU_Detail* emittersInput = (GU_Detail*)inputGeo(0, context); GEO_PointList emittersList = emittersInput->points(); int numEmitters = emittersList.entries(); if (numEmitters != fluidSolver->nEmit) { delete fluidSolver->emitters; fluidSolver->nEmit = numEmitters; fluidSolver->emitters = new VHFluidEmitter[numEmitters]; } GEO_AttributeHandle radAh, amountAh; radAh = emittersInput->getPointAttribute("radius"); amountAh = emittersInput->getPointAttribute("amount"); for (int i = 0; i < numEmitters; i++) { UT_Vector4 emitPos = emittersList[i]->getPos(); UT_Vector3 emitPos3(emitPos); emitPos3 -= fluidPos; emitPos3 = emitPos3*xform; fluidSolver->emitters[i].posX = emitPos3.x(); fluidSolver->emitters[i].posY = emitPos3.y(); fluidSolver->emitters[i].posZ = emitPos3.z(); radAh.setElement(emittersList[i]); amountAh.setElement(emittersList[i]); fluidSolver->emitters[i].radius = radAh.getF(0); fluidSolver->emitters[i].amount = amountAh.getF(0); } } else { fluidSolver->nEmit = 0; } if(getInput(1)) { GU_Detail* collidersInput = (GU_Detail*)inputGeo(1, context); GEO_PointList collidersList = collidersInput->points(); int numColliders = collidersList.entries(); if (numColliders != fluidSolver->nColliders) { delete fluidSolver->colliders; fluidSolver->nColliders = numColliders; fluidSolver->colliders = new VHFluidCollider[numColliders]; } GEO_AttributeHandle colRadAh; colRadAh = collidersInput->getPointAttribute("radius"); for (int i = 0; i < numColliders; i++) { UT_Vector4 colPos = collidersList[i]->getPos(); UT_Vector3 colPos3(colPos); colPos3 -= fluidPos; colPos3 = colPos3*xform; if (f > STARTFRAME(t)) { fluidSolver->colliders[i].oldPosX = fluidSolver->colliders[i].posX; fluidSolver->colliders[i].oldPosY = fluidSolver->colliders[i].posY; fluidSolver->colliders[i].oldPosZ = fluidSolver->colliders[i].posZ; } else { fluidSolver->colliders[i].oldPosX = colPos3.x(); fluidSolver->colliders[i].oldPosY = colPos3.y(); fluidSolver->colliders[i].oldPosZ = colPos3.z(); } fluidSolver->colliders[i].posX = colPos3.x(); fluidSolver->colliders[i].posY = colPos3.y(); fluidSolver->colliders[i].posZ = colPos3.z(); colRadAh.setElement(collidersList[i]); fluidSolver->colliders[i].radius = colRadAh.getF(0); } } else { fluidSolver->nColliders = 0; } unlockInputs(); if (f <= STARTFRAME(t)) { fluidSolver->resetFluid(); if (COPYDENS(t)) { { UT_VoxelArrayWriteHandleF handle = volume->getVoxelWriteHandle(); handle->constant(0); UT_VoxelArrayWriteHandleF velXHandle = velXVolume->getVoxelWriteHandle(); velXHandle->constant(0); UT_VoxelArrayWriteHandleF velYHandle = velYVolume->getVoxelWriteHandle(); velYHandle->constant(0); UT_VoxelArrayWriteHandleF velZHandle = velZVolume->getVoxelWriteHandle(); velZHandle->constant(0); } } } else { if (f!=oldf) { fluidSolver->solveFluid(); } if (COPYDENS(t)) { cu::cudaMemcpy( fluidSolver->host_dens, fluidSolver->dev_dens, fluidSolver->res.width*fluidSolver->res.height*fluidSolver->res.depth*sizeof(float), cu::cudaMemcpyDeviceToHost ); { UT_VoxelArrayWriteHandleF handle = volume->getVoxelWriteHandle(); handle->size(fluidSolver->res.width, fluidSolver->res.height, fluidSolver->res.depth); for (int i = 0; i < fluidSolver->res.width; i++) { for (int j = 0; j < fluidSolver->res.height; j++) { for (int k = 0; k < fluidSolver->res.depth; k++) { handle->setValue(i, j, k, fluidSolver->host_dens[k*fluidSolver->res.width*fluidSolver->res.height + j*fluidSolver->res.width + i]); } } } } if (COPYVEL(t)) { cu::cudaMemcpy( fluidSolver->host_vel, fluidSolver->dev_vel, fluidSolver->res.width*fluidSolver->res.height*fluidSolver->res.depth*sizeof(cu::float4), cu::cudaMemcpyDeviceToHost ); { UT_VoxelArrayWriteHandleF velXHandle = velXVolume->getVoxelWriteHandle(); velXHandle->size(fluidSolver->res.width, fluidSolver->res.height, fluidSolver->res.depth); UT_VoxelArrayWriteHandleF velYHandle = velYVolume->getVoxelWriteHandle(); velYHandle->size(fluidSolver->res.width, fluidSolver->res.height, fluidSolver->res.depth); UT_VoxelArrayWriteHandleF velZHandle = velZVolume->getVoxelWriteHandle(); velZHandle->size(fluidSolver->res.width, fluidSolver->res.height, fluidSolver->res.depth); for (int i = 0; i < fluidSolver->res.width; i++) { for (int j = 0; j < fluidSolver->res.height; j++) { for (int k = 0; k < fluidSolver->res.depth; k++) { velXHandle->setValue(i, j, k, fluidSolver->host_vel[4*(k*fluidSolver->res.width*fluidSolver->res.height + j*fluidSolver->res.width + i)]); velYHandle->setValue(i, j, k, fluidSolver->host_vel[4*(k*fluidSolver->res.width*fluidSolver->res.height + j*fluidSolver->res.width + i)+1]); velZHandle->setValue(i, j, k, fluidSolver->host_vel[4*(k*fluidSolver->res.width*fluidSolver->res.height + j*fluidSolver->res.width + i)+2]); } } } } } } } select(GU_SPrimitive); } // Tell the interrupt server that we've completed. Must do this // regardless of what opStart() returns. boss->opEnd(); } gdp->notifyCache(GU_CACHE_ALL); return error(); }