00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 package com.generalrobotix.ui.item;
00019
00020 import java.io.File;
00021 import java.io.IOException;
00022 import java.util.*;
00023
00024 import javax.media.j3d.*;
00025 import javax.vecmath.*;
00026
00027 import org.eclipse.jface.action.Action;
00028 import org.eclipse.jface.dialogs.InputDialog;
00029 import org.eclipse.jface.dialogs.MessageDialog;
00030 import org.eclipse.osgi.util.NLS;
00031 import org.eclipse.swt.SWT;
00032 import org.eclipse.swt.widgets.FileDialog;
00033 import org.w3c.dom.Element;
00034 import org.w3c.dom.NodeList;
00035
00036 import com.generalrobotix.ui.grxui.GrxUIPerspectiveFactory;
00037 import com.generalrobotix.ui.*;
00038 import com.generalrobotix.ui.util.*;
00039 import com.generalrobotix.ui.util.AxisAngle4d;
00040 import com.generalrobotix.ui.view.tdview.*;
00041 import com.generalrobotix.ui.view.vsensor.Camera_impl;
00042
00043 import jp.go.aist.hrp.simulator.*;
00044 import jp.go.aist.hrp.simulator.ModelLoaderPackage.AABBdataType;
00045 import jp.go.aist.hrp.simulator.ModelLoaderPackage.ModelLoadOption;
00046 import jp.go.aist.hrp.simulator.ModelLoaderPackage.ModelLoaderException;
00047
00048 @SuppressWarnings({ "unchecked", "serial" })
00052 public class GrxModelItem extends GrxBaseItem implements Manipulatable {
00053 public static final String TITLE = "Model";
00054 public static final String DEFAULT_DIR = "/../model";
00055 public static final String FILE_EXTENSION = "*";
00056 private static final double DEFAULT_RADIUS = 0.05;
00057
00058
00059 private static final String robotIcon = "robot.png";
00060 private static final String envIcon = "environment.png";
00061
00062 private boolean isRobot_ = true;
00063
00064 private BodyInfo bInfo_;
00065 private boolean bModified_ = false;
00066
00067 public BranchGroup bgRoot_ = new BranchGroup();
00068 public Vector<GrxLinkItem> links_ = new Vector<GrxLinkItem>();
00069 public Vector<GrxExtraJointItem> extraJoints_ = new Vector<GrxExtraJointItem>();
00070
00071 private int[] jointToLink_;
00072 public Map<String, GrxLinkItem> nameToLink_ = new HashMap<String, GrxLinkItem>();
00073
00074
00075 private List<Camera_impl> cameraList_ = new ArrayList<Camera_impl>();
00076
00077 public ShapeInfo[] shapes = null;
00078 public AppearanceInfo[] appearances = null;
00079 public MaterialInfo[] materials = null;
00080 public TextureInfo[] textures = null;
00081
00082
00083 private Switch switchCom_;
00084 private TransformGroup tgCom_;
00085
00086
00087 private Switch switchComZ0_;
00088 private TransformGroup tgComZ0_;
00089
00090
00091 private Switch switchBb_;
00092
00096 public void notifyModified(){
00097
00098 notifyObservers("Modified");
00099 bModified_ = true;
00100 }
00101
00102 public boolean isModified(){
00103 return bModified_;
00104 }
00105
00106 public static final int MODIFIED_OK=0;
00107 public static final int MODIFIED_NG=1;
00108 public static final int MODIFIED_NOT=2;
00109 public int checkModifiedModel(boolean reload){
00110 if(bModified_){
00111 String mes = MessageBundle.get("GrxProjectItem.dialog.message.changeModel.mes");
00112 mes = NLS.bind(mes, new String[]{getName()});
00113
00114 MessageDialog msgDlg =
00115 new MessageDialog(GrxUIPerspectiveFactory.getCurrentShell(),
00116 MessageBundle.get("GrxProjectItem.dialog.message.changeModel.title"),
00117 null,
00118 mes,
00119 MessageDialog.INFORMATION,
00120 new String[] {MessageBundle.get("GrxProjectItem.dialog.message.changeModel.btn.save"),
00121 MessageBundle.get("GrxProjectItem.dialog.message.changeModel.btn.reverse"),
00122 MessageBundle.get("GrxProjectItem.dialog.message.changeModel.btn.cancel")},
00123 2);
00124
00125 switch(msgDlg.open())
00126 {
00127 case 0:
00128 if(reload){
00129 if(!saveAndLoad())
00130 return MODIFIED_NG;
00131 else
00132 return MODIFIED_OK;
00133 }else{
00134 if(!_saveAs())
00135 return MODIFIED_NG;
00136 cancelModified();
00137 return MODIFIED_OK;
00138 }
00139 case 1:
00140 if(reload){
00141 if(!reload())
00142 return MODIFIED_NG;
00143 else
00144 return MODIFIED_OK;
00145 }else{
00146 cancelModified();
00147 return MODIFIED_OK;
00148 }
00149 case 2:
00150 default:
00151 return MODIFIED_NG;
00152 }
00153 }
00154 return MODIFIED_NOT;
00155 }
00156
00157 public void cancelModified(){
00158 bModified_ = false;
00159 notifyObservers("ClearModified");
00160 }
00161
00162 public boolean saveAndLoad(){
00163 if(!_saveAs())
00164 return false;
00165 reload();
00166 return true;
00167 }
00168
00169 public boolean reload(){
00170 File f = new File(getURL(true));
00171 load0(f);
00172 sameUrlModelLoad();
00173 return true;
00174 }
00175
00176 private void sameUrlModelLoad(){
00177 File f = new File(getURL(true));
00178 List<GrxModelItem> sameModels = getSameUrlModels();
00179 Iterator<GrxModelItem> it = sameModels.iterator();
00180 while(it.hasNext()){
00181 it.next().load0(f);
00182 }
00183 }
00184
00189 public BodyInfo getBodyInfo(){
00190 String url = getURL(true);
00191 if (bModified_ || url == null || url.equals(""))
00192 return null;
00193 else
00194 return bInfo_;
00195 }
00196
00200 class MenuChangeType extends Action {
00201 public MenuChangeType() {
00202 if (isRobot_) {
00203 setText( MessageBundle.get("GrxModelItem.menu.changeEnv") );
00204 } else {
00205 setText( MessageBundle.get("GrxModelItem.menu.changeRobot") );
00206 }
00207 }
00208 public void run(){
00209 _setModelType(!isRobot_);
00210 }
00211 };
00212 MenuChangeType menuChangeType_ = new MenuChangeType();
00213
00219 public GrxModelItem(String name, GrxPluginManager item) {
00220 super(name, item);
00221 setIcon(robotIcon);
00222 _initMenu();
00223
00224 bgRoot_.setCapability(BranchGroup.ALLOW_DETACH);
00225 bgRoot_.setCapability(BranchGroup.ALLOW_CHILDREN_READ);
00226 bgRoot_.setCapability(BranchGroup.ALLOW_CHILDREN_WRITE);
00227 bgRoot_.setCapability(BranchGroup.ALLOW_CHILDREN_EXTEND);
00228
00229
00230 GrxLinkItem link = new GrxLinkItem("root", manager_, this);
00231 manager_.itemChange(link, GrxPluginManager.ADD_ITEM);
00232 link.jointType("free");
00233 bgRoot_.addChild(link.bg_);
00234
00235 setProperty("url","");
00236
00237 _setupMarks();
00238 }
00239
00246 public void addLink(GrxLinkItem link){
00247
00248 links_.add(link);
00249 notifyModified();
00250 }
00251
00256 public void removeLink(GrxLinkItem link){
00257
00258 links_.remove(link);
00259 notifyModified();
00260 }
00261
00265 private void _initMenu() {
00266
00267 setMenuItem(new Action(){
00268 public String getText(){ return MessageBundle.get("GrxModelItem.menu.reload"); }
00269 public void run(){
00270 boolean ret = load0(file_);
00271 if(ret){
00272 List<GrxModelItem> sameModels = getSameUrlModels();
00273 Iterator<GrxModelItem> it = sameModels.iterator();
00274 while(it.hasNext()){
00275 it.next().load0(file_);
00276 }
00277 }
00278 }
00279 });
00280
00281 setMenuItem(menuChangeType_);
00282
00283
00284 setMenuItem(new Action(){
00285 public String getText() { return MessageBundle.get("GrxModelItem.menu.save"); }
00286 public void run(){
00287 String url = getStr("url");
00288 if (url == null || url.equals("")){
00289 _saveAs();
00290 }else{
00291 GrxVrmlExporter.export(GrxModelItem.this, url);
00292 }
00293 if(bModified_)
00294 reload();
00295 else
00296 sameUrlModelLoad();
00297 }
00298 });
00299
00300
00301 setMenuItem(new Action(){
00302 public String getText() { return MessageBundle.get("GrxModelItem.menu.saveAs"); }
00303 public void run(){
00304 _saveAs();
00305 if(bModified_)
00306 reload();
00307 else
00308 sameUrlModelLoad();
00309 }
00310 });
00311
00312
00313 setMenuItem(new Action(){
00314 public String getText() { return MessageBundle.get("GrxModelItem.menu.addExtraJoint"); }
00315 public void run(){
00316 InputDialog dialog = new InputDialog( null, getText(),
00317 MessageBundle.get("GrxModelItem.dialog.message.extraJointName"), null,null);
00318 if ( dialog.open() == InputDialog.OK && dialog.getValue() != null)
00319 addExtraJoint( dialog.getValue() );
00320 }
00321 });
00322
00323
00324
00325
00326
00327
00328
00329
00330
00331
00332
00333
00334
00335
00336
00337
00338
00339
00340
00341
00342
00343
00344
00345 }
00346
00350 private boolean _saveAs(){
00351 FileDialog fdlg = new FileDialog( GrxUIPerspectiveFactory.getCurrentShell(), SWT.SAVE);
00352 fdlg.setFilterPath(getDefaultDir().getAbsolutePath());
00353 String fPath = fdlg.open();
00354 if( fPath != null ) {
00355 fPath = fPath.replace('\\','/');
00356 if (GrxVrmlExporter.export(GrxModelItem.this, fPath)){
00357 setURL(fPath);
00358 setDefaultDirectory(new File(fPath).getParent());
00359 }
00360 return true;
00361 }else
00362 return false;
00363 }
00368 public boolean create() {
00369 return true;
00370 }
00371
00375 public GrxLinkItem rootLink() {
00376 if (links_.size() > 0){
00377 return links_.get(0);
00378 }else{
00379 return null;
00380 }
00381 }
00382
00386 public void restoreProperties() {
00387
00388 boolean flg=false;
00389 if (element_ != null) {
00390 NodeList props = element_.getElementsByTagName(PROPERTY_TAG);
00391 for (int j = 0; j < props.getLength(); j++) {
00392 Element propEl = (Element) props.item(j);
00393 String key = propEl.getAttribute("name");
00394 String val = propEl.getAttribute("value");
00395 if(key.contains("NumOfAABB")){
00396 setProperty(key, val);
00397 String[] linkName = key.split("\\.");
00398 nameToLink_.get(linkName[0]).setProperty("NumOfAABB", val);
00399 flg=true;
00400 }else{
00401 if (!propertyChanged(key, val)){
00402 setProperty(key, val);
00403 }
00404 }
00405 }
00406 }
00408 if (getStr("markRadius")==null) setDbl("markRadius", DEFAULT_RADIUS);
00409
00410 _setModelType(isTrue("isRobot", isRobot_));
00411
00412 if (getDblAry(rootLink().getName()+".translation", null) == null &&
00413 getDblAry(rootLink().getName()+".rotation", null) == null)
00414 updateInitialTransformRoot();
00415
00416 for (int i=0; i<jointToLink_.length; i++) {
00417 GrxLinkItem l = links_.get(jointToLink_[i]);
00418 Double d = getDbl(l.getName()+".angle", null);
00419 if (d == null)
00420 setDbl(l.getName()+".angle", 0.0);
00421 }
00422
00423 if(flg)
00424 makeAABBforSameUrlModels();
00425
00426 for (int i=0; i<links_.size(); i++) {
00427 GrxLinkItem l = links_.get(i);
00428 if(!l.jointType_.equals("fixed")){
00429 String s = this.getProperty(l.getName()+".mode", null);
00430 if (s == null)
00431 setProperty(l.getName()+".mode", "Torque");
00432 }
00433 }
00434 }
00435
00442 public boolean propertyChanged(String property, String value) {
00443 if (super.propertyChanged(property, value)){
00444 }else if(property.equals("isRobot")){
00445 _setModelType(value);
00446 }else if(property.equals("controlTime")){
00447 try{
00448 double t = Double.parseDouble(value);
00449 if (t > 0){
00450 setProperty("controlTime", value);
00451 }
00452 }catch(Exception ex){
00453 }
00454 }else if(property.equals(rootLink().getName()+".translation")){
00455 if (rootLink().localTranslation(value)){
00456 setProperty(rootLink().getName()+".translation", value);
00457 calcForwardKinematics();
00458 }
00459 }else if(property.equals(rootLink().getName()+".rotation")){
00460 if (rootLink().localRotation(value)){
00461 setProperty(rootLink().getName()+".rotation", value);
00462 calcForwardKinematics();
00463 }
00464 }else if(property.equals(rootLink().getName()+".velocity")){
00465 setProperty(rootLink().getName()+".velocity", value);
00466 rootLink().setProperty("velocity", value);
00467 }else if(property.equals(rootLink().getName()+".angularVelocity")){
00468 setProperty(rootLink().getName()+".angularVelocity", value);
00469 rootLink().setProperty("angulaerVelocity", value);
00470 }else{
00471 for (int j = 0; j < links_.size(); j++){
00472 GrxLinkItem link = links_.get(j);
00473 if (property.equals(link.getName()+".angle")){
00474 if (link.jointValue(value)){
00475 calcForwardKinematics();
00476 setProperty(link.getName()+".angle", value);
00477 }
00478 return true;
00479 }else if(property.equals(link.getName()+".jointVelocity")){
00480 setProperty(link.getName()+".jointVelocity", value);
00481 link.setProperty("jointVelocity", value);
00482 return true;
00483 }else if(property.equals(link.getName()+".NumOfAABB")){
00484 if(link.propertyChanged("NumOfAABB", value)){
00485 setProperty(link.getName()+".NumOfAABB", value);
00486 }
00487 return true;
00488 }else if(property.equals(link.getName()+".mode")){
00489 setProperty(link.getName()+".mode", value);
00490 link.setProperty("mode", value);
00491 return true;
00492 }
00493 }
00494 return false;
00495 }
00496 return true;
00497
00498 }
00499
00504 private void _setModelType(String value){
00505 Boolean b = Boolean.parseBoolean(value);
00506 if (b != null){
00507 _setModelType(b);
00508 }
00509 }
00510
00515 private void _setModelType(boolean isRobot) {
00516 isRobot_ = isRobot;
00517 if (isRobot_) {
00518 setIcon(robotIcon);
00519 menuChangeType_.setText(MessageBundle.get("GrxModelItem.menu.changeEnv"));
00520 } else {
00521 menuChangeType_.setText( MessageBundle.get("GrxModelItem.menu.changeRobot") );
00522 setIcon(envIcon);
00523 setVisibleCoM(false);
00524 setVisibleCoMonFloor(false);
00525 }
00526 setProperty("isRobot", String.valueOf(isRobot_));
00527 }
00528
00536 private void _setupMarks() {
00537 double radius = getDbl("markRadius", DEFAULT_RADIUS);
00538 switchCom_ = GrxShapeUtil.createBall(radius, new Color3f(1.0f, 1.0f, 0.0f));
00539 switchComZ0_= GrxShapeUtil.createBall(radius, new Color3f(0.0f, 1.0f, 0.0f));
00540 tgCom_ = (TransformGroup)switchCom_.getChild(0);
00541 tgComZ0_ = (TransformGroup)switchComZ0_.getChild(0);
00542 TransformGroup root = getTransformGroupRoot();
00543 root.addChild(switchCom_);
00544 root.addChild(switchComZ0_);
00545
00546 SceneGraphModifier modifier = SceneGraphModifier.getInstance();
00547 modifier.init_ = true;
00548 modifier.mode_ = SceneGraphModifier.CREATE_BOUNDS;
00549
00550 Color3f color = new Color3f(0.0f, 1.0f, 0.0f);
00551 switchBb_ = SceneGraphModifier._makeSwitchNode(modifier._makeBoundingBox(color));
00552 root.addChild(switchBb_);
00553
00554 }
00555
00561 public boolean load(File f) {
00562 boolean ret = load0(f);
00563 if(ret){
00564 List<GrxModelItem> sameModels = getSameUrlModels();
00565 if(!sameModels.isEmpty()){
00566 GrxModelItem model = sameModels.get(0);
00567 boolean flg=false;
00568 for(int i=0; i<model.links_.size(); i++){
00569 if(!model.links_.get(i).getStr("NumOfAABB").equals("original data")){
00570 links_.get(i).setInt("NumOfAABB", model.links_.get(i).getInt("NumOfAABB",1));
00571 setInt(links_.get(i).getName()+".NumOfAABB", model.links_.get(i).getInt("NumOfAABB",1));
00572 flg = true;
00573 }
00574 }
00575 if(flg){
00576 BodyInfo bodyInfo = model.getBodyInfoFromModelLoader();
00577 makeAABB(bodyInfo);
00578 }
00579 }
00580 return true;
00581 }else
00582 return false;
00583
00584 }
00585
00586 private boolean load0(File f) {
00587 long load_stime = System.currentTimeMillis();
00588 file_ = f;
00589 String url=null;
00590 try {
00591 url = f.getCanonicalPath();
00592 } catch (IOException e) {
00593 e.printStackTrace();
00594 }
00595 GrxDebugUtil.println("Loading " + url);
00596 try {
00597 ModelLoader mloader = ModelLoaderHelper.narrow(
00598 GrxCorbaUtil.getReference("ModelLoader"));
00599 mloader._non_existent();
00600 setURL(url);
00601 bInfo_ = mloader.loadBodyInfo(getURL(true));
00602 boolean ret = registerCharacter();
00603 long load_etime = System.currentTimeMillis();
00604 System.out.println("load time = " + (load_etime-load_stime) + "ms");
00605 return ret;
00606 }catch(ModelLoaderException me){
00607 MessageDialog.openError(GrxUIPerspectiveFactory.getCurrentShell(),
00608 MessageBundle.get("GrxModelItem.dialog.title.error"),
00609 MessageBundle.get("GrxModelItem.dialog.message.loadError") +"\n" +
00610 url + "\n\n" + me.description);
00611 System.out.println("Failed to load vrml model:" + url);
00612 me.printStackTrace();
00613 return false;
00614 } catch (Exception ex) {
00615 MessageDialog.openError(GrxUIPerspectiveFactory.getCurrentShell(),
00616 MessageBundle.get("GrxModelItem.dialog.title.error"),
00617 MessageBundle.get("GrxModelItem.dialog.message.NoModelLoader") );
00618 System.out.println("Failed to load vrml model:" + url);
00619 ex.printStackTrace();
00620 return false;
00621 }
00622 }
00623
00624 public boolean registerCharacter(BodyInfo bInfo){
00625 bInfo_ = bInfo;
00626 return registerCharacter();
00627 }
00628
00629 private boolean registerCharacter(){
00630 manager_.focusedItem(null);
00631 manager_.setSelectedItem(this, false);
00632 bgRoot_.detach();
00633 bgRoot_ = new BranchGroup();
00634 bgRoot_.setCapability(BranchGroup.ALLOW_DETACH);
00635 bgRoot_.setCapability(BranchGroup.ALLOW_CHILDREN_READ);
00636 bgRoot_.setCapability(BranchGroup.ALLOW_CHILDREN_WRITE);
00637 bgRoot_.setCapability(BranchGroup.ALLOW_CHILDREN_EXTEND);
00638
00639 LinkInfo[] linkInfoList = bInfo_.links();
00640
00641
00642 if (rootLink() != null){
00643 rootLink().delete();
00644 }
00645
00646 for (int i=0; i<cameraList_.size(); i++){
00647 cameraList_.get(i).destroy();
00648 }
00649 cameraList_.clear();
00650
00651 int jointCount = 0;
00652 nameToLink_.clear();
00653
00654 int massZeroLink = -1;
00655 for (int i = 0; i < linkInfoList.length; i++) {
00656 GrxLinkItem link = new GrxLinkItem(linkInfoList[i].name, manager_, this, linkInfoList[i]);
00657 manager_.itemChange(link, GrxPluginManager.ADD_ITEM);
00658 if (link.jointId_ >= 0){
00659 jointCount++;
00660 }
00661 nameToLink_.put(link.getName(), link);
00662 if(linkInfoList[i].mass <= 0.0)
00663 massZeroLink = i;
00664 }
00665 if(massZeroLink >= 0)
00666 MessageDialog.openWarning(null, getName(), linkInfoList[massZeroLink].name+"::"+
00667 MessageBundle.get("GrxModelItem.dialog.message.massZero"));
00668 System.out.println("links_.size() = "+links_.size());
00669
00670
00671 int rootIndex = -1;
00672 for( int i = 0 ; i < links_.size() ; i++ ) {
00673 if( links_.get(i).parentIndex_ < 0 ){
00674 if( rootIndex < 0 ) {
00675 rootIndex = i;
00676 } else {
00677 System.out.println( "Error. Two or more root node exist." );
00678 }
00679 }
00680 }
00681 if( rootIndex < 0 ){
00682 System.out.println( "Error, root node doesn't exist." );
00683 }
00684
00685 createLink(rootIndex);
00686
00687 jointToLink_ = new int[jointCount];
00688 for (int i=0; i<jointCount; i++) {
00689 for (int j=0; j<links_.size(); j++) {
00690 if (links_.get(j).jointId_ == i) {
00691 jointToLink_[i] = j;
00692 }
00693 }
00694 }
00695
00696 ExtraJointInfo[] extraJointList = bInfo_.extraJoints();
00697 extraJoints_.clear();
00698 for (int i = 0; i < extraJointList.length; i++) {
00699 GrxExtraJointItem extraJoint = new GrxExtraJointItem(extraJointList[i].name, manager_, this, extraJointList[i]);
00700 extraJoints_.add(extraJoint);
00701 manager_.itemChange(extraJoint, GrxPluginManager.ADD_ITEM);
00702 }
00703
00704 long stime = System.currentTimeMillis();
00705 try {
00706 _loadVrmlScene(linkInfoList);
00707 } catch (BadLinkStructureException e) {
00708 e.printStackTrace();
00709 return false;
00710 }
00711 long etime = System.currentTimeMillis();
00712 System.out.println("_loadVrmlScene time = " + (etime-stime) + "ms");
00713
00714 calcForwardKinematics();
00715 updateInitialTransformRoot();
00716 updateInitialJointValues();
00717
00718 _setupMarks();
00719 setProperty("isRobot", Boolean.toString(isRobot_));
00720 for (int i=0; i<links_.size(); i++) {
00721 GrxLinkItem l = links_.get(i);
00722 if(!l.jointType_.equals("fixed")){
00723 setProperty(l.getName()+".mode", "Torque");
00724 l.setProperty("mode", "Torque");
00725 }
00726 }
00727
00728 manager_.setSelectedItem(this, true);
00729 cancelModified();
00730 return true;
00731 }
00732
00737 private void createLink( int index ){
00738
00739 GrxLinkItem link = links_.get(index);
00740
00741
00742 if (link.parentIndex_ != -1){
00743 links_.get(link.parentIndex_).addLink(link);
00744 }else{
00745 bgRoot_.addChild(link.bg_);
00746 }
00747
00748
00749 for (int i=0; i< link.children_.size(); i++){
00750 if (link.children_.get(i) instanceof GrxSensorItem){
00751 GrxSensorItem sensor = (GrxSensorItem)link.children_.get(i);
00752 if (sensor.isCamera()){
00753 cameraList_.add(sensor.getCamera());
00754 }
00755 }
00756 }
00757
00758 for( int i = 0 ; i < link.childIndices_.length ; i++ )
00759 {
00760
00761 int childIndex = link.childIndices_[i];
00762 createLink( childIndex );
00763 }
00764 }
00765
00771 private void _loadVrmlScene(LinkInfo[] links) throws BadLinkStructureException {
00772 shapes = bInfo_.shapes();
00773 appearances = bInfo_.appearances();
00774 materials = bInfo_.materials();
00775 textures = bInfo_.textures();
00776
00777 int numLinks = links.length;
00778 for(int linkIndex = 0; linkIndex < numLinks; linkIndex++) {
00779 GrxLinkItem link = links_.get(linkIndex);
00780 for (int i=0; i<link.children_.size(); i++){
00781 if(link.children_.get(i) instanceof GrxSegmentItem){
00782 GrxSegmentItem segment = (GrxSegmentItem)link.children_.get(i);
00783 segment.addShape(segment.getTransform());
00784 }else if (link.children_.get(i) instanceof GrxSensorItem){
00785 GrxSensorItem sensor = (GrxSensorItem)link.children_.get(i);
00786 sensor.addShape(new Matrix4d(1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1));
00787 }else if (link.children_.get(i) instanceof GrxHwcItem){
00788 GrxHwcItem hwc = (GrxHwcItem)link.children_.get(i);
00789 hwc.addShape(new Matrix4d(1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1));
00790 }
00791 }
00792 }
00793 setDblAry(rootLink().getName()+".translation", rootLink().localTranslation());
00794 setDblAry(rootLink().getName()+".rotation", rootLink().localRotation());
00795 setDblAry(rootLink().getName()+".velocity", new double[]{0,0,0} );
00796 setDblAry(rootLink().getName()+".angularVelocity", new double[]{0,0,0} );
00797
00798 for (int i=0; i<links_.size(); i++) {
00799 Node n = links_.get(i).tg_.getChild(0);
00800 if (n.getCapability(Node.ENABLE_PICK_REPORTING))
00801 n.clearCapability(Node.ENABLE_PICK_REPORTING);
00802 }
00803
00804 }
00805
00810 public void addRobot(File f, GrxLinkItem parentLink){
00811 try {
00812 GrxDebugUtil.println("Loading " + f.getCanonicalPath());
00813 ModelLoader mloader = ModelLoaderHelper.narrow(
00814 GrxCorbaUtil.getReference("ModelLoader"));
00815 mloader._non_existent();
00816 BodyInfo bInfo = mloader.loadBodyInfo(f.getCanonicalPath());
00817 LinkInfo[] linkInfoList = bInfo.links();
00818 int numOfLink = links_.size();
00819 int numOfJoint = getDOF();
00820 Vector<String> sensorType = new Vector<String>();
00821 Vector<String>[] sensorNames = new Vector[GrxSensorItem.sensorType.length];
00822 for(int i=0; i<GrxSensorItem.sensorType.length; i++){
00823 sensorType.add(GrxSensorItem.sensorType[i]);
00824 sensorNames[i] = new Vector<String>();
00825 String[] names = getSensorNames(GrxSensorItem.sensorType[i]);
00826 if(names!=null)
00827 for(int j=0; j<names.length; j++)
00828 sensorNames[i].add(names[j]);
00829 }
00830 int rootIndex = -1;
00831 int jointCount = 0;
00832 for (int i = 0; i < linkInfoList.length; i++) {
00833 if(linkInfoList[i].parentIndex < 0 ){
00834 linkInfoList[i].parentIndex = (short) links_.indexOf(parentLink);
00835 rootIndex = i+numOfLink;
00836 }else
00837 linkInfoList[i].parentIndex += numOfLink;
00838 for(int j=0; j<linkInfoList[i].childIndices.length; j++)
00839 linkInfoList[i].childIndices[j] += numOfLink;
00840 if(linkInfoList[i].jointId >= 0){
00841 linkInfoList[i].jointId += numOfJoint;
00842 jointCount++;
00843 }
00844 SensorInfo[] sensors = linkInfoList[i].sensors;
00845 for(int j=0; j<sensors.length; j++){
00846 int type = sensorType.indexOf(sensors[j].type);
00847 sensors[j].id += sensorNames[type].size();
00848 String sensorName = sensors[j].name;
00849 for(int k=0; sensorNames[type].indexOf(sensorName)!=-1; k++)
00850 sensorName = sensors[j].name + "_" + k;
00851 sensors[j].name = sensorName;
00852 }
00853 String linkName = linkInfoList[i].name;
00854 for(int j=0; nameToLink_.get(linkName)!=null; j++ )
00855 linkName = linkInfoList[i].name + "_" + j;
00856 GrxLinkItem link = new GrxLinkItem(linkName, manager_, this, linkInfoList[i]);
00857 nameToLink_.put(linkName, link);
00858 }
00859 createLink(rootIndex);
00860 jointToLink_ = new int[numOfJoint+jointCount];
00861 for (int i=0; i<numOfJoint+jointCount; i++) {
00862 for (int j=0; j<links_.size(); j++) {
00863 if (links_.get(j).jointId_ == i) {
00864 jointToLink_[i] = j;
00865 }
00866 }
00867 }
00868 for(int i=numOfLink; i<numOfLink+linkInfoList.length; i++)
00869 manager_.itemChange(links_.get(i), GrxPluginManager.ADD_ITEM);
00870
00871 shapes = bInfo.shapes();
00872 appearances = bInfo.appearances();
00873 materials = bInfo.materials();
00874 textures = bInfo.textures();
00875
00876 for(int linkIndex = numOfLink; linkIndex < links_.size(); linkIndex++) {
00877 GrxLinkItem link = links_.get(linkIndex);
00878 for (int i=0; i<link.children_.size(); i++){
00879 if(link.children_.get(i) instanceof GrxSegmentItem){
00880 GrxSegmentItem segment = (GrxSegmentItem)link.children_.get(i);
00881 segment.addShape(segment.getTransform());
00882 }else if (link.children_.get(i) instanceof GrxSensorItem){
00883 GrxSensorItem sensor = (GrxSensorItem)link.children_.get(i);
00884 sensor.addShape(new Matrix4d(1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1));
00885 }else if (link.children_.get(i) instanceof GrxHwcItem){
00886 GrxHwcItem hwc = (GrxHwcItem)link.children_.get(i);
00887 hwc.addShape(new Matrix4d(1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1));
00888 }
00889 }
00890 }
00891 }catch(Exception ex){
00892 MessageDialog.openError(GrxUIPerspectiveFactory.getCurrentShell(),
00893 MessageBundle.get("GrxModelItem.dialog.title.error"),
00894 MessageBundle.get("GrxModelItem.dialog.message.NoModelLoader") );
00895 }
00896 }
00897
00901 public class NormalRender {
00902 private LineArray nline = null;
00903
00904 public NormalRender(GeometryArray geom, float scale, Matrix4d T) {
00905
00906 Point3f[] vertices = new Point3f[geom.getVertexCount()];
00907 Vector3f[] normals = new Vector3f[geom.getVertexCount()];
00908 for (int i=0; i<geom.getVertexCount(); i++) {
00909 vertices[i] = new Point3f();
00910 normals[i] = new Vector3f();
00911 }
00912 geom.getCoordinates(0, vertices);
00913 geom.getNormals(0, normals);
00914 Point3f[] nvertices = new Point3f[vertices.length * 2];
00915 int n = 0;
00916 for (int i=0; i<vertices.length; i++ ){
00917
00918 T.transform(normals[i]);
00919 normals[i].normalize();
00920 T.transform(vertices[i]);
00921
00922 nvertices[n++] = new Point3f( vertices[i] );
00923 nvertices[n++] = new Point3f( vertices[i].x + scale * normals[i].x,
00924 vertices[i].y + scale * normals[i].y,
00925 vertices[i].z + scale * normals[i].z );
00926 }
00927 nline = new LineArray(nvertices.length, GeometryArray.COORDINATES);
00928 nline.setCoordinates(0, nvertices);
00929 }
00930
00931 public LineArray getLineArray() { return nline; }
00932 }
00933
00934
00940 public void setCharacterPos(LinkPosition[] lpos, double[] q) {
00941 boolean isAllPosProvided = true;
00942 if (q != null) {
00943 for (int i=0; i<jointToLink_.length; i++)
00944 links_.get(jointToLink_[i]).jointValue(q[i]);
00945 }
00946 for (int i=0; i<links_.size(); i++) {
00947 if (lpos[i].p == null || lpos[i].R == null)
00948 isAllPosProvided = false;
00949 else{
00950 if(i==0){
00951 links_.get(i).localTranslation(lpos[0].p);
00952 links_.get(i).localRotation(lpos[0].R);
00953 }
00954 links_.get(i).absTransform(lpos[i].p, lpos[i].R);
00955 }
00956 }
00957 if (isAllPosProvided)
00958 updateCoM();
00959 else
00960 calcForwardKinematics();
00961 }
00962
00968 public void setTransformRoot(Vector3d pos, Matrix3d rot) {
00969 _setTransform(0, pos, rot);
00970 }
00971
00977 public void setTransformRoot(Transform3D tform) {
00978 Vector3d pos = new Vector3d();
00979 Matrix3d rot = new Matrix3d();
00980 tform.get(rot, pos);
00981 _setTransform(0, pos, rot);
00982 }
00983
00990 private void _setTransform(int linkId, Vector3d pos, Matrix3d rot) {
00991 GrxLinkItem link = links_.get(linkId);
00992 if (link != null )
00993 if(link.parent_ == null ) link.setTransform(pos, rot);
00994 }
00995
01000 public void setJointValues(final double[] values) {
01001 for (int j = 0; j < links_.size(); j++){
01002 GrxLinkItem link = links_.get(j);
01003 if (link.jointId_ >= 0 && link.jointId_ < values.length){
01004 link.jointValue(values[link.jointId_]);
01005 }
01006 }
01007 }
01008
01012 public void setJointValuesWithinLimit() {
01013 rootLink().setJointValuesWithinLimit();
01014 }
01015
01019 public void updateInitialTransformRoot() {
01020 Transform3D t3d = new Transform3D();
01021 Matrix3d m3d = new Matrix3d();
01022 Vector3d v3d = new Vector3d();
01023
01024 getTransformGroupRoot().getTransform(t3d);
01025 t3d.get(m3d, v3d);
01026 setDblAry(rootLink().getName()+".translation", new double[]{v3d.x, v3d.y, v3d.z});
01027
01028 AxisAngle4d a4d = new AxisAngle4d();
01029 a4d.setMatrix(m3d);
01030 setDblAry(rootLink().getName()+".rotation", new double[]{a4d.x, a4d.y, a4d.z, a4d.angle});
01031 }
01032
01037 public void updateInitialJointValue(GrxLinkItem link) {
01038 if (link != null)
01039 setDbl(link.getName()+".angle", link.jointValue_);
01040 }
01041
01045 public void updateInitialJointValues() {
01046 for (int i=0; i<jointToLink_.length; i++) {
01047 GrxLinkItem l = links_.get(jointToLink_[i]);
01048 setDbl(l.getName()+".angle", l.jointValue_);
01049 }
01050 }
01051
01055 public void calcForwardKinematics() {
01056 rootLink().calcForwardKinematics();
01057 updateCoM();
01058 }
01059
01063 public void updateCoM() {
01064 if (switchCom_.getWhichChild() == Switch.CHILD_ALL ||
01065 switchComZ0_.getWhichChild() == Switch.CHILD_ALL) {
01066 Vector3d v3d = new Vector3d();
01067 getCoM(v3d);
01068 Vector3d vz0 = new Vector3d(v3d);
01069
01070 _globalToRoot(v3d);
01071 Transform3D t3d = new Transform3D();
01072 t3d.set(v3d);
01073 tgCom_.setTransform(t3d);
01074
01075 vz0.z = 0.0;
01076 _globalToRoot(vz0);
01077 t3d.set(vz0);
01078 tgComZ0_.setTransform(t3d);
01079 }
01080 }
01081
01086 private void _globalToRoot(Vector3d pos) {
01087 Transform3D t3d = new Transform3D();
01088 getTransformGroupRoot().getTransform(t3d);
01089 Vector3d p = new Vector3d();
01090 t3d.get(p);
01091 t3d.invert();
01092 pos.sub(p);
01093 t3d.transform(pos);
01094 }
01095
01100 public void getCoM(Vector3d pos) {
01101 pos.x = 0.0;
01102 pos.y = 0.0;
01103 pos.z = 0.0;
01104 double totalMass = 0.0;
01105
01106 for (int i = 0; i < links_.size(); i++) {
01107 GrxLinkItem link = links_.get(i);
01108 totalMass += link.linkMass_;
01109 Vector3d absCom = link.absCoM();
01110 absCom.scale(link.linkMass_);
01111 pos.add(absCom);
01112 }
01113 pos.scale(1.0 / totalMass);
01114 }
01115
01116 public List<GrxSensorItem> getSensors(String type){
01117 List<GrxSensorItem> sensors = new ArrayList<GrxSensorItem>();
01118 rootLink().gatherSensors(type, sensors);
01119 if (sensors.size() > 0){
01120 return sensors;
01121 }else{
01122 return null;
01123 }
01124 }
01125
01126 public String[] getSensorNames(String type) {
01127 List<GrxSensorItem> l = getSensors(type);
01128 if (l == null)
01129 return null;
01130
01131 String[] ret = new String[l.size()];
01132 for (int i=0; i<ret.length; i++)
01133 ret[l.get(i).id_] = l.get(i).getName();
01134 return ret;
01135 }
01136
01137 public TransformGroup getTransformGroupRoot() {
01138 return rootLink().tg_;
01139 }
01140
01146 public double[] getTransformArray(GrxLinkItem link) {
01147 Transform3D t3d = new Transform3D();
01148 link.tg_.getTransform(t3d);
01149 Matrix3d mat = new Matrix3d();
01150 Vector3d vec = new Vector3d();
01151 t3d.get(mat, vec);
01152
01153 double[] ret = new double[12];
01154 vec.get(ret);
01155 ret[3] = mat.m00; ret[4] = mat.m01; ret[5] = mat.m02;
01156 ret[6] = mat.m10; ret[7] = mat.m11; ret[8] = mat.m12;
01157 ret[9] = mat.m20; ret[10]= mat.m21; ret[11]= mat.m22;
01158
01159 return ret;
01160 }
01161
01162 public double[] getInitialTransformArray(GrxLinkItem link) {
01163 double[] ret = getTransformArray(link);
01164
01165 double[] p = getDblAry(link.getName()+".translation", null);
01166 if (p != null && p.length == 3) {
01167 System.arraycopy(p, 0, ret, 0, 3);
01168 }
01169
01170 double[] r = getDblAry(link.getName()+".rotation", null);
01171 if (r != null && r.length == 4) {
01172 Matrix3d mat = new Matrix3d();
01173 mat.set(new AxisAngle4d(r));
01174 ret[3] = mat.m00; ret[4] = mat.m01; ret[5] = mat.m02;
01175 ret[6] = mat.m10; ret[7] = mat.m11; ret[8] = mat.m12;
01176 ret[9] = mat.m20; ret[10]= mat.m21; ret[11]= mat.m22;
01177 }
01178
01179 return ret;
01180 }
01181
01182 public double[] getInitialVelocity(GrxLinkItem link){
01183 double[] ret = {0,0,0,0,0,0};
01184 double[] v = getDblAry(link.getName()+".velocity", null);
01185 if (v != null && v.length == 3) {
01186 System.arraycopy(v, 0, ret, 0, 3);
01187 }
01188 double[] w = getDblAry(link.getName()+".angularVelocity", null);
01189 if (w != null && w.length == 3) {
01190 System.arraycopy(w, 0, ret, 3, 3);
01191 }
01192
01193 return ret;
01194 }
01195
01196 public int getDOF() {
01197 if (jointToLink_ == null)
01198 return 0;
01199 return jointToLink_.length;
01200 }
01201
01202 public String[] getJointNames() {
01203 String[] names = new String[jointToLink_.length];
01204 for (int i=0; i<jointToLink_.length; i++)
01205 names[i] = links_.get(jointToLink_[i]).getName();
01206 return names;
01207 }
01208
01209 public double[] getJointValues() {
01210 double[] vals = new double[jointToLink_.length];
01211 for (int i=0; i<jointToLink_.length; i++)
01212 vals[i] = links_.get(jointToLink_[i]).jointValue_;
01213 return vals;
01214 }
01215
01216 public double[] getInitialJointValues() {
01217 double[] ret = new double[jointToLink_.length];
01218 for (int i=0; i<ret.length; i++) {
01219 GrxLinkItem l = links_.get(jointToLink_[i]);
01220 String jname = l.getName();
01221 ret[i] = getDbl(jname+".angle", l.jointValue_);
01222 }
01223 return ret;
01224 }
01225
01226 public double[] getInitialJointVelocity(){
01227 double[] ret = new double[jointToLink_.length];
01228 for (int i=0; i<ret.length; i++) {
01229 GrxLinkItem l = links_.get(jointToLink_[i]);
01230 String jname = l.getName();
01231 ret[i] = getDbl(jname+".jointVelocity", 0.0);
01232 }
01233 return ret;
01234 }
01235
01236
01237
01238
01239
01240
01241
01242
01243
01244 public double[] getInitialJointMode() {
01245 double[] ret = new double[links_.size()];
01246 for (int i=0; i<ret.length; i++) {
01247 String lname = links_.get(i).getName();
01248 String mode = getStr(lname+".mode", "Torque");
01249 ret[i] = mode.equals("HighGain") ? 1.0 : 0.0;
01250 }
01251 return ret;
01252 }
01253
01254 public boolean isRobot() {
01255 return isRobot_;
01256 }
01257
01258 public void setSelected(boolean b) {
01259 super.setSelected(b);
01260
01261
01262
01263
01264
01265
01266
01267 }
01268
01275 public void setFocused(boolean b){
01276 if (b) resizeBoundingBox();
01277 switchBb_.setWhichChild(b ? Switch.CHILD_ALL : Switch.CHILD_NONE);
01278 }
01279
01283 public void delete() {
01284 super.delete();
01285 Iterator<Camera_impl> it = cameraList_.iterator();
01286 while(it.hasNext())
01287 it.next().destroy();
01288 if(bgRoot_.isLive()) bgRoot_.detach();
01289 Map<?, ?> m = manager_.pluginMap_.get((GrxCollisionPairItem.class));
01290 GrxCollisionPairItem[] collisionPairItems = m.values().toArray(new GrxCollisionPairItem[0]);
01291 for (int i=0; i<collisionPairItems.length; i++) {
01292 GrxCollisionPairItem item = (GrxCollisionPairItem) collisionPairItems[i];
01293 String name = getName();
01294 if(name.equals(item.getStr("objectName1", ""))){
01295 item.delete();
01296 }else if(name.equals(item.getStr("objectName2", ""))){
01297 item.delete();
01298 }
01299 }
01300 m = manager_.pluginMap_.get((GrxExtraJointItem.class));
01301 GrxExtraJointItem[] extraJointItems = m.values().toArray(new GrxExtraJointItem[0]);
01302 for (int i=0; i<extraJointItems.length; i++) {
01303 GrxExtraJointItem item = extraJointItems[i];
01304 String name = getName();
01305 if(name.equals(item.getStr("object1Name", ""))){
01306 item.delete();
01307 }else if(name.equals(item.getStr("object2Name", ""))){
01308 item.delete();
01309 }
01310 }
01311 GrxLinkItem root = rootLink();
01312 if(root != null)
01313 root.delete();
01314 }
01315
01319 public void resizeBoundingBox() {
01320 SceneGraphModifier modifier = SceneGraphModifier.getInstance();
01321 modifier.init_ = true;
01322 modifier.mode_ = SceneGraphModifier.RESIZE_BOUNDS;
01323
01324
01325 TransformGroup tg = getTransformGroupRoot();
01326 Transform3D t3dLocal = new Transform3D();
01327 tg.getTransform(t3dLocal);
01328 t3dLocal.invert();
01329 for (int i=0; i<links_.size(); i++) {
01330 modifier._calcUpperLower(links_.get(i).tg_, t3dLocal);
01331 }
01332 Shape3D shapeNode = (Shape3D)switchBb_.getChild(0);
01333 Geometry gm = (Geometry)shapeNode.getGeometry(0);
01334
01335 Point3f[] p3fW = modifier._makePoints();
01336 if (gm instanceof QuadArray) {
01337 QuadArray qa = (QuadArray) gm;
01338 qa.setCoordinates(0, p3fW);
01339 }
01340 }
01341
01346 public void setVisibleCoM(boolean b) {
01347 if (isRobot()) {
01348 switchCom_.setWhichChild(b? Switch.CHILD_ALL:Switch.CHILD_NONE);
01349 calcForwardKinematics();
01350 } else {
01351 switchCom_.setWhichChild(Switch.CHILD_NONE);
01352 }
01353 }
01354
01359 public void setVisibleCoMonFloor(boolean b) {
01360 if (isRobot()) {
01361 switchComZ0_.setWhichChild(b? Switch.CHILD_ALL:Switch.CHILD_NONE);
01362 calcForwardKinematics();
01363 } else {
01364 switchComZ0_.setWhichChild(Switch.CHILD_NONE);
01365 }
01366 }
01367
01372 public void setWireFrame(boolean b) {
01373 setWireFrame(b, bgRoot_);
01374 }
01375
01381 public void setWireFrame(boolean b, Node node){
01382 if (node instanceof Switch) {
01383 return;
01384 } else if (node instanceof Group) {
01385 Group g = (Group) node;
01386 for (int i = 0; i < g.numChildren(); i++)
01387 setWireFrame(b, g.getChild(i));
01388
01389 } else if (node instanceof Link) {
01390 Link l = (Link) node;
01391 SharedGroup sg = l.getSharedGroup();
01392 for (int i = 0; i < sg.numChildren(); i++)
01393 setWireFrame(b, sg.getChild(i));
01394
01395 } else if (node instanceof Shape3D) {
01396 Shape3D s3d = (Shape3D) node;
01397 Appearance app = s3d.getAppearance();
01398 if (app != null) {
01399 PolygonAttributes pa = app.getPolygonAttributes();
01400 if (pa != null){
01401 if (b) {
01402 pa.setPolygonMode(PolygonAttributes.POLYGON_LINE);
01403 } else {
01404 pa.setPolygonMode(PolygonAttributes.POLYGON_FILL);
01405 }
01406 }
01407 }
01408 }
01409 }
01410
01411 public void setVisibleAABB(boolean b){
01412 Iterator<GrxLinkItem> it = links_.iterator();
01413 while(it.hasNext())
01414 it.next().setVisibleAABB(b);
01415 }
01416
01421 public void setTransparencyMode(boolean b) {
01422 setTransparencyMode(b, bgRoot_);
01423 }
01424
01430 private void setTransparencyMode(boolean b, Node node) {
01431 if (node instanceof Switch) {
01432 return;
01433 } else if (node instanceof Group) {
01434 Group g = (Group) node;
01435 for (int i = 0; i < g.numChildren(); i++)
01436 setTransparencyMode(b, g.getChild(i));
01437
01438 } else if (node instanceof Link) {
01439 Link l = (Link) node;
01440 SharedGroup sg = l.getSharedGroup();
01441 for (int i = 0; i < sg.numChildren(); i++)
01442 setTransparencyMode(b, sg.getChild(i));
01443
01444 } else if (node instanceof Shape3D) {
01445 Shape3D s3d = (Shape3D) node;
01446 Appearance app = s3d.getAppearance();
01447 if (app != null) {
01448 TransparencyAttributes ta = app.getTransparencyAttributes();
01449 if (ta != null) {
01450 if (b) {
01451 ta.setTransparency(0.5f);
01452 ta.setTransparencyMode(TransparencyAttributes.FASTEST);
01453 } else {
01454 ta.setTransparency(0f);
01455 ta.setTransparencyMode(TransparencyAttributes.NONE);
01456 }
01457 }
01458 }
01459 }
01460 }
01461
01466 public List<Camera_impl> getCameraSequence () {
01467 return cameraList_;
01468 }
01469
01475 public void setJointColor(int jid, java.awt.Color color) {
01476 GrxLinkItem l = links_.get(jointToLink_[jid]);
01477 if (l != null) l.setColor(color);
01478 }
01479
01480
01481
01482
01483
01484
01485
01486
01487
01488
01489
01490
01491
01492
01493
01494
01495
01496
01497
01498
01499
01500
01505 public GrxModelItem clone(){
01506 GrxModelItem ret = (GrxModelItem)super.clone();
01507 ret.bInfo_ = (BodyInfo)bInfo_._duplicate();
01508
01509
01510 ret.links_ = new Vector<GrxLinkItem>(links_);
01511
01512
01513
01514
01515
01516
01517
01518
01519
01520
01521
01522
01523
01524
01525
01526
01527
01528
01529
01530
01531
01532
01533
01534
01535
01536
01537
01538 return ret;
01539 }
01540
01546 public GrxLinkItem getLink(String name){
01547 return nameToLink_.get(name);
01548 }
01549
01550 private BodyInfo getBodyInfoFromModelLoader(){
01551 short[] depth = new short[links_.size()];
01552 for(int i=0; i<links_.size(); i++)
01553 depth[i] = links_.get(i).getInt("NumOfAABB", 1).shortValue();
01554 try {
01555 ModelLoader mloader = ModelLoaderHelper.narrow(GrxCorbaUtil.getReference("ModelLoader"));
01556 mloader._non_existent();
01557 ModelLoadOption option = new ModelLoadOption();
01558 option.readImage = false;
01559 option.AABBtype = AABBdataType.AABB_NUM;
01560 option.AABBdata = depth;
01561
01562 return mloader.getBodyInfoEx(getURL(false), option);
01563 }catch(Exception e){
01564 MessageDialog.openError(GrxUIPerspectiveFactory.getCurrentShell(),
01565 MessageBundle.get("GrxModelItem.dialog.title.error"),
01566 MessageBundle.get("GrxModelItem.dialog.message.NoModelLoader") );
01567 return null;
01568 }
01569 }
01570
01571 private void makeAABB(BodyInfo binfo){
01572 bInfo_ = binfo;
01573
01574 LinkInfo[] links = bInfo_.links();
01575 shapes = bInfo_.shapes();
01576 appearances = bInfo_.appearances();
01577 materials = bInfo_.materials();
01578 textures = bInfo_.textures();
01579
01580 int numLinks = links.length;
01581 for(int i = 0; i < numLinks; i++) {
01582 links_.get(i).clearAABB();
01583 TransformedShapeIndex[] tsi = links[i].shapeIndices;
01584 for(int j=0; j<tsi.length; j++){
01585 links_.get(i).makeAABB(shapes[tsi[j].shapeIndex], tsi[j].transformMatrix );
01586 }
01587 }
01588 notifyObservers("BodyInfoChange");
01589 }
01590
01591 public List<GrxModelItem> getSameUrlModels(){
01592 List<GrxModelItem> models = manager_.<GrxModelItem>getSelectedItemList(GrxModelItem.class);
01593 Iterator<GrxModelItem> it = models.iterator();
01594 while(it.hasNext()){
01595 GrxModelItem model = it.next();
01596 if(!model.getURL(true).equals(getURL(true)) || model == this)
01597 it.remove();
01598 }
01599 return models;
01600 }
01601
01602 public void makeAABBforSameUrlModels(){
01603 BodyInfo bodyInfo = getBodyInfoFromModelLoader();
01604 makeAABB(bodyInfo);
01605 List<GrxModelItem> sameModels = getSameUrlModels();
01606 Iterator<GrxModelItem> it = sameModels.iterator();
01607 while(it.hasNext()){
01608 GrxModelItem _model = it.next();
01609 for(int i=0; i<links_.size(); i++){
01610 String value = links_.get(i).getStr("NumOfAABB");
01611 _model.nameToLink_.get(links_.get(i).getName()).setProperty("NumOfAABB", value);
01612 _model.setProperty(links_.get(i).getName()+".NumOfAABB", value);
01613 }
01614 _model.makeAABB(bodyInfo);
01615 }
01616 }
01617
01622 public void rename(String newName) {
01623 String oldName = getName();
01624
01625 super.rename(newName);
01626
01627 OrderedHashMap mcoll = manager_.pluginMap_.get(GrxCollisionPairItem.class);
01628 if(mcoll != null)
01629 {
01630 Iterator it = mcoll.values().iterator();
01631 while(it.hasNext())
01632 {
01633 GrxCollisionPairItem ci = (GrxCollisionPairItem)it.next();
01634 if(oldName.equals(ci.getProperty("objectName1")))
01635 ci.setProperty("objectName1", newName);
01636
01637 if(oldName.equals(ci.getProperty("objectName2")))
01638 ci.setProperty("objectName2", newName);
01639 }
01640 }
01641 mcoll = manager_.pluginMap_.get(GrxExtraJointItem.class);
01642 if(mcoll != null)
01643 {
01644 Iterator it = mcoll.values().iterator();
01645 while(it.hasNext())
01646 {
01647 GrxExtraJointItem extraJoint = (GrxExtraJointItem) it.next();
01648 if(oldName.equals(extraJoint.getProperty("object1Name")))
01649 extraJoint.setProperty("object1Name", newName);
01650
01651 if(oldName.equals(extraJoint.getProperty("object2Name")))
01652 extraJoint.setProperty("object2Name", newName);
01653 }
01654 }
01655 }
01656
01657 @Override
01658 public ValueEditType GetValueEditType(String key) {
01659 if(key.matches(".+\\.mode"))
01660 {
01661 return new ValueEditCombo(modeComboItem_);
01662 }else if(key.equals("isRobot")){
01663 return new ValueEditCombo(booleanComboItem_);
01664 }
01665 return super.GetValueEditType(key);
01666 }
01667
01668 public void removeExtraJoint(GrxExtraJointItem extraJoint) {
01669 extraJoints_.remove(extraJoint);
01670 notifyModified();
01671 }
01672
01673 private void addExtraJoint(String name) {
01674 GrxExtraJointItem extraJoint = new GrxExtraJointItem(name, manager_, this, null);
01675 this.extraJoints_.add(extraJoint);
01676 notifyModified();
01677 manager_.itemChange(extraJoint, GrxPluginManager.ADD_ITEM);
01678 }
01679 }