SceneGraphRS.java revision 32e09b5891da0174f161d99e2d3ebe67d6efa39c
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;
26094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchoukimport android.renderscript.ProgramStore.DepthFunc;
27094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchoukimport android.util.Log;
28094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk
29094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk
30094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchoukpublic class SceneGraphRS {
31094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk
32094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk    private final int STATE_LAST_FOCUS = 1;
33094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk
34094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk    int mWidth;
35094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk    int mHeight;
36094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk    int mRotation;
37094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk
38094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk    public SceneGraphRS() {
39094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk    }
40094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk
41094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk    public void init(RenderScriptGL rs, Resources res, int width, int height) {
42094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        mRS = rs;
43094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        mRes = res;
44094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        mWidth = width;
45094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        mHeight = height;
46094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        mRotation = 0;
47094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        initRS();
48094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk    }
49094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk
50094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk    private Resources mRes;
51094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk    private RenderScriptGL mRS;
52094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk    private Sampler mSampler;
53094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk    private ProgramStore mPSBackground;
54094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk    private ProgramFragment mPFBackground;
55094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk    private ProgramVertex mPVBackground;
56094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk    private ProgramVertex.MatrixAllocation mPVA;
57094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk
58094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk    private Allocation mGridImage;
59094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk    private Allocation mAllocPV;
60094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk
61094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk    private Mesh mMesh;
62094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk
63094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk    private Font mItalic;
64094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk    private Allocation mTextAlloc;
65094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk
66094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk    private ScriptC_Scenegraph mScript;
67094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk    private ScriptC_Transform mTransformScript;
68094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk
69094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk    int mLastX;
70094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk    int mLastY;
71094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk
72094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk    public void touchEvent(int x, int y) {
73094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        int dx = mLastX - x;
74094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        if(Math.abs(dx) > 50 || Math.abs(dx) < 3) {
75094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk            dx = 0;
76094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        }
77094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk
78094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        mRotation -= dx;
79094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        if(mRotation > 360) {
80094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk            mRotation -= 360;
81094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        }
82094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        if(mRotation < 0) {
83094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk            mRotation += 360;
84094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        }
85094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk
86094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        mScript.set_gRotate(-(float)mRotation);
87094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk
88094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        mLastX = x;
89094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        mLastY = y;
90094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk    }
91094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk
92094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk    private void initPFS() {
9332e09b5891da0174f161d99e2d3ebe67d6efa39cAlex Sakhartchouk        ProgramStore.Builder b = new ProgramStore.Builder(mRS);
94094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk
95094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        b.setDepthFunc(ProgramStore.DepthFunc.LESS);
96094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        b.setDitherEnable(false);
97094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        b.setDepthMask(true);
98094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        mPSBackground = b.create();
99094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk
100094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        mScript.set_gPFSBackground(mPSBackground);
101094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk    }
102094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk
103094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk    private void initPF() {
104094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        Sampler.Builder bs = new Sampler.Builder(mRS);
105094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        bs.setMin(Sampler.Value.LINEAR);
106094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        bs.setMag(Sampler.Value.LINEAR);
107094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        bs.setWrapS(Sampler.Value.CLAMP);
108094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        bs.setWrapT(Sampler.Value.WRAP);
109094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        mSampler = bs.create();
110094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk
111094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        ProgramFragment.Builder b = new ProgramFragment.Builder(mRS);
112094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        b.setTexture(ProgramFragment.Builder.EnvMode.REPLACE,
113094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk                     ProgramFragment.Builder.Format.RGBA, 0);
114094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        mPFBackground = b.create();
115094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        mPFBackground.bindSampler(mSampler, 0);
116094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk
117094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        mScript.set_gPFBackground(mPFBackground);
118094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk    }
119094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk
120094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk    private void initPV() {
12132e09b5891da0174f161d99e2d3ebe67d6efa39cAlex Sakhartchouk        ProgramVertex.Builder pvb = new ProgramVertex.Builder(mRS);
122094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        mPVBackground = pvb.create();
123094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk
124094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        mPVA = new ProgramVertex.MatrixAllocation(mRS);
125094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        mPVBackground.bindAllocation(mPVA);
126094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        mPVA.setupProjectionNormalized(mWidth, mHeight);
127094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk
128094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        mScript.set_gPVBackground(mPVBackground);
129094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk    }
130094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk
131094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk    private void loadImage() {
132094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        mGridImage = Allocation.createFromBitmapResourceBoxed(mRS, mRes, R.drawable.robot, Element.RGB_565(mRS), true);
133094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        mGridImage.uploadToTexture(0);
134094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk
135094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        mScript.set_gTGrid(mGridImage);
136094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk    }
137094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk
138094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk    private void initTextAllocation() {
139094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        String allocString = "Displaying file: R.raw.robot";
140094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        mTextAlloc = Allocation.createFromString(mRS, allocString);
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
162094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        mGroup1.setTransform(0, new Float4(0.0f, 0.0f, 5.0f, 0.0f), TransformType.TRANSLATE);
163094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        mGroup1.setTransform(1, new Float4(0.0f, 1.0f, 0.0f, 15.0f), TransformType.ROTATE);
164094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk
165094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        mRobot1.setTransform(0, new Float4(-2.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
169094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        mRobot2.setTransform(0, new Float4(2.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
176094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        mScript = new ScriptC_Scenegraph(mRS, mRes, R.raw.scenegraph, true);
177094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        mTransformScript = new ScriptC_Transform(mRS, mRes, R.raw.transform, false);
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);
190094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        if(entry == null || entry.getClassID() != FileA3D.ClassID.MESH) {
191094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk            Log.e("rs", "could not load model");
192094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        }
193094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        else {
194094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk            mMesh = (Mesh)entry.getObject();
195094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk            mScript.set_gTestMesh(mMesh);
196094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        }
197094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk
198094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        mItalic = Font.create(mRS, mRes, "DroidSerif-Italic.ttf", 8);
199094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        mScript.set_gItalic(mItalic);
200094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk
201094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        initTextAllocation();
202094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk
203094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        initTransformHierarchy();
204094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk
205094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        Log.v("========SceneGraph========", "transform hierarchy initialized");
206094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk
207094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        mScript.bind_gRootNode(mRootTransform.getField());
208094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk
209094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        mScript.bind_gGroup(mGroup1.mParent.mChildField);
210094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        mScript.bind_gRobot1(mRobot1.mParent.mChildField);
211094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        mScript.set_gRobot1Index(mRobot1.mIndexInParentGroup);
212094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        mScript.bind_gRobot2(mRobot2.mParent.mChildField);
213094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        mScript.set_gRobot2Index(mRobot2.mIndexInParentGroup);
214094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk
215094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk        mRS.contextBindRootScript(mScript);
216094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk    }
217094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk}
218094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk
219094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk
220094a068bc46f725a7358ff84317cff2ca4528601Alex Sakhartchouk
221