blob: 2e3f7254b562280020c2ea11c4b734c7c1d1a3b5 [file] [log] [blame]
/*
* 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.views.detail;
import com.android.ide.eclipse.gltrace.GLEnum;
import com.android.ide.eclipse.gltrace.state.GLCompositeProperty;
import com.android.ide.eclipse.gltrace.state.GLStateType;
import com.android.ide.eclipse.gltrace.state.IGLProperty;
import com.google.common.base.Joiner;
import org.eclipse.jface.action.IContributionItem;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Text;
import java.util.Collections;
import java.util.List;
public class ShaderUniformDetailsProvider implements IStateDetailProvider {
private Text mTextControl;
private static final Joiner JOINER = Joiner.on(", ");
@Override
public boolean isApplicable(IGLProperty state) {
return getShaderUniformProperty(state) != null;
}
@Override
public void createControl(Composite parent) {
mTextControl = new Text(parent, SWT.BORDER | SWT.READ_ONLY | SWT.MULTI | SWT.WRAP);
mTextControl.setEditable(false);
}
@Override
public void disposeControl() {
}
@Override
public Control getControl() {
return mTextControl;
}
@Override
public void updateControl(IGLProperty state) {
IGLProperty uniform = getShaderUniformProperty(state);
if (uniform instanceof GLCompositeProperty) {
GLCompositeProperty uniformProperty = (GLCompositeProperty) uniform;
IGLProperty nameProperty = uniformProperty.getProperty(GLStateType.UNIFORM_NAME);
IGLProperty typeProperty = uniformProperty.getProperty(GLStateType.UNIFORM_TYPE);
IGLProperty valueProperty = uniformProperty.getProperty(GLStateType.UNIFORM_VALUE);
String name = (String) nameProperty.getValue();
GLEnum type = (GLEnum) typeProperty.getValue();
Object value = valueProperty.getValue();
mTextControl.setText(formatUniform(name, type, value));
mTextControl.setEnabled(true);
} else {
mTextControl.setText(""); //$NON-NLS-1$
mTextControl.setEnabled(false);
}
}
private String formatUniform(String name, GLEnum type, Object value) {
String valueText;
switch (type) {
case GL_FLOAT:
case GL_FLOAT_VEC2:
case GL_FLOAT_VEC3:
case GL_FLOAT_VEC4:
case GL_INT:
case GL_INT_VEC2:
case GL_INT_VEC3:
case GL_INT_VEC4:
case GL_BOOL:
case GL_BOOL_VEC2:
case GL_BOOL_VEC3:
case GL_BOOL_VEC4:
valueText = formatVector(value);
break;
case GL_FLOAT_MAT2:
valueText = formatMatrix(2, value);
break;
case GL_FLOAT_MAT3:
valueText = formatMatrix(3, value);
break;
case GL_FLOAT_MAT4:
valueText = formatMatrix(4, value);
break;
case GL_SAMPLER_2D:
case GL_SAMPLER_CUBE:
default:
valueText = value.toString();
break;
}
return String.format("%s %s = %s", type, name, valueText); //$NON-NLS-1$
}
private String formatVector(Object value) {
if (value instanceof List<?>) {
List<?> list = (List<?>) value;
StringBuilder sb = new StringBuilder(list.size() * 4);
sb.append('[');
JOINER.appendTo(sb, list);
sb.append(']');
return sb.toString();
}
return value.toString();
}
private String formatMatrix(int dimension, Object value) {
if (value instanceof List<?>) {
List<?> list = (List<?>) value;
if (list.size() != dimension * dimension) {
// Uniforms can only be square matrices, so this scenario should
// not occur.
return formatVector(value);
}
StringBuilder sb = new StringBuilder(list.size() * 4);
sb.append('[');
sb.append('\n');
for (int i = 0; i < dimension; i++) {
sb.append(" "); //$NON-NLS-1$
JOINER.appendTo(sb, list.subList(i * dimension, (i + 1) * dimension));
sb.append('\n');
}
sb.append(']');
return sb.toString();
}
return value.toString();
}
/**
* Get the {@link GLStateType#PER_UNIFORM_STATE} property given a node in
* the state hierarchy.
*/
private IGLProperty getShaderUniformProperty(IGLProperty state) {
if (state.getType() == GLStateType.PER_UNIFORM_STATE) {
return state;
}
state = state.getParent();
if (state != null && state.getType() == GLStateType.PER_UNIFORM_STATE) {
return state;
}
return null;
}
@Override
public List<IContributionItem> getToolBarItems() {
return Collections.emptyList();
}
}