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;
21a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
22a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport android.util.Log;
23a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
24a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport android.renderscript.*;
25a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukimport android.content.res.Resources;
26a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
27a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk/**
28a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk * @hide
29a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk */
30a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchoukpublic class RenderPass extends SceneGraphBase {
31a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
32e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchouk    TextureRenderTarget mColorTarget;
33a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    Float4 mClearColor;
34a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    boolean mShouldClearColor;
35a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
36e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchouk    TextureRenderTarget mDepthTarget;
37a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    float mClearDepth;
38a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    boolean mShouldClearDepth;
39a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
40684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk    ArrayList<RenderableBase> mObjectsToDraw;
41a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
42a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    Camera mCamera;
43a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
44a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    ScriptField_RenderPass_s.Item mRsField;
45a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
46a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    public RenderPass() {
47684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk        mObjectsToDraw = new ArrayList<RenderableBase>();
48a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mClearColor = new Float4(0.0f, 0.0f, 0.0f, 0.0f);
49a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mShouldClearColor = true;
50a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mClearDepth = 1.0f;
51a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mShouldClearDepth = true;
52a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
53a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
54684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk    public void appendRenderable(Renderable d) {
55a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mObjectsToDraw.add(d);
56a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
57a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
58a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    public void setCamera(Camera c) {
59a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mCamera = c;
60a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
61a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
62e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchouk    public void setColorTarget(TextureRenderTarget colorTarget) {
63a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mColorTarget = colorTarget;
64a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
65a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    public void setClearColor(Float4 clearColor) {
66a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mClearColor = clearColor;
67a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
68a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    public void setShouldClearColor(boolean shouldClearColor) {
69a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mShouldClearColor = shouldClearColor;
70a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
71a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
72e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchouk    public void setDepthTarget(TextureRenderTarget depthTarget) {
73a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mDepthTarget = depthTarget;
74a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
75a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    public void setClearDepth(float clearDepth) {
76a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mClearDepth = clearDepth;
77a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
78a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    public void setShouldClearDepth(boolean shouldClearDepth) {
79a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mShouldClearDepth = shouldClearDepth;
80a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
81a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
82516054bf53b0a8844267185ddaf1d505c9e81da7Alex Sakhartchouk    public ArrayList<RenderableBase> getRenderables() {
83516054bf53b0a8844267185ddaf1d505c9e81da7Alex Sakhartchouk        return mObjectsToDraw;
84516054bf53b0a8844267185ddaf1d505c9e81da7Alex Sakhartchouk    }
85516054bf53b0a8844267185ddaf1d505c9e81da7Alex Sakhartchouk
86a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    ScriptField_RenderPass_s.Item getRsField(RenderScriptGL rs, Resources res) {
87a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        if (mRsField != null) {
88a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            return mRsField;
89a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        }
90a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
91a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mRsField = new ScriptField_RenderPass_s.Item();
92e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchouk        if (mColorTarget != null) {
93e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchouk            mRsField.color_target = mColorTarget.getRsData(true).get_texture(0);
94e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchouk        }
95e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchouk        if (mColorTarget != null) {
96e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchouk            mRsField.depth_target = mDepthTarget.getRsData(true).get_texture(0);
97e8bb420a687598be9801e7ff4a0d114fa72ac5bcAlex Sakhartchouk        }
98e93db17a143ff560f92d94b68ce1e76f79db7902Alex Sakhartchouk        mRsField.camera = mCamera != null ? mCamera.getRSData().getAllocation() : null;
99a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
100a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        if (mObjectsToDraw.size() != 0) {
101a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            Allocation drawableData = Allocation.createSized(rs,
102a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                                                              Element.ALLOCATION(rs),
103a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                                                              mObjectsToDraw.size());
104a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            Allocation[] drawableAllocs = new Allocation[mObjectsToDraw.size()];
105a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            for (int i = 0; i < mObjectsToDraw.size(); i ++) {
106684267525b349eb12f4e31d88061c51115678decAlex Sakhartchouk                Renderable dI = (Renderable)mObjectsToDraw.get(i);
107a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk                drawableAllocs[i] = dI.getRsField(rs, res).getAllocation();
108a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            }
109a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            drawableData.copyFrom(drawableAllocs);
110a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk            mRsField.objects = drawableData;
111a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        }
112a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
113a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mRsField.clear_color = mClearColor;
114a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mRsField.clear_depth = mClearDepth;
115a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mRsField.should_clear_color = mShouldClearColor;
116a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        mRsField.should_clear_depth = mShouldClearDepth;
117a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk        return mRsField;
118a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk    }
119a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk}
120a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
121a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
122a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
123a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
124a7a211b8a68a7d3f5ff4409aa286db07f96c0550Alex Sakhartchouk
125