0

@haehn 嗨,Haehn (XTK)

我正在使用带有 GWT 的 edge-XTK 并尝试渲染一个简单的 STL。然而,XTK 代码在我们为网格分配颜色的那一行失败了。

mesh.color = [0.7,0,0] // this line fails

XTK 代码发出的错误消息:"Invalid color"

仅在将 XTK 与 GWT 一起使用时才会观察到此行为。

错误似乎来自此 XTK 代码片段

X.displayable.prototype.__defineSetter__('color', function(color) {

  // we accept only numbers as arguments
  if (!goog.isDefAndNotNull(color) || !(color instanceof Array) ||
      (color.length != 3)) {

    throw new Error('Invalid color.');

  }

我猜问题出在 GWT 使用 iframe 构建页面的方式上……因为上面的 if 条件可能在 GWT 中失败。我想如果你用下面的代码片段替换上面的检查(从这里得到想法)。它可能会解决问题。

use goog.isArray(color) instead of (color instanceof Array)

你能调查和评论吗?

编辑:

嗨XTK

这是显示我如何将 XTK 与 GWT 一起使用的代码片段。

public class TestGwtXtk implements EntryPoint {

public void onModuleLoad() {
    testXtk();
}

    // GWT JSNI method, which allows mixing Java and JS natively. 
    // it is akin using c++ or c libraries in java or android

private native void testXtk() /*-{
    var r = new $wnd.X.renderer3D();
    r.container = 'xtk_container'; // div ele
    r.config.PROGRESSBAR_ENABLED = false;
    r.init();

    cube = new $wnd.X.cube();
    cube.lengthX = cube.lengthY = cube.lengthZ = 20;
    cube.color = [ 1, 1, 1 ]; // fails here in XTK code
    cube.center = [ 0, 0, 0 ]; // fails here in XTK code
    r.add(cube);
    r.render();
}-*/;

}

正如内联注释所指出的,使用 javascript 数组失败。失败不是因为js数组使用,比如[0,0,0]或者new Array(0,0,0)错误。失败是因为 XTK 代码检查“数组实例”的方式。

编辑:2

亲爱的XTK

我能够从 git 签出 XTK 代码,进行我提议的更改,重新构建 XTK.js 并最终成功测试我的修复解决了问题。

例如:在 displayable.js 我注释了一行并添加了另一行:

// if (!goog.isDefAndNotNull(color) || !(color instanceof Array) || (color.length != 3)) {

if (!goog.isDefAndNotNull(color) || !(goog.isArray(color)) || (color.length != 3)) {

我在 xtk 代码库的其他几个地方进行了类似的更改,以使我的用例继续运行。此处解释了为什么这是正确的解决方案:Closure: The Definitive Guide。您能否考虑在版本 8 的代码库中进行此修复?谢谢

4

1 回答 1

1

将 XTK 与 GWT 一起使用?你是什​​么意思 ?您是否编写了自己的包装器来编译带有从 Java 到 JavaScript 的 xtk 调用的代码?或者你直接在war文件中使用xtk.js并使用它手动编写一些JavaScript?还是您只使用 GAE(Google App Engine),即用于 Web 应用程序的 Google 环境(使用 GWT 制作的,但也不是从 Java 编译的)。请问你能更准确吗?

在这里,他们处理 GWT 和类型测试的一些问题,您是否尝试使用“new”运算符创建数组?

var mycolor = new Array(0.7,0,0);
mesh.color = mycolor;
于 2012-06-18T07:39:08.353 回答