1a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk/*
2a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk * Copyright (C) 2011 The Android Open Source Project
3a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk *
4a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk * Licensed under the Apache License, Version 2.0 (the "License");
5a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk * you may not use this file except in compliance with the License.
6a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk * You may obtain a copy of the License at
7a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk *
8a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk *      http://www.apache.org/licenses/LICENSE-2.0
9a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk *
10a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk * Unless required by applicable law or agreed to in writing, software
11a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk * distributed under the License is distributed on an "AS IS" BASIS,
12a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk * See the License for the specific language governing permissions and
14a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk * limitations under the License.
15a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk */
16a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
17a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukpackage com.android.scenegraph;
18a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
19a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport java.lang.Math;
20a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport java.util.ArrayList;
2199b93819f12f18b8559f702d7a303c31fe05205aAlex Sakhartchoukimport android.content.res.Resources;
22a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
23a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport android.renderscript.Allocation;
24a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport android.renderscript.Element;
25a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport android.renderscript.Matrix4f;
26a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport android.renderscript.ProgramFragment;
27a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport android.renderscript.ProgramRaster;
28a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport android.renderscript.ProgramStore;
29a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport android.renderscript.ProgramVertex;
30a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport android.renderscript.RSRuntimeException;
31a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport android.renderscript.RenderScript;
32a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport android.renderscript.RenderScriptGL;
33a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport android.util.Log;
34a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
35a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk/**
36a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk * @hide
37a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk */
38a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukpublic class RenderState extends SceneGraphBase {
394fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk    VertexShader mVertex;
404fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk    FragmentShader mFragment;
41a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    ProgramStore mStore;
42a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    ProgramRaster mRaster;
43a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
44a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    ScriptField_RenderState_s mField;
45a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
464fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk    public RenderState(VertexShader pv,
474fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk                       FragmentShader pf,
48a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                       ProgramStore ps,
49a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                       ProgramRaster pr) {
50a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mVertex = pv;
51a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mFragment = pf;
52a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mStore = ps;
53a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mRaster = pr;
54a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
55a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
56a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    public RenderState(RenderState r) {
57a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mVertex = r.mVertex;
58a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mFragment = r.mFragment;
59a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mStore = r.mStore;
60a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mRaster = r.mRaster;
61a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
62a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
634fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk    public void setProgramVertex(VertexShader pv) {
64a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mVertex = pv;
65e93db17a143ff560f92d94b68ce1e76f79db7902Alex Sakhartchouk        updateRSData();
66a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
67a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
684fd35d8f49dbed174828da60b70c37e7a77a0d13Alex Sakhartchouk    public void setProgramFragment(FragmentShader pf) {
69a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mFragment = pf;
70e93db17a143ff560f92d94b68ce1e76f79db7902Alex Sakhartchouk        updateRSData();
71a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
72a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
73a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    public void setProgramStore(ProgramStore ps) {
74a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mStore = ps;
75e93db17a143ff560f92d94b68ce1e76f79db7902Alex Sakhartchouk        updateRSData();
76a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
77a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
78a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    public void setProgramRaster(ProgramRaster pr) {
79a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mRaster = pr;
80e93db17a143ff560f92d94b68ce1e76f79db7902Alex Sakhartchouk        updateRSData();
81a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
82a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
83e93db17a143ff560f92d94b68ce1e76f79db7902Alex Sakhartchouk    void updateRSData() {
84e93db17a143ff560f92d94b68ce1e76f79db7902Alex Sakhartchouk        if (mField == null) {
85e93db17a143ff560f92d94b68ce1e76f79db7902Alex Sakhartchouk            return;
86a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        }
87a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        ScriptField_RenderState_s.Item item = new ScriptField_RenderState_s.Item();
88e93db17a143ff560f92d94b68ce1e76f79db7902Alex Sakhartchouk        item.pv = mVertex.getRSData().getAllocation();
89e93db17a143ff560f92d94b68ce1e76f79db7902Alex Sakhartchouk        item.pf = mFragment.getRSData().getAllocation();
90a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        item.ps = mStore;
91a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        item.pr = mRaster;
92a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
93a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mField.set(item, 0, true);
94e93db17a143ff560f92d94b68ce1e76f79db7902Alex Sakhartchouk    }
95e93db17a143ff560f92d94b68ce1e76f79db7902Alex Sakhartchouk
96e93db17a143ff560f92d94b68ce1e76f79db7902Alex Sakhartchouk    public ScriptField_RenderState_s getRSData() {
97e93db17a143ff560f92d94b68ce1e76f79db7902Alex Sakhartchouk        if (mField != null) {
98e93db17a143ff560f92d94b68ce1e76f79db7902Alex Sakhartchouk            return mField;
99e93db17a143ff560f92d94b68ce1e76f79db7902Alex Sakhartchouk        }
100e93db17a143ff560f92d94b68ce1e76f79db7902Alex Sakhartchouk
101e93db17a143ff560f92d94b68ce1e76f79db7902Alex Sakhartchouk        RenderScriptGL rs = SceneManager.getRS();
102e93db17a143ff560f92d94b68ce1e76f79db7902Alex Sakhartchouk        if (rs == null) {
103e93db17a143ff560f92d94b68ce1e76f79db7902Alex Sakhartchouk            return null;
104e93db17a143ff560f92d94b68ce1e76f79db7902Alex Sakhartchouk        }
105e93db17a143ff560f92d94b68ce1e76f79db7902Alex Sakhartchouk
106e93db17a143ff560f92d94b68ce1e76f79db7902Alex Sakhartchouk        mField = new ScriptField_RenderState_s(rs, 1);
107e93db17a143ff560f92d94b68ce1e76f79db7902Alex Sakhartchouk        updateRSData();
108e93db17a143ff560f92d94b68ce1e76f79db7902Alex Sakhartchouk
109a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        return mField;
110a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
111a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk}
112