aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.gldebugger/plugin.xml8
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/GLTracePerspective.java28
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/editors/StateViewPage.java24
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/GLStringProperty.java2
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/GLFramebufferView.java72
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/ImageViewPart.java108
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/StateView.java14
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/TextureView.java104
8 files changed, 283 insertions, 77 deletions
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/plugin.xml b/eclipse/plugins/com.android.ide.eclipse.gldebugger/plugin.xml
index 798175b..9d0accb 100644
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/plugin.xml
+++ b/eclipse/plugins/com.android.ide.eclipse.gldebugger/plugin.xml
@@ -31,6 +31,14 @@
name="GL State"
restorable="true">
</view>
+ <view
+ category="com.android.ide.eclipse.gltrace"
+ class="com.android.ide.eclipse.gltrace.views.TextureView"
+ icon="icons/opengl.png"
+ id="com.android.ide.eclipse.gltrace.views.Texture"
+ name="Texture"
+ restorable="true">
+ </view>
</extension>
<extension
point="org.eclipse.ui.editors">
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/GLTracePerspective.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/GLTracePerspective.java
index 6f4ee7e..6ff0419 100644
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/GLTracePerspective.java
+++ b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/GLTracePerspective.java
@@ -18,25 +18,39 @@ package com.android.ide.eclipse.gltrace;
import com.android.ide.eclipse.gltrace.views.GLFramebufferView;
import com.android.ide.eclipse.gltrace.views.StateView;
+import com.android.ide.eclipse.gltrace.views.TextureView;
import org.eclipse.ui.IFolderLayout;
import org.eclipse.ui.IPageLayout;
import org.eclipse.ui.IPerspectiveFactory;
public class GLTracePerspective implements IPerspectiveFactory {
- private static final String STATE_FOLDER_ID = "right"; //$NON-NLS-1$
- private static final String FB_FOLDER_ID = "rightBottom"; //$NON-NLS-1$
+ private static final String STATE_FOLDER_ID = "stateFolder"; //$NON-NLS-1$
+ private static final String FB_FOLDER_ID = "fbFolder"; //$NON-NLS-1$
+ private static final String TEXTURE_VIEW_FOLDER_ID = "textureViewFolder"; //$NON-NLS-1$
@Override
public void createInitialLayout(IPageLayout layout) {
+ // Create a 3 column layout
+ // The first column contains the function trace in an editor.
+ // The second column contains the GL State View.
+ // The third column contains the texture view and the top and the framebuffer at the bottom.
+
// Add the OpenGL state view to the right of the editor
- IFolderLayout right = layout.createFolder(STATE_FOLDER_ID, IPageLayout.RIGHT, 0.7f,
+ IFolderLayout column2 = layout.createFolder(STATE_FOLDER_ID, IPageLayout.RIGHT, 0.65f,
layout.getEditorArea());
- right.addView(StateView.ID);
+ column2.addView(StateView.ID);
- // Add the OpenGL Framebuffer view below the state view
- IFolderLayout rightBottom = layout.createFolder(FB_FOLDER_ID, IPageLayout.BOTTOM, 0.6f,
+ // Add the Texture View in the 3rd column
+ IFolderLayout column3 = layout.createFolder(FB_FOLDER_ID, IPageLayout.RIGHT, 0.6f,
STATE_FOLDER_ID);
- rightBottom.addView(GLFramebufferView.ID);
+ column3.addView(TextureView.ID);
+
+ // Add the OpenGL Framebuffer view below the texture view (bottom of 3rd column)
+ IFolderLayout column3bottom = layout.createFolder(TEXTURE_VIEW_FOLDER_ID,
+ IPageLayout.BOTTOM,
+ 0.5f,
+ FB_FOLDER_ID);
+ column3bottom.addView(GLFramebufferView.ID);
}
}
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/editors/StateViewPage.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/editors/StateViewPage.java
index 40e0a2a..5635825 100644
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/editors/StateViewPage.java
+++ b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/editors/StateViewPage.java
@@ -28,6 +28,8 @@ import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.swt.SWT;
@@ -52,7 +54,7 @@ import java.util.Set;
* A tree view of the OpenGL state. It listens to the current GLCall that is selected
* in the Function Trace view, and updates its view to reflect the state as of the selected call.
*/
-public class StateViewPage extends Page implements ISelectionListener {
+public class StateViewPage extends Page implements ISelectionListener, ISelectionProvider {
public static final String ID = "com.android.ide.eclipse.gltrace.views.GLState"; //$NON-NLS-1$
private final GLTrace mTrace;
@@ -261,4 +263,24 @@ public class StateViewPage extends Page implements ISelectionListener {
return changedProperties;
}
+
+ @Override
+ public void addSelectionChangedListener(ISelectionChangedListener listener) {
+ mTreeViewer.addSelectionChangedListener(listener);
+ }
+
+ @Override
+ public ISelection getSelection() {
+ return mTreeViewer.getSelection();
+ }
+
+ @Override
+ public void removeSelectionChangedListener(ISelectionChangedListener listener) {
+ mTreeViewer.removeSelectionChangedListener(listener);
+ }
+
+ @Override
+ public void setSelection(ISelection selection) {
+ mTreeViewer.setSelection(selection);
+ }
}
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/GLStringProperty.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/GLStringProperty.java
index af435af..14a93e3 100644
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/GLStringProperty.java
+++ b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/state/GLStringProperty.java
@@ -57,6 +57,6 @@ public class GLStringProperty extends GLAbstractAtomicProperty {
@Override
public String toString() {
- return mCurrentValue;
+ return getType() + "=" + getStringValue(); //$NON-NLS-1$
};
}
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/GLFramebufferView.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/GLFramebufferView.java
index d7718109..634a733 100644
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/GLFramebufferView.java
+++ b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/GLFramebufferView.java
@@ -16,90 +16,26 @@
package com.android.ide.eclipse.gltrace.views;
-import com.android.ide.eclipse.gldebugger.Activator;
import com.android.ide.eclipse.gltrace.editors.GLFunctionTraceViewer;
import com.android.ide.eclipse.gltrace.model.GLCall;
import com.android.ide.eclipse.gltrace.model.GLTrace;
-import com.android.ide.eclipse.gltrace.widgets.ImageCanvas;
-import org.eclipse.jface.action.Action;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.ISelectionListener;
-import org.eclipse.ui.ISelectionService;
import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.part.ViewPart;
import java.util.List;
-public class GLFramebufferView extends ViewPart implements ISelectionListener {
- public static final String ID = "com.android.ide.eclipse.gltrace.views.GLFrameBuffer"; //$NON-NLS-1$
- private static final boolean FIT_TO_CANVAS_DEFAULT = true;
- private ImageCanvas mImageCanvas;
-
+public class GLFramebufferView extends ImageViewPart {
public GLFramebufferView() {
+ super(true);
}
- @Override
- public void createPartControl(Composite parent) {
- createImageCanvas(parent);
- createToolbar();
-
- ISelectionService selectionService = getSite().getWorkbenchWindow().getSelectionService();
- selectionService.addPostSelectionListener(this);
- }
-
- @Override
- public void dispose() {
- if (mImageCanvas != null) {
- mImageCanvas.dispose();
- mImageCanvas = null;
- }
-
- ISelectionService selectionService = getSite().getWorkbenchWindow().getSelectionService();
- selectionService.removePostSelectionListener(this);
- super.dispose();
- }
-
- @Override
- public void setFocus() {
- if (mImageCanvas != null) {
- mImageCanvas.setFocus();
- }
- }
-
- private class FitToCanvasAction extends Action {
- public FitToCanvasAction() {
- super("Fit to Canvas", Activator.getImageDescriptor("/icons/zoomfit.png")); //$NON-NLS-2$
- setToolTipText("Fit Image to Canvas");
- setChecked(FIT_TO_CANVAS_DEFAULT);
- }
-
- @Override
- public void run() {
- mImageCanvas.setFitToCanvas(isChecked());
- }
- }
-
- private void createImageCanvas(Composite parent) {
- mImageCanvas = new ImageCanvas(parent);
- mImageCanvas.setFitToCanvas(FIT_TO_CANVAS_DEFAULT);
- }
-
- private void createToolbar() {
- getViewSite().getActionBars().getToolBarManager().add(new FitToCanvasAction());
- }
+ public static final String ID = "com.android.ide.eclipse.gltrace.views.GLFrameBuffer"; //$NON-NLS-1$
public void displayFB(final Image image) {
- Display.getDefault().asyncExec(new Runnable() {
- @Override
- public void run() {
- mImageCanvas.setImage(image);
- }
- });
+ setImage(image);
}
@Override
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/ImageViewPart.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/ImageViewPart.java
new file mode 100644
index 0000000..67b879a
--- /dev/null
+++ b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/ImageViewPart.java
@@ -0,0 +1,108 @@
+/*
+ * 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;
+
+import com.android.ide.eclipse.gldebugger.Activator;
+import com.android.ide.eclipse.gltrace.widgets.ImageCanvas;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.ISelectionListener;
+import org.eclipse.ui.ISelectionService;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.part.ViewPart;
+
+/**
+ * The {@link ImageViewPart} is an abstract implementation of an Eclipse View
+ * that holds an image canvas. This class registers itself to listen to the workbench
+ * selection service. Subclasses must implement the
+ * {@link #selectionChanged(IWorkbenchPart, ISelection)} method, and call {@link #setImage(Image)}
+ * to update the image to be displayed.
+ */
+public abstract class ImageViewPart extends ViewPart implements ISelectionListener {
+ private boolean mFitToCanvasDefault = true;
+ private ImageCanvas mImageCanvas;
+
+ public ImageViewPart(boolean fitToCanvasByDefault) {
+ mFitToCanvasDefault = fitToCanvasByDefault;
+ }
+
+ @Override
+ public void createPartControl(Composite parent) {
+ createImageCanvas(parent);
+ createToolbar();
+
+ ISelectionService selectionService = getSite().getWorkbenchWindow().getSelectionService();
+ selectionService.addPostSelectionListener(this);
+ }
+
+ @Override
+ public void dispose() {
+ if (mImageCanvas != null) {
+ mImageCanvas.dispose();
+ mImageCanvas = null;
+ }
+
+ ISelectionService selectionService = getSite().getWorkbenchWindow().getSelectionService();
+ selectionService.removePostSelectionListener(this);
+ super.dispose();
+ }
+
+ @Override
+ public void setFocus() {
+ if (mImageCanvas != null) {
+ mImageCanvas.setFocus();
+ }
+ }
+
+ private class FitToCanvasAction extends Action {
+ public FitToCanvasAction() {
+ super("Fit to Canvas", Activator.getImageDescriptor("/icons/zoomfit.png")); //$NON-NLS-2$
+ setToolTipText("Fit Image to Canvas");
+ setChecked(mFitToCanvasDefault);
+ }
+
+ @Override
+ public void run() {
+ mImageCanvas.setFitToCanvas(isChecked());
+ }
+ }
+
+ private void createImageCanvas(Composite parent) {
+ mImageCanvas = new ImageCanvas(parent);
+ mImageCanvas.setFitToCanvas(mFitToCanvasDefault);
+ }
+
+ private void createToolbar() {
+ getViewSite().getActionBars().getToolBarManager().add(new FitToCanvasAction());
+ }
+
+ protected void setImage(final Image image) {
+ Display.getDefault().asyncExec(new Runnable() {
+ @Override
+ public void run() {
+ mImageCanvas.setImage(image);
+ }
+ });
+ };
+
+ @Override
+ public abstract void selectionChanged(IWorkbenchPart part, ISelection selection);
+}
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/StateView.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/StateView.java
index cd7669d..c3782ca 100644
--- a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/StateView.java
+++ b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/StateView.java
@@ -19,9 +19,11 @@ package com.android.ide.eclipse.gltrace.views;
import com.android.ide.eclipse.gltrace.editors.GLFunctionTraceViewer;
import com.android.ide.eclipse.gltrace.editors.StateViewPage;
+import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.part.IPage;
+import org.eclipse.ui.part.IPageSite;
import org.eclipse.ui.part.MessagePage;
import org.eclipse.ui.part.PageBook;
import org.eclipse.ui.part.PageBookView;
@@ -84,4 +86,16 @@ public class StateView extends PageBookView {
public void partBroughtToTop(IWorkbenchPart part) {
partActivated(part);
}
+
+ @Override
+ protected void showPageRec(PageRec pageRec) {
+ IPageSite pageSite = getPageSite(pageRec.page);
+ if (pageRec.page instanceof ISelectionProvider) {
+ pageSite.setSelectionProvider((ISelectionProvider) pageRec.page);
+ } else {
+ pageSite.setSelectionProvider(null); // clear selection provider
+ }
+
+ super.showPageRec(pageRec);
+ }
}
diff --git a/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/TextureView.java b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/TextureView.java
new file mode 100644
index 0000000..a355bae
--- /dev/null
+++ b/eclipse/plugins/com.android.ide.eclipse.gldebugger/src/com/android/ide/eclipse/gltrace/views/TextureView.java
@@ -0,0 +1,104 @@
+/*
+ * 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;
+
+import com.android.ide.eclipse.gltrace.state.GLCompositeProperty;
+import com.android.ide.eclipse.gltrace.state.GLStateType;
+import com.android.ide.eclipse.gltrace.state.GLStringProperty;
+import com.android.ide.eclipse.gltrace.state.IGLProperty;
+
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.IWorkbenchPart;
+
+import java.util.List;
+
+public class TextureView extends ImageViewPart {
+ public TextureView() {
+ super(false);
+ }
+
+ public static final String ID = "com.android.ide.eclipse.gltrace.views.Texture"; //$NON-NLS-1$
+
+ @Override
+ public void selectionChanged(IWorkbenchPart part, ISelection selection) {
+ if (!(part instanceof StateView)) {
+ return;
+ }
+
+ if (!(selection instanceof IStructuredSelection)) {
+ return;
+ }
+
+ IStructuredSelection ssel = (IStructuredSelection) selection;
+ @SuppressWarnings("rawtypes")
+ List objects = ssel.toList();
+ if (objects.size() > 0) {
+ Object data = objects.get(0);
+ if (!(data instanceof IGLProperty)) {
+ return;
+ }
+
+ String textureImagePath = getTextureImage((IGLProperty) data);
+ if (textureImagePath == null) {
+ setImage(null);
+ return;
+ }
+
+ setImage(getImage(textureImagePath));
+ }
+ }
+
+ private Image getImage(String imagePath) {
+ return new Image(Display.getDefault(), imagePath);
+ }
+
+ /**
+ * Extract the TEXTURE_IMAGE property from the gl state hierarchy.
+ * The TEXTURE_IMAGE property fits in the hierarchy like so:
+ * ...
+ * |---PER_TEXTURE_STATE
+ * |--
+ * |-- TEXTURE_IMAGE
+ *
+ * So we can extract the TEXTURE_IMAGE if the given property is either PER_TEXTURE_STATE,
+ * or a child of PER_TEXTURE_STATE.
+ */
+ private String getTextureImage(IGLProperty property) {
+ // if the selected property is the texture image, then we just return its value
+ if (property.getType() == GLStateType.TEXTURE_IMAGE) {
+ return ((GLStringProperty) property).getStringValue();
+ }
+
+ if (property.getType() != GLStateType.PER_TEXTURE_STATE) {
+ // See if the property is a child of PER_TEXTURE_STATE
+ IGLProperty parent = property.getParent();
+ if (parent == null || parent.getType() != GLStateType.PER_TEXTURE_STATE) {
+ return null;
+ } else {
+ property = parent;
+ }
+ }
+
+ // property is now the parent property of TEXTURE_IMAGE
+ GLCompositeProperty perTextureState = (GLCompositeProperty) property;
+ IGLProperty imageProperty = perTextureState.getProperty(GLStateType.TEXTURE_IMAGE);
+ return ((GLStringProperty) imageProperty).getStringValue();
+ }
+}