简单颜色分配在使用GWT的XTK中不起作用(mesh.color=[0.7,0,0])

简单颜色分配在使用GWT的XTK中不起作用(mesh.color=[0.7,0,0]),xtk,Xtk,@哈恩·希哈恩(XTK) 我将edge XTK与GWT结合使用,并尝试渲染一个简单的STL。但是,XTK代码在为网格指定颜色的行失败 mesh.color = [0.7,0,0] // this line fails XTK代码发出错误消息:“无效颜色” 只有在将XTK与GWT一起使用时,才会观察到这种行为 public class TestGwtXtk implements EntryPoint { public void onModuleLoad() { testXtk(); }

@哈恩·希哈恩(XTK)

我将edge XTK与GWT结合使用,并尝试渲染一个简单的STL。但是,XTK代码在为网格指定颜色的行失败

mesh.color = [0.7,0,0] // this line fails
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();
}-*/;
错误似乎来自此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]或新数组(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代码库中的其他几个地方做了类似的更改,以使我的用例得以运行。这里解释了为什么这是正确的解决方案:。你能考虑在版本8的代码库中做这个修正吗?感谢您将XTK与GWT结合使用?你什么意思?您是否编写了自己的包装器来使用从Java到JavaScript的xtk调用编译代码?或者您是否直接在war文件中使用xtk.js并使用它手动编写一些JavaScript?或者你只使用GAE(googleappengine),这是一个用于web应用程序的Google环境(那些用GWT制作的,但也不是用Java编译的)。你能更准确一点吗

它们处理GWT和类型测试的一些问题,您是否尝试使用“new”操作符创建阵列

var mycolor = new Array(0.7,0,0);
mesh.color = mycolor;

1票赞成,但未设为“已解决”,有消息吗?这是问题吗?或者你能给我们带来更多的信息吗?你好,很抱歉延迟回复。在回答之前,我必须尽我所能。我在GWT中使用XTK作为JSNI函数,GWT允许混合Javascript和Java。在我的应用程序中,XTK代码完全是Javascript(包装为GWT JSNI)。所以我的JSNI函数和您最简单的示例代码之间没有区别。。是的,使用“新数组(0.7,0,0)”而不是“[0.7,0,0]”并不能解决问题。根据我的研究,在XTK代码库中使用“goog.isArray(color)而不是(color instanceof Array)”将解决这个问题。感谢您提供更多的建议。您能在github上打开一个问题吗?那么我们可以在下一次发布之前修复它亲爱的xtk。我已经用一段关于如何将xtk与gwt结合使用的片段编辑了我的原始问题。这是对您要求描述我的使用模式的回应。希望这个片段足够了。非常感谢。