void YARPDispMap::getDisparity( unsigned char * img1, unsigned char * img2, unsigned char * disparity) { unsigned char * DSet1 = (unsigned char*) _DataSet1.GetRawBuffer(); unsigned char * DSet2 = (unsigned char*) _DataSet2.GetRawBuffer(); // unsigned char * image1 = (unsigned char*) img1.GetRawBuffer(); // unsigned char * image2 = (unsigned char*) img2.GetRawBuffer(); // int * dispOffset; // int * tmpDisparity; int imgOffset; node * graph; int top, bottom; int totNodes= 0; int totArcs = 0; int length; int graphSize; int i,j,k,n,m; getImageSet(img1, DSet1); getImageSet(img2, DSet2); int levels = (int)(0.5+log(_xSize)/log(2.0)); unsigned char * data1; unsigned char * data2; for (j=0; j<_totSize; j++) { _dispOffset[j] = 0; _tmpDisp[j] = INT_MAX; } bool found; for (length = _xSize/8; length<=_xSize; length*=2) { graphSize = length*_deltaDisp+2; //Graph Allocation graph = new node [graphSize]; graph[0].foll_nodes = new int [4*graphSize*(_deltaDisp+2)]; graph[0].arcweight = new float [4*graphSize*(_deltaDisp+2)]; //End Allocation memset(disparity,255,length*length); imgOffset = _totSize-(4*length*length-1)/3; data1 = DSet1 + imgOffset; data2 = DSet2 + imgOffset; top = 0; bottom = length-1; found = false; for (j=1; j<length; j++) for (i=1; i<length; i++) { if(data1[j*length+i]!=0) { top = j; j = length; found = true; break; } } if (!found) { delete [] graph[0].foll_nodes; delete [] graph[0].arcweight; delete [] graph; // delete [] dispOffset; // delete [] tmpDisparity; // delete [] leftDataSet; /// delete [] rightDataSet; // delete [] Sobel; return; } for (j=top; j<length; j++) for (i=1; i<length; i++) { if(data2[j*length+i]!=0) { top = j; j = length; break; } } for (j=length-1; j>=top; j--) for (i=length-1; i>=0; i--) { if(data1[j*length+i]!=0) { bottom = j; j = 0; break; } } for (j=bottom; j>=top; j--) for (i=length-1; i>=0; i--) { if(data2[j*length+i]!=0) { bottom = j; j = 0; break; } } for (j=1; j<length-1; j++) for (i=1; i<length-1; i++) { _sobel[j*length+i] = data1[(j-1)*length+(i-1)]+2*data1[(j-1)*length+(i)]+data1[(j-1)*length+(i+1)]; _sobel[j*length+i] += -data1[(j+1)*length+(i-1)]-2*data1[(j+1)*length+(i)]-data1[(j+1)*length+(i+1)]; } int ls,le; int rs,re; for (j=top; j<=bottom; j++) { data1 = DSet1 + imgOffset + j*length; data2 = DSet2 + imgOffset + j*length; ls = 0; le = length-1; rs = 0; re = length-1; for (i=0;i<length; i++) { if (data1[i] != 0) { ls = i; for (m=length-1;m>=0; m--) if(data1[m] != 0) { le = m; break; } break; } } for (i=0;i<length; i++) { if (data2[i] != 0) { rs = i; for (m=length-1;m>=0; m--) if(data2[m] != 0) { re = m; break; } break; } } int maxR = 0; int minR = length; int position; for (i=ls; i<=le; i++) { position = -(*(_dispOffset+imgOffset+j*length+i)); position +=i; if (position+_maxDisp>maxR) maxR = position+_maxDisp; if (position+_minDisp<minR) minR = position+_minDisp; } buildGraph2D(graph, le-ls+1,maxR-minR+1,ls,minR, _dispOffset+imgOffset+j*length, &totNodes, &totArcs); if ((j==0)||(j==length-1)) assignWeights(graph,length,data1,data2,_sobel, _tmpDisp, -1.0f, totArcs, totNodes); else assignWeights(graph,length,data1,data2,&_sobel[(j)*length], &_tmpDisp[imgOffset+(j-1)*length], _alpha, totArcs, totNodes) ; dynProgr(totNodes, graph); i = totNodes-1; //printf("Line: %d. Vertical Disparity: %d. Cost: %f\n",j,l,graph[i].pathweight); // if (graph[i].pathweight < cost) // { // cost = graph[i].pathweight; // vd = l; // } memset (&_tmpDisp[imgOffset+j*length],0, length*sizeof(int)); for (k=0; k<=4*length; k++) { n = graph[i].prevNode; if (k!=0) { _tmpDisp[imgOffset+j*length+graph[i].left]= graph[i].left-graph[i].right; // if (j==length-2) // printf("Length: %d, Disparity=%d\n",length,tmpDisparity[imgOffset+j*length+graph[i].left]); disparity[j*length+graph[i].left] = (4*(graph[i].left-graph[i].right)+128); m = graph[i].left; } i=n; if((i<=0)||(i>totNodes-1)) break; }//end k for // printf("Line: %d. Vertical Disparity: %d. Cost: %f\n",j,vd,cost); int a,b; //Process discontinuities in tmpDisparity if (disparity[j*length]==255) //Occlusion in zero//e se sono tutti zero??? { for (k=0; k<length; k++) { if (disparity[j*length+k]!= 255) break; } if(k<length) for (m=0; m<k; m++) _tmpDisp[imgOffset+j*length+m]=_tmpDisp[imgOffset+j*length+k]; } else if (disparity[j*length+length-1]==255) { for (k=length-1; k>=0; k--) { if (disparity[j*length+k]!= 255) break; } for (m=k+1; m<length; m++) _tmpDisp[imgOffset+j*length+m]=_tmpDisp[imgOffset+j*length+k]; } else { for (k=0; k<length; k++) { if (disparity[j*length+k]== 255) { for (m=k; m<length; m++) { if (disparity[j*length+m]!= 255) { for (n=k; n<m; n++) { a = m-k+1; b = _tmpDisp[imgOffset+j*length+m]-_tmpDisp[imgOffset+j*length+k-1]; if (((n-k+1)*b/a)+_tmpDisp[imgOffset+j*length+k-1]>0) _tmpDisp[imgOffset+j*length+n] = (int)( ((n-k+1)*b/a)+_tmpDisp[imgOffset+j*length+k-1]+0.5f); else _tmpDisp[imgOffset+j*length+n] = (int)( ((n-k+1)*b/a)+_tmpDisp[imgOffset+j*length+k-1]-0.5f); } m=length; } } k=n; } } }//endif if (length<_xSize) { for (k=0; k<length; k++) { if (_tmpDisp[imgOffset+j*length+k]!=INT_MAX) { _dispOffset[imgOffset-4*length*length+2*j*2*length+2*k] = 2*_tmpDisp[imgOffset+j*length+k]; _dispOffset[imgOffset-4*length*length+2*j*2*length+2*k+1] = 2*_tmpDisp[imgOffset+j*length+k]; _dispOffset[imgOffset-4*length*length+(2*j+1)*2*length+2*k] = 2*_tmpDisp[imgOffset+j*length+k]; _dispOffset[imgOffset-4*length*length+(2*j+1)*2*length+2*k+1] = 2*_tmpDisp[imgOffset+j*length+k]; } } }//endif }//endj // sprintf(File_Name,"%s%d%s","C:/Users/Fabio/Projects/DinamicDisparity/Images/_dpoutput",length,".bmp"); // Save_Bitmap(dispImg,length,length,1,File_Name); // endTime = Get_Time(); // printf("Time Elapsed: %d msec\n", endTime-startTime); //Graph Deallocation delete [] graph[0].foll_nodes; delete [] graph[0].arcweight; delete [] graph; //End Deallocation } // delete [] dispOffset; // delete [] tmpDisparity; // delete [] leftDataSet; // delete [] rightDataSet; // delete [] Sobel; //Disparity Inversion /* unsigned char * invDisp; // invDisp = new unsigned char [xSize*ySize]; memset(invDisp,255,xSize*ySize); for (j=0; j<ySize; j++) for (i=0; i<xSize; i++) { if (dispImg[j*xSize+i]!=255) k = (dispImg[j*xSize+i]-128)/8; if( ((i-k)>=0)&&((i-k)<xSize) ) invDisp[j*xSize+(i-k)] = (-k*8)+128; } sprintf(File_Name,"%s%d%s","C:/Users/Fabio/Projects/DinamicDisparity/Images/_dpoutput_inv",xSize,".bmp"); Save_Bitmap(invDisp,xSize,xSize,1,File_Name); */ // endTime = Get_Time(); // printf("Line : %d, Time Elapsed: %d msec\n",j, endTime-startTime); }
ParticleEmitter::ParticleEmitter(const XmlNodePtrConst emitterNode, Particle *const target, Map *const map, const int rotation, const std::string& dyePalettes) : mParticleTarget(target), mMap(map), mParticleImage(nullptr), mOutputPauseLeft(0), mDeathEffectConditions(0), mParticleFollow(false) { // Initializing default values mParticlePosX.set(0.0F); mParticlePosY.set(0.0F); mParticlePosZ.set(0.0F); mParticleAngleHorizontal.set(0.0F); mParticleAngleVertical.set(0.0F); mParticlePower.set(0.0F); mParticleGravity.set(0.0F); mParticleRandomness.set(0); mParticleBounce.set(0.0F); mParticleAcceleration.set(0.0F); mParticleDieDistance.set(-1.0F); mParticleMomentum.set(1.0F); mParticleLifetime.set(-1); mParticleFadeOut.set(0); mParticleFadeIn.set(0); mOutput.set(1); mOutputPause.set(0); mParticleAlpha.set(1.0F); for_each_xml_child_node(propertyNode, emitterNode) { if (xmlNameEqual(propertyNode, "property")) { const std::string name = XML::getProperty( propertyNode, "name", ""); if (name == "position-x") { mParticlePosX = readParticleEmitterProp(propertyNode, 0.0F); } else if (name == "position-y") { mParticlePosY = readParticleEmitterProp(propertyNode, 0.0F); mParticlePosY.minVal *= SIN45; mParticlePosY.maxVal *= SIN45; mParticlePosY.changeAmplitude *= SIN45; } else if (name == "position-z") { mParticlePosZ = readParticleEmitterProp(propertyNode, 0.0F); mParticlePosZ.minVal *= SIN45; mParticlePosZ.maxVal *= SIN45; mParticlePosZ.changeAmplitude *= SIN45; } else if (name == "image") { std::string image = XML::getProperty( propertyNode, "value", ""); // Don't leak when multiple images are defined if (!image.empty() && !mParticleImage) { if (!dyePalettes.empty()) Dye::instantiate(image, dyePalettes); ResourceManager *const resman = ResourceManager::getInstance(); mParticleImage = resman->getImage(image); } } else if (name == "subimage") { std::string image = XML::getProperty( propertyNode, "value", ""); // Don't leak when multiple images are defined if (!image.empty() && !mParticleImage) { if (!dyePalettes.empty()) Dye::instantiate(image, dyePalettes); ResourceManager *const resman = ResourceManager::getInstance(); Image *img = resman->getImage(image); if (img) { mParticleImage = resman->getSubImage(img, XML::getProperty(propertyNode, "x", 0), XML::getProperty(propertyNode, "y", 0), XML::getProperty(propertyNode, "width", 0), XML::getProperty(propertyNode, "height", 0)); img->decRef(); } else { mParticleImage = nullptr; } } } else if (name == "horizontal-angle") { mParticleAngleHorizontal = readParticleEmitterProp(propertyNode, 0.0F); mParticleAngleHorizontal.minVal += static_cast<float>(rotation); mParticleAngleHorizontal.minVal *= DEG_RAD_FACTOR; mParticleAngleHorizontal.maxVal += static_cast<float>(rotation); mParticleAngleHorizontal.maxVal *= DEG_RAD_FACTOR; mParticleAngleHorizontal.changeAmplitude *= DEG_RAD_FACTOR; } else if (name == "vertical-angle") { mParticleAngleVertical = readParticleEmitterProp(propertyNode, 0.0F); mParticleAngleVertical.minVal *= DEG_RAD_FACTOR; mParticleAngleVertical.maxVal *= DEG_RAD_FACTOR; mParticleAngleVertical.changeAmplitude *= DEG_RAD_FACTOR; } else if (name == "power") { mParticlePower = readParticleEmitterProp(propertyNode, 0.0F); } else if (name == "gravity") { mParticleGravity = readParticleEmitterProp(propertyNode, 0.0F); } else if (name == "randomnes" || name == "randomness") // legacy bug { mParticleRandomness = readParticleEmitterProp(propertyNode, 0); } else if (name == "bounce") { mParticleBounce = readParticleEmitterProp(propertyNode, 0.0F); } else if (name == "lifetime") { mParticleLifetime = readParticleEmitterProp(propertyNode, 0); mParticleLifetime.minVal += 1; } else if (name == "output") { mOutput = readParticleEmitterProp(propertyNode, 0); mOutput.maxVal += 1; } else if (name == "output-pause") { mOutputPause = readParticleEmitterProp(propertyNode, 0); mOutputPauseLeft = mOutputPause.value(0); } else if (name == "acceleration") { mParticleAcceleration = readParticleEmitterProp( propertyNode, 0.0F); } else if (name == "die-distance") { mParticleDieDistance = readParticleEmitterProp( propertyNode, 0.0F); } else if (name == "momentum") { mParticleMomentum = readParticleEmitterProp( propertyNode, 1.0F); } else if (name == "fade-out") { mParticleFadeOut = readParticleEmitterProp(propertyNode, 0); } else if (name == "fade-in") { mParticleFadeIn = readParticleEmitterProp(propertyNode, 0); } else if (name == "alpha") { mParticleAlpha = readParticleEmitterProp(propertyNode, 1.0F); } else if (name == "follow-parent") { const std::string value = XML::getProperty(propertyNode, "value", "0"); if (value == "1" || value == "true") mParticleFollow = true; } else { logger->log("Particle Engine: Warning, " "unknown emitter property \"%s\"", name.c_str()); } } else if (xmlNameEqual(propertyNode, "emitter")) { ParticleEmitter newEmitter(propertyNode, mParticleTarget, map, rotation, dyePalettes); mParticleChildEmitters.push_back(newEmitter); } else if (xmlNameEqual(propertyNode, "rotation") || xmlNameEqual(propertyNode, "animation")) { ImageSet *const imageset = getImageSet(propertyNode); if (!imageset) { logger->log1("Error: no valid imageset"); continue; } mTempSets.push_back(imageset); Animation &animation = (xmlNameEqual(propertyNode, "rotation")) ? mParticleRotation : mParticleAnimation; // Get animation frames for_each_xml_child_node(frameNode, propertyNode) { const int delay = XML::getIntProperty( frameNode, "delay", 0, 0, 100000); const int offsetX = XML::getProperty(frameNode, "offsetX", 0) - imageset->getWidth() / 2 + mapTileSize / 2; const int offsetY = XML::getProperty(frameNode, "offsetY", 0) - imageset->getHeight() + mapTileSize; const int rand = XML::getIntProperty( frameNode, "rand", 100, 0, 100); if (xmlNameEqual(frameNode, "frame")) { const int index = XML::getProperty(frameNode, "index", -1); if (index < 0) { logger->log1("No valid value for 'index'"); continue; } Image *const img = imageset->get(index); if (!img) { logger->log("No image at index %d", index); continue; } animation.addFrame(img, delay, offsetX, offsetY, rand); } else if (xmlNameEqual(frameNode, "sequence")) { int start = XML::getProperty(frameNode, "start", -1); const int end = XML::getProperty(frameNode, "end", -1); if (start < 0 || end < 0) { logger->log1("No valid value for 'start' or 'end'"); continue; } while (end >= start) { Image *const img = imageset->get(start); if (!img) { logger->log("No image at index %d", start); continue; } animation.addFrame(img, delay, offsetX, offsetY, rand); start ++; } } else if (xmlNameEqual(frameNode, "end")) { animation.addTerminator(rand); } } // for frameNode } else if (xmlNameEqual(propertyNode, "deatheffect"))