| /* |
| * Copyright (C) 2012 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package com.android.ide.eclipse.gltrace.state.transforms; |
| |
| import com.android.ide.eclipse.gltrace.state.GLIntegerProperty; |
| import com.android.ide.eclipse.gltrace.state.GLStateType; |
| import com.android.ide.eclipse.gltrace.state.IGLProperty; |
| |
| /** |
| * The {@link TexturePropertyAccessor} provides the ability to access a |
| * texture property. Texture properties are accessed by first identifying the active |
| * texture unit ({@link GLStateType#ACTIVE_TEXTURE_UNIT}), and then identifying the texture |
| * that is bound to that unit. |
| */ |
| public class TexturePropertyAccessor implements IGLPropertyAccessor { |
| private final int mContextId; |
| private final GLStateType mTargetUnitType; |
| private final int mMipmapLevel; |
| private final GLStateType mTextureType; |
| private TextureUnitPropertyAccessor mTextureUnitPropertyAccessor; |
| |
| public TexturePropertyAccessor(int contextId, GLStateType textureUnitTarget, int level, |
| GLStateType textureTargetName) { |
| mContextId = contextId; |
| mTargetUnitType = textureUnitTarget; |
| mMipmapLevel = level; |
| mTextureType = textureTargetName; |
| mTextureUnitPropertyAccessor = new TextureUnitPropertyAccessor(mContextId, |
| mTargetUnitType); |
| } |
| |
| public TexturePropertyAccessor(int contextId, GLStateType textureUnitTarget, |
| GLStateType textureTargetName) { |
| this(contextId, textureUnitTarget, -1, textureTargetName); |
| } |
| |
| @Override |
| public IGLProperty getProperty(IGLProperty state) { |
| // identify the texture that is bound in the current active texture unit |
| IGLProperty targetTexture = mTextureUnitPropertyAccessor.getProperty(state); |
| if (!(targetTexture instanceof GLIntegerProperty)) { |
| return null; |
| } |
| Integer textureId = (Integer) targetTexture.getValue(); |
| |
| // now extract the required property from the selected texture |
| IGLPropertyAccessor textureAccessor; |
| if (mMipmapLevel >= 0) { |
| textureAccessor = GLPropertyAccessor.makeAccessor(mContextId, |
| GLStateType.TEXTURE_STATE, |
| GLStateType.TEXTURES, |
| textureId, |
| GLStateType.TEXTURE_MIPMAPS, |
| Integer.valueOf(mMipmapLevel), |
| mTextureType); |
| } else { |
| textureAccessor = GLPropertyAccessor.makeAccessor(mContextId, |
| GLStateType.TEXTURE_STATE, |
| GLStateType.TEXTURES, |
| textureId, |
| mTextureType); |
| } |
| |
| return textureAccessor.getProperty(state); |
| } |
| |
| @Override |
| public String getPath() { |
| return String.format("TEXTURE_STATE/TEXTURES/${activeTexture}/%s", mTextureType); |
| } |
| |
| } |