1094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk/*
2094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk * Copyright (C) 2008 The Android Open Source Project
3094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk *
4094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk * Licensed under the Apache License, Version 2.0 (the "License");
5094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk * you may not use this file except in compliance with the License.
6094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk * You may obtain a copy of the License at
7094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk *
8094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk *      http://www.apache.org/licenses/LICENSE-2.0
9094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk *
10094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk * Unless required by applicable law or agreed to in writing, software
11094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk * distributed under the License is distributed on an "AS IS" BASIS,
12094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk * See the License for the specific language governing permissions and
14094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk * limitations under the License.
15094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk */
16094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk
1727f50523a45100f3b4861762b6263e0b9ba6e22eAlex Sakhartchoukpackage com.android.modelviewer;
18094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk
19094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchoukimport java.io.Writer;
20094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchoukimport java.util.Map;
21094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchoukimport java.util.Vector;
22094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk
23094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchoukimport android.content.res.Resources;
24094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchoukimport android.renderscript.*;
25094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchoukimport android.renderscript.Element.Builder;
26e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchoukimport android.renderscript.Font.Style;
27094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchoukimport android.renderscript.ProgramStore.DepthFunc;
28094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchoukimport android.util.Log;
29094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk
30094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk
31094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchoukpublic class SceneGraphRS {
32094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk
33094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk    private final int STATE_LAST_FOCUS = 1;
34094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk
35094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk    int mWidth;
36094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk    int mHeight;
37094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk    int mRotation;
38094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk
39094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk    public SceneGraphRS() {
40094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk    }
41094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk
42094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk    public void init(RenderScriptGL rs, Resources res, int width, int height) {
43094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        mRS = rs;
44094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        mRes = res;
45094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        mWidth = width;
46094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        mHeight = height;
47094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        mRotation = 0;
48094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        initRS();
49094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk    }
50094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk
51094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk    private Resources mRes;
52094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk    private RenderScriptGL mRS;
53094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk    private Sampler mSampler;
54094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk    private ProgramStore mPSBackground;
55094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk    private ProgramFragment mPFBackground;
56094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk    private ProgramVertex mPVBackground;
57b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk    private ProgramVertexFixedFunction.Constants mPVA;
58094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk
59094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk    private Allocation mGridImage;
60094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk    private Allocation mAllocPV;
61094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk
62094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk    private Mesh mMesh;
63094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk
64094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk    private Font mItalic;
65094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk    private Allocation mTextAlloc;
66094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk
6793a958f0958b852c0a2c7b940c74eeae283ba02bStephen Hines    private ScriptC_scenegraph mScript;
6893a958f0958b852c0a2c7b940c74eeae283ba02bStephen Hines    private ScriptC_transform mTransformScript;
69094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk
70094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk    int mLastX;
71094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk    int mLastY;
72094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk
73094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk    public void touchEvent(int x, int y) {
74094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        int dx = mLastX - x;
75ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchouk        if (Math.abs(dx) > 50 || Math.abs(dx) < 3) {
76094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk            dx = 0;
77094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        }
78094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk
79094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        mRotation -= dx;
80ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchouk        if (mRotation > 360) {
81094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk            mRotation -= 360;
82094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        }
83ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchouk        if (mRotation < 0) {
84094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk            mRotation += 360;
85094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        }
86094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk
87094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        mScript.set_gRotate(-(float)mRotation);
88094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk
89094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        mLastX = x;
90094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        mLastY = y;
91094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk    }
92094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk
93094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk    private void initPFS() {
9432e09b5891da0174f161d99e2d3ebe67d6efa39cAlex Sakhartchouk        ProgramStore.Builder b = new ProgramStore.Builder(mRS);
95094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk
96094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        b.setDepthFunc(ProgramStore.DepthFunc.LESS);
97b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        b.setDitherEnabled(false);
98b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        b.setDepthMaskEnabled(true);
99094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        mPSBackground = b.create();
100094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk
101094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        mScript.set_gPFSBackground(mPSBackground);
102094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk    }
103094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk
104094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk    private void initPF() {
105094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        Sampler.Builder bs = new Sampler.Builder(mRS);
106b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        bs.setMinification(Sampler.Value.LINEAR);
107b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        bs.setMagnification(Sampler.Value.LINEAR);
108094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        bs.setWrapS(Sampler.Value.CLAMP);
109db6f11bd30ad8afc94fdaffd81c9588289a3f6e5Alex Sakhartchouk        bs.setWrapT(Sampler.Value.CLAMP);
110094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        mSampler = bs.create();
111094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk
112b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        ProgramFragmentFixedFunction.Builder b = new ProgramFragmentFixedFunction.Builder(mRS);
113b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        b.setTexture(ProgramFragmentFixedFunction.Builder.EnvMode.REPLACE,
114b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk                     ProgramFragmentFixedFunction.Builder.Format.RGBA, 0);
115094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        mPFBackground = b.create();
116094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        mPFBackground.bindSampler(mSampler, 0);
117094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk
118094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        mScript.set_gPFBackground(mPFBackground);
119094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk    }
120094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk
121094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk    private void initPV() {
122b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        ProgramVertexFixedFunction.Builder pvb = new ProgramVertexFixedFunction.Builder(mRS);
123094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        mPVBackground = pvb.create();
124094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk
125b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        mPVA = new ProgramVertexFixedFunction.Constants(mRS);
126b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk        ((ProgramVertexFixedFunction)mPVBackground).bindConstants(mPVA);
127094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk
128094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        mScript.set_gPVBackground(mPVBackground);
129094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk    }
130094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk
131094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk    private void loadImage() {
1326d8eb266dd398abf0511685fdaf98abba3396174Jason Sams        mGridImage = Allocation.createFromBitmapResource(mRS, mRes, R.drawable.robot,
1336d8eb266dd398abf0511685fdaf98abba3396174Jason Sams                                                         Allocation.MipmapControl.MIPMAP_ON_SYNC_TO_TEXTURE,
1346d8eb266dd398abf0511685fdaf98abba3396174Jason Sams                                                         Allocation.USAGE_GRAPHICS_TEXTURE);
135094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        mScript.set_gTGrid(mGridImage);
136094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk    }
137094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk
138094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk    private void initTextAllocation() {
139094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        String allocString = "Displaying file: R.raw.robot";
1405476b450e50939940dcf3f15c92335cee2fc572dJason Sams        mTextAlloc = Allocation.createFromString(mRS, allocString, Allocation.USAGE_SCRIPT);
141094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        mScript.set_gTextAlloc(mTextAlloc);
142094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk    }
143094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk
144094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk    SgTransform mRootTransform;
145094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk    SgTransform mGroup1;
146094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk
147094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk    SgTransform mRobot1;
148094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk    SgTransform mRobot2;
149094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk
150094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk    void initTransformHierarchy() {
151094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        mRootTransform = new SgTransform(mRS);
152094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk
153094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        mGroup1 = new SgTransform(mRS);
154094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        mRootTransform.addChild(mGroup1);
155094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk
156094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        mRobot1 = new SgTransform(mRS);
157094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        mRobot2 = new SgTransform(mRS);
158094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk
159094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        mGroup1.addChild(mRobot1);
160094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        mGroup1.addChild(mRobot2);
161094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk
162db6f11bd30ad8afc94fdaffd81c9588289a3f6e5Alex Sakhartchouk        mGroup1.setTransform(0, new Float4(0.0f, 0.0f, -15.0f, 0.0f), TransformType.TRANSLATE);
163094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        mGroup1.setTransform(1, new Float4(0.0f, 1.0f, 0.0f, 15.0f), TransformType.ROTATE);
164094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk
165db6f11bd30ad8afc94fdaffd81c9588289a3f6e5Alex Sakhartchouk        mRobot1.setTransform(0, new Float4(-3.0f, -0.5f, 0.0f, 0.0f), TransformType.TRANSLATE);
166094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        mRobot1.setTransform(1, new Float4(0.0f, 1.0f, 0.0f, 20.0f), TransformType.ROTATE);
167094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        mRobot1.setTransform(2, new Float4(0.2f, 0.2f, 0.2f, 0.0f), TransformType.SCALE);
168094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk
169db6f11bd30ad8afc94fdaffd81c9588289a3f6e5Alex Sakhartchouk        mRobot2.setTransform(0, new Float4(3.0f, 0.0f, 0.0f, 0.0f), TransformType.TRANSLATE);
170094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        mRobot2.setTransform(1, new Float4(0.0f, 1.0f, 0.0f, -20.0f), TransformType.ROTATE);
171094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        mRobot2.setTransform(2, new Float4(0.3f, 0.3f, 0.3f, 0.0f), TransformType.SCALE);
172094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk    }
173094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk
174094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk    private void initRS() {
175094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk
1763ba02b3d2f6fb49677466a2e93c96f307d2a7a41Jason Sams        mScript = new ScriptC_scenegraph(mRS, mRes, R.raw.scenegraph);
1773ba02b3d2f6fb49677466a2e93c96f307d2a7a41Jason Sams        mTransformScript = new ScriptC_transform(mRS, mRes, R.raw.transform);
178094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        mTransformScript.set_transformScript(mTransformScript);
179094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk
180094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        mScript.set_gTransformRS(mTransformScript);
181094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk
182094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        initPFS();
183094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        initPF();
184094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        initPV();
185094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk
186094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        loadImage();
187094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk
188094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        FileA3D model = FileA3D.createFromResource(mRS, mRes, R.raw.robot);
189094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        FileA3D.IndexEntry entry = model.getIndexEntry(0);
190e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk        if (entry == null || entry.getEntryType() != FileA3D.EntryType.MESH) {
191094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk            Log.e("rs", "could not load model");
192ed9f210568082dd6d1d8a0c92c693d574d87d545Alex Sakhartchouk        } else {
193094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk            mMesh = (Mesh)entry.getObject();
194094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk            mScript.set_gTestMesh(mMesh);
195094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        }
196094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk
197e27cdeeecba5b445e307d653d9cb7da007adfac3Alex Sakhartchouk        mItalic = Font.create(mRS, mRes, "serif", Font.Style.ITALIC, 8);
198094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        mScript.set_gItalic(mItalic);
199094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk
200094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        initTextAllocation();
201094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk
202094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        initTransformHierarchy();
203094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk
204094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        mScript.bind_gRootNode(mRootTransform.getField());
205094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk
206094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        mScript.bind_gGroup(mGroup1.mParent.mChildField);
207094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        mScript.bind_gRobot1(mRobot1.mParent.mChildField);
208094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        mScript.set_gRobot1Index(mRobot1.mIndexInParentGroup);
209094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        mScript.bind_gRobot2(mRobot2.mParent.mChildField);
210094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        mScript.set_gRobot2Index(mRobot2.mIndexInParentGroup);
211094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk
212bf6ef8d78fffbce6c1849a4a28fb3f4401ad039eJason Sams        mRS.bindRootScript(mScript);
213094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk    }
214094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk}
215094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk
216094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk
217094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk
218