00001
00009 #include "lv3d1_server.h"
00010
00011
00012 int LV3D_Disable_Render_Prio;
00013 int LV3D_Verbosity;
00014
00019 unsigned int LV3D_build_priority(int frameNo,double prioAdj) {
00020 if (LV3D_Disable_Render_Prio) return 0;
00021 const double prioMax=1.0;
00022 if (!(prioAdj<prioMax)) prioAdj=prioMax;
00023 return 0xC0000000u+frameNo-(int)(1000*prioAdj);
00024 }
00025
00026
00027
00028
00029 class impl_LV3D_Array {
00030 LV3D_Array *array;
00031
00032 CkViewable *viewable;
00033
00034
00035
00037 CkView *view;
00038 CkVector3d lastCamera;
00039
00040 void flush(void) {
00041 if (view) view->unref();
00042 view=NULL;
00043 renderRequested=false;
00044 }
00045 bool renderRequested;
00046 CkViewpoint renderViewpoint;
00047 int renderFrameID;
00048 void renderUpdate(const LV3D_ViewpointMsg *m) {
00049 renderViewpoint=m->viewpoint;
00050 renderFrameID=m->frameID;
00051 }
00052
00053 CkViewableID makeViewableID(int vi) {
00054 CkViewableID ret;
00055 int i;
00056 for (i=0;i<array->thisIndexMax.nInts;i++)
00057 ret.id[i]=array->thisIndexMax.data()[i];
00058 for (;i<3;i++)
00059 ret.id[i]=0;
00060 ret.id[3]=vi;
00061 return ret;
00062 }
00063 void status(const char *where) {
00064
00065 }
00066 public:
00067 impl_LV3D_Array(LV3D_Array *array_) :array(array_) {
00068 viewable=NULL;
00069 view=NULL;
00070 renderRequested=false;
00071 }
00072 ~impl_LV3D_Array() {
00073
00074 flush();
00075 }
00076
00077 inline void add(CkViewable *v_) {
00078 if (viewable) CkAbort("LV3D_Array::addViewable> Added too many viewables!\n");
00079 viewable=v_;
00080 }
00081 inline void remove(CkViewable *v_) {
00082 if (!viewable) CkAbort("LV3D_Array::removeViewable> No viewable to remove!\n");
00083 if (viewable!=v_) CkAbort("LV3D_Array::removeViewable> Can't remove wrong viewable!\n");
00084 viewable=NULL;
00085 flush();
00086 }
00087
00088 inline void newClient(int clientID) {
00089
00090 flush();
00091 }
00092
00098 void viewpoint(const LV3D_ViewpointMsg *m) {
00099 if (renderRequested)
00100 {
00101 status("Updating pending render...\n");
00102 renderUpdate(m);
00103 }
00104 else if (viewable) {
00105 if ((!view) || viewable->shouldRender(m->viewpoint,*view))
00106 {
00107 status("Reqesting rendering...\n");
00108 renderRequested=true;
00109 renderUpdate(m);
00110 double sizeAdjust=viewable->getSize(renderViewpoint);
00111 LV3D_RenderMsg *rm= LV3D_RenderMsg::new_(
00112 m->clientID,m->frameID,0,sizeAdjust);
00113 array->thisProxy[array->thisIndexMax].LV3D_Render(rm);
00114 }
00115 }
00116 }
00117
00121 void render(LV3D_RenderMsg *m) {
00122 status("Rendering...\n");
00123 CkView *v=viewable->renderView(renderViewpoint);
00124 flush();
00125 if (v) {
00126 view=v;
00127 view->id=makeViewableID(0);
00128
00129 double sizeAdjust=viewable->getSize(renderViewpoint);
00130 view->prio=LV3D_build_priority(renderFrameID,sizeAdjust);
00131 LV3D0_Deposit(view,m->clientID);
00132 }
00133 LV3D_RenderMsg::delete_(m);
00134 }
00135
00136 #if LV3D_USE_FLAT
00137 void LV3D_FlatRender(liveVizRequestMsg *m,LV3D_Array *arr);
00138 #endif
00139
00140 };
00141
00142
00143 void LV3D_Array::init(void) {
00144 impl=new impl_LV3D_Array(this);
00145 usesAtSync=CmiTrue;
00146 }
00147
00148 void LV3D_Array::addViewable(CkViewable *v) {
00149 impl->add(v);
00150 }
00151 void LV3D_Array::removeViewable(CkViewable *v) {
00152 impl->remove(v);
00153 }
00154 void LV3D_Array::pup(PUP::er &p) {
00155 CBase_LV3D_Array::pup(p);
00156
00157 if (LV3D_Verbosity>1) {
00158 const int *data=thisIndexMax.data();
00159 CkPrintf("LV3DArray(%d,%d,%d) pup on PE %d\n",
00160 data[0],data[1],data[2],CkMyPe());
00161 }
00162 }
00163
00164 LV3D_Array::~LV3D_Array() {
00165 delete impl;
00166 impl=NULL;
00167 }
00168
00169
00173 void LV3D_Array::LV3D_NewClient(int clientID)
00174 {
00175 impl->newClient(clientID);
00176 }
00177
00179 void LV3D_Array::LV3D_DoBalance(void) {
00180 AtSync();
00181 }
00182
00188 void LV3D_Array::LV3D_Viewpoint(LV3D_ViewpointMsg *m)
00189 {
00190 LV3D_Prepare();
00191 impl->viewpoint(m);
00192 }
00193
00197 void LV3D_Array::LV3D_Render(LV3D_RenderMsg *m)
00198 {
00199 impl->render(m);
00200 }
00201
00206 void LV3D_Array::LV3D_FlatRender(liveVizRequestMsg *m)
00207 {
00208 #if LV3D_USE_FLAT
00209 LV3D_Prepare();
00210 impl->LV3D_FlatRender(m,this);
00211 #endif
00212 }
00213
00214 void LV3D_Array::LV3D_Prepare(void) {}
00215
00216 #if LV3D_USE_FLAT
00217 void impl_LV3D_Array::LV3D_FlatRender(liveVizRequestMsg *m,LV3D_Array *arr)
00218 {
00219 {
00220 if (!viewable) goto skipit;
00221 CkViewpoint vp;
00222 liveVizRequestUnpack(m,vp);
00223 CkQuadView *v=(CkQuadView *)viewable->renderView(vp);
00224 if (v==NULL) goto skipit;
00225 CkVector3d topLeft=vp.project(v->corners[0]);
00226 CkAllocImage &src=v->getImage();
00227 int w=src.getWidth(), h=src.getHeight();
00228 CkAllocImage dest(w, h, 3);
00229 int x,y;
00230 for (y=0;y<h;y++) {
00231 unsigned char *i=src.getPixel(0,y);
00232 const int ip=4;
00233 int r, g, b;
00234 if (src.getLayout()==CkImage::layout_reversed)
00235 {r=2; g=1; b=0;}
00236 else
00237 {r=1; g=2; b=3;}
00238 unsigned char *o=dest.getPixel(0,y);
00239 const int op=3;
00240 for (x=0;x<w;x++) {
00241 o[op*x+0] = i[x*ip+r];
00242 o[op*x+1] = i[x*ip+g];
00243 o[op*x+2] = i[x*ip+b];
00244 }
00245 }
00246 x=(int)(topLeft.x+0.5), y=(int)(topLeft.y+0.5);
00247 liveVizDeposit(m, x,y, w,h, dest.getData(), arr);
00248 delete v;
00249 return;
00250 }
00251 skipit:
00252
00253 liveVizDeposit(m, 0,0, 0,0, 0, arr);
00254 }
00255 #endif
00256
00257
00258
00259
00260
00261 class LV3D1_Map : public CkArrayMap {
00262 unsigned int shiftPE, numPE;
00263 void init(void) {
00264 shiftPE=0;
00265 numPE=CkNumPes();
00266 if (numPE>1) {
00267 shiftPE=1;
00268 numPE-=shiftPE;
00269 }
00270 }
00271 public:
00272 LV3D1_Map() {init();}
00273 LV3D1_Map(CkMigrateMessage *m):CkArrayMap(m){init();}
00274
00275 int procNum(int arrayHdl, const CkArrayIndex &i)
00276 {
00277 #if 1
00278 if (i.nInts==1) {
00279
00280 return shiftPE+((i.data()[0])%numPE);
00281 }
00282 else
00283 #endif
00284 {
00285
00286 unsigned int hash=(i.hash()+739)%1280107;
00287 return shiftPE+(hash % numPE);
00288 }
00289 }
00290 };
00291
00292 void LV3D1_Attach(CkArrayOptions &opts)
00293 {
00294 opts.setMap(CProxy_LV3D1_Map::ckNew());
00295 }
00296
00297
00298
00300 LV3D_RenderMsg *LV3D_RenderMsg::new_(
00301 int client,int frame,int viewable,double prioAdj)
00302 {
00303 int prioBits=8*sizeof(prioAdj);
00304 LV3D_RenderMsg *m=new (prioBits) LV3D_RenderMsg;
00305 m->clientID=client;
00306 m->frameID=frame;
00307 m->viewableID=viewable;
00308 unsigned int *p=(unsigned int *)CkPriorityPtr(m);
00309 p[0]=LV3D_build_priority(frame,prioAdj);
00310 if (LV3D_Disable_Render_Prio) p[0]=0;
00311 CkSetQueueing(m,CK_QUEUEING_BFIFO);
00312 return m;
00313 }
00314 void LV3D_RenderMsg::delete_(LV3D_RenderMsg *m) {
00315 delete m;
00316 }
00317
00318 void LV3D1_ServerMgr::doBalance(void)
00319 {
00320 a.LV3D_DoBalance();
00321 }
00322
00323 void LV3D1_Init(CkArrayID aid,LV3D_Universe *theUniverse)
00324 {
00325 LV3D0_Init(theUniverse,new LV3D1_ServerMgr(aid));
00326 #if LV3D_USE_FLAT
00327
00328 CkCallback flatUpdate(CkIndex_LV3D_Array::LV3D_FlatRender(0),aid);
00329 liveVizInit(liveVizConfig(true,false),aid,flatUpdate);
00330 #endif
00331 }
00332
00333
00334
00335
00336 #include "lv3d1.def.h"