| 1 31 package org.objectweb.proactive.examples.c3d; 32 33 import java.awt.Button ; 34 import java.awt.Color ; 35 import java.awt.Font ; 36 import java.awt.Frame ; 37 import java.awt.Graphics ; 38 import java.awt.GridBagConstraints ; 39 import java.awt.GridBagLayout ; 40 import java.awt.Insets ; 41 import java.awt.Label ; 42 import java.awt.List ; 43 import java.awt.Menu ; 44 import java.awt.MenuBar ; 45 import java.awt.MenuItem ; 46 import java.awt.Panel ; 47 import java.awt.TextArea ; 48 import java.awt.event.ActionEvent ; 49 import java.awt.event.ActionListener ; 50 import java.awt.event.WindowAdapter ; 51 import java.awt.event.WindowEvent ; 52 import java.io.FileWriter ; 53 import java.io.IOException ; 54 import java.io.RandomAccessFile ; 55 import java.net.InetAddress ; 56 import java.net.UnknownHostException ; 57 import java.util.Date ; 58 import java.util.Enumeration ; 59 import java.util.Hashtable ; 60 import java.util.Stack ; 61 62 import org.apache.log4j.Logger; 63 import org.objectweb.proactive.ProActive; 64 import org.objectweb.proactive.core.body.request.Request; 65 import org.objectweb.proactive.core.config.ProActiveConfiguration; 66 import org.objectweb.proactive.core.descriptor.data.ProActiveDescriptor; 67 import org.objectweb.proactive.core.descriptor.data.VirtualNode; 68 import org.objectweb.proactive.core.node.Node; 69 import org.objectweb.proactive.core.node.NodeException; 70 import org.objectweb.proactive.examples.c3d.geom.Vec; 71 import org.objectweb.proactive.examples.c3d.prim.Primitive; 72 import org.objectweb.proactive.examples.c3d.prim.Sphere; 73 74 77 public class C3DDispatcher implements org.objectweb.proactive.RunActive 78 { 79 static Logger logger = Logger.getLogger(C3DDispatcher.class.getName()); 80 81 protected VirtualNode vn; 82 85 private static final boolean ACTIVE = true; 86 89 private Hashtable h_users = new Hashtable (); 90 91 94 private long startTime; 95 98 private long avgRender = 0; 99 102 private long totalRender = 0; 103 107 private Stack int_stack = new Stack (); 108 112 private C3DRenderingEngine engine[]; 113 116 private Hashtable h_engines = new Hashtable (); 117 121 private Scene scene; 122 125 private int engines; 126 127 132 private int intervals; 133 136 private int width; 137 140 private int height; 141 145 private int intheight; 146 150 private int[] pixels; 151 156 private int i_left = 0; 157 private int i_lastuser = 0; 158 private TextArea ta_log; 159 private List li_users; 160 private List li_enginesUsed; 161 private List li_enginesAvailable; 162 private String s_access_url; 163 private String s_hosts; 164 private Button b_addEng = new Button ("Add engine"); 165 private Button b_rmEng = new Button ("Remove engine"); 166 private Election election = null; 167 170 private long userPing = 0; 171 174 private long userTotal = 0; 175 178 private long enginePing = 0; 179 183 private boolean b_render = false; 184 187 private ProActiveDescriptor proActiveDescriptor; 188 private String [] rendererNodes; 189 190 193 public C3DDispatcher() 194 { 195 } 196 197 200 206 209 public C3DDispatcher(String [] rendererNodes,VirtualNode vn, ProActiveDescriptor pad) 210 { 211 new C3DDispatcherFrame(); 212 this.rendererNodes=rendererNodes; 213 this.vn = vn; 214 this.proActiveDescriptor = pad; 215 } 216 222 public void init() 223 { 224 try 225 { 226 C3DDispatcher d = 227 (C3DDispatcher) org 228 .objectweb 229 .proactive 230 .ProActive 231 .getStubOnThis(); 232 233 238 Object [] param = { d }; 240 241 251 engines = rendererNodes.length; 253 engine = new C3DRenderingEngine[engines]; 254 for (int i = 0; i < rendererNodes.length; i++) 255 { 256 C3DRenderingEngine tmp = 257 ( 258 C3DRenderingEngine)ProActive 259 .newActive( 260 "org.objectweb.proactive.examples.c3d.C3DRenderingEngine", 261 param, 262 rendererNodes[i]); 263 log("New rendering engine " + i + " created at " + rendererNodes[i]); 265 266 if (i == 1) 268 li_enginesUsed.add(rendererNodes[i].toString()); 269 else 270 li_enginesAvailable.add(rendererNodes[i].toString()); 271 272 h_engines.put(rendererNodes[i], tmp); 274 } 275 } 295 catch (Exception e) 296 { 297 e.printStackTrace(); 298 throw new RuntimeException (e.toString()); 299 } 300 } 301 302 305 public void log(String s_message) 306 { 307 ta_log.append(s_message + "\n"); 308 } 309 310 315 private void render() 316 { 317 318 if (li_enginesUsed.getItems().length == 0) 320 { 321 showMessageAll("No engines ... contact the dispatcher"); 322 return; 323 } 324 325 b_render = true; 327 328 startTime = System.currentTimeMillis(); 330 331 Interval interval; 332 String keys[] = li_enginesUsed.getItems(); 333 engines = keys.length; 334 335 log("Creating " + intervals + " intervals"); 336 intervals = 3 * keys.length; 337 intheight = height / intervals; 338 339 340 i_left = intervals; 341 342 343 int_stack = new Stack (); 344 for (int i = 0; i < intervals; i++) 345 { 346 Interval newint = 348 new Interval( 349 i, 350 width, 351 height, 352 i * intheight, 353 (i + 1) * intheight, 354 intervals); 355 int_stack.push(newint); 356 } 357 358 engine = null; 359 engine = new C3DRenderingEngine[keys.length]; 360 361 C3DRenderingEngine tmp; 362 if (keys != null) 363 { 364 for (int e = 0; e < keys.length; e++) 365 { 366 367 368 if (!int_stack.empty()) 369 { 370 interval = (Interval) int_stack.pop(); 371 372 tmp = (C3DRenderingEngine) h_engines.get(keys[e]); 373 374 if (tmp != null) 375 { 376 377 tmp.setScene(scene); 378 379 engine[e] = tmp; 380 381 382 tmp.render(e, interval); 383 384 log( 385 "Interval " 386 + interval.number 387 + " assigned to engine " 388 + keys[e] 389 + "[" 390 + e 391 + "]"); 392 } 393 else 394 { 395 log( 396 "Failed to assign an interval to engine " 397 + keys[e]); 398 h_engines.get(keys[e]); 399 } 400 } 401 } 402 } 403 else 404 b_render = false; 405 } 406 407 long previousTime = -1; 408 409 420 public void setPixels(int[] newpix, Interval interval, int engine_number) 421 { 422 424 long elapsed; 425 426 427 for (Enumeration e = h_users.elements(); e.hasMoreElements();) 428 { 429 User user = (User) e.nextElement(); 430 431 user.getObject().setPixels(newpix, interval); 432 } 433 434 436 System.arraycopy( 437 newpix, 438 0, 439 pixels, 440 interval.width * interval.yfrom, 441 newpix.length); 442 443 i_left--; 444 445 446 Interval nextinterval; 447 if (!int_stack.empty()) 448 { 449 nextinterval = (Interval) int_stack.pop(); 450 log( 451 "Next interval [" 452 + nextinterval.number 453 + "] assigned to engine " 454 + engine_number); 455 engine[engine_number].render(engine_number, nextinterval); 457 459 } 460 else if (i_left == 0) 461 { 462 elapsed = System.currentTimeMillis() - startTime; 464 465 totalRender++; 466 avgRender += ((elapsed - avgRender) / totalRender); 467 468 showMessageAll("All intervals rendered in " + elapsed + " ms"); 469 if (previousTime != -1) 470 showMessageAll( 471 "Speed Up : " 472 + java.lang.Math.rint( 473 ((double) previousTime / elapsed) * 1000) 474 / 1000 475 + "\n"); 476 else 477 showMessageAll(""); 478 previousTime = elapsed; 479 480 b_render = false; 481 } 482 } 483 484 491 private void rotateSceneY(double angle) 492 { 493 int objects = scene.getObjects(); 494 Sphere o; 495 496 for (int i = 0; i < objects; i++) 497 { 498 o = (Sphere) scene.getObject(i); 499 Vec c = o.getCenter(); 500 double phi = Math.atan2(c.z, c.x); 501 double l = Math.sqrt(c.x * c.x + c.z * c.z); 502 503 c.x = l * Math.cos(phi + angle); 504 c.z = l * Math.sin(phi + angle); 505 o.setCenter(c); 506 scene.setObject(o, i); 507 } 508 509 render(); 510 } 511 512 519 private void rotateSceneX(double angle) 520 { 521 int objects = scene.getObjects(); 522 Sphere o; 523 524 for (int i = 0; i < objects; i++) 525 { 526 o = (Sphere) scene.getObject(i); 527 Vec c = o.getCenter(); 528 double phi = Math.atan2(c.z, c.y); 529 double l = Math.sqrt(c.y * c.y + c.z * c.z); 530 531 c.y = l * Math.cos(phi + angle); 532 c.z = l * Math.sin(phi + angle); 533 o.setCenter(c); 534 scene.setObject(o, i); 535 } 536 537 render(); 538 } 539 540 547 private void rotateSceneZ(double angle) 548 { 549 int objects = scene.getObjects(); 550 Sphere o; 551 552 for (int i = 0; i < objects; i++) 553 { 554 o = (Sphere) scene.getObject(i); 555 Vec c = o.getCenter(); 556 double phi = Math.atan2(c.x, c.y); 557 double l = Math.sqrt(c.y * c.y + c.x * c.x); 558 559 c.y = l * Math.cos(phi + angle); 560 c.x = l * Math.sin(phi + angle); 561 o.setCenter(c); 562 scene.setObject(o, i); 563 } 564 565 render(); 566 } 567 568 575 public void rotateLeft(int i_user) 576 { 577 rotateSceneY(-Math.PI / 4); 578 } 579 580 587 public void rotateRight(int i_user) 588 { 589 rotateSceneY(Math.PI / 4); 590 } 591 592 599 public void rotateUp(int i_user) 600 { 601 rotateSceneX(Math.PI / 4); 602 } 603 604 611 public void rotateDown(int i_user) 612 { 613 rotateSceneX(-Math.PI / 4); 614 } 615 616 623 public void spinClock(int i_user) 624 { 625 rotateSceneZ(Math.PI / 4); 626 } 627 628 635 public void spinUnclock(int i_user) 636 { 637 rotateSceneZ(-Math.PI / 4); 638 } 639 640 public void changeColorAll() 641 { 642 logger.info("changeColorAll()"); 643 for (Enumeration e = h_users.elements(); e.hasMoreElements();) 644 ((User) e.nextElement()) 645 .getObject() 646 .getUserFrame() 647 .getB_left() 648 .setBackground( 649 Color.yellow); 650 } 651 652 656 public void runActivity(org.objectweb.proactive.Body body) 657 { 658 660 init(); 661 org 662 .objectweb 663 .proactive 664 .core 665 .body 666 .request 667 .BlockingRequestQueue requestQueue = 668 body.getRequestQueue(); 669 670 while (body.isActive()) 671 { 672 673 674 Request r = requestQueue.blockingRemoveOldest(); 675 String methodName = r.getMethodName(); 676 if (methodName.startsWith("rotate")|| methodName.startsWith("spin")){ 677 processRotate(body, methodName, r); 678 } 679 else{ 680 if (!Election.isRunning()) 681 { 682 body.serve(r); 684 } 685 else if (methodName.equals("addSphere")) 686 { 687 showMessageAll("Cannot add spheres while an election is running"); 690 } 691 else 692 { 693 695 body.serve(r); 696 } 697 } 698 699 } 700 } 702 703 740 746 public void processRotate( 747 org.objectweb.proactive.Body body, 748 String methodName, 749 Request r) 750 { 751 int i_user = 0; 752 try 753 { 754 i_user = ((Integer ) r.getParameter(0)).intValue(); 755 } 756 catch (Exception e) 757 { 758 e.printStackTrace(); 759 } 760 if (methodName.equals("rotateLeft")) 761 { 762 if (Election.isRunning()) 764 { 765 int i_votes = Election.vote(i_user, new Integer (Election.LEFT)); 767 if (i_votes == h_users.size()) 768 { 769 election.finish(); 770 } 771 } 772 else 773 { 774 if (i_left > 0) 776 { 777 showMessage( 778 i_user, 779 "Rendering in progress, request invalid"); 780 } 781 else if (h_users.size() == 1) 782 { 783 showMessage(i_user, "Scene is being rotated left"); 784 body.serve(r); 785 } 786 else 787 { 788 election = 789 new Election(i_user, new Integer (Election.LEFT), this); 790 } 791 } 792 } 793 else if (methodName.equals("rotateRight")) 794 { 795 if (Election.isRunning()) 797 { 798 int i_votes = 800 Election.vote(i_user, new Integer (Election.RIGHT)); 801 if (i_votes == h_users.size()) 802 { 803 election.finish(); 804 } 805 } 806 else 807 { 808 if (i_left > 0) 810 { 811 showMessage( 812 i_user, 813 "Rendering in progress, request invalid"); 814 } 815 else if (h_users.size() == 1) 816 { 817 showMessage(i_user, "Scene is being rotated right"); 818 body.serve(r); 819 } 820 else 821 { 822 election = 823 new Election(i_user, new Integer (Election.RIGHT), this); 824 } 825 } 826 } 827 else if (methodName.equals("rotateUp")) 828 { 829 if (Election.isRunning()) 831 { 832 int i_votes = Election.vote(i_user, new Integer (Election.UP)); 834 if (i_votes == h_users.size()) 835 { 836 election.finish(); 837 } 838 } 839 else 840 { 841 if (i_left > 0) 843 { 844 showMessage( 845 i_user, 846 "Rendering in progress, request invalid"); 847 } 848 else if (h_users.size() == 1) 849 { 850 showMessage(i_user, "Scene is being rotated up"); 851 body.serve(r); 852 &nb
|