简单颜色分配在使用GWT的XTK中不起作用(mesh.color=[0.7,0,0])
@哈恩·希哈恩(XTK) 我将edge XTK与GWT结合使用,并尝试渲染一个简单的STL。但是,XTK代码在为网格指定颜色的行失败简单颜色分配在使用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(); }
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结合使用的片段编辑了我的原始问题。这是对您要求描述我的使用模式的回应。希望这个片段足够了。非常感谢。