Skip to content

Commit 3534957

Browse files
Fix error when material component uses a canvas texture and add an example (#806)
1 parent ea5c269 commit 3534957

File tree

2 files changed

+61
-5
lines changed

2 files changed

+61
-5
lines changed

examples/index.html

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,60 @@
1212
models: {type: 'array', oneOf: ['one', 'two', 'three', 'four']}
1313
}
1414
})
15+
16+
AFRAME.registerComponent('draw-smiley', {
17+
schema: {
18+
canvas: {type: 'selector'}
19+
},
20+
init() {
21+
var canvas = this.data.canvas;
22+
var ctx = canvas.getContext('2d');
23+
24+
// Clear canvas and fill with white background
25+
ctx.fillStyle = 'white';
26+
ctx.fillRect(0, 0, canvas.width, canvas.height);
27+
28+
// Center point of canvas
29+
var centerX = canvas.width / 2;
30+
var centerY = canvas.height / 2;
31+
32+
// Smiley parameters
33+
var faceRadius = 200;
34+
var eyeRadius = 20;
35+
var eyeOffsetX = 60;
36+
var eyeOffsetY = 50;
37+
var mouthRadius = 120;
38+
39+
// Draw face
40+
ctx.beginPath();
41+
ctx.arc(centerX, centerY, faceRadius, 0, Math.PI * 2, true); // Outer circle
42+
ctx.fillStyle = 'yellow';
43+
ctx.fill();
44+
ctx.strokeStyle = 'black';
45+
ctx.lineWidth = 4;
46+
ctx.stroke();
47+
48+
// Draw eyes
49+
ctx.beginPath();
50+
ctx.arc(centerX - eyeOffsetX, centerY - eyeOffsetY, eyeRadius, 0, Math.PI * 2, true); // Left eye
51+
ctx.arc(centerX + eyeOffsetX, centerY - eyeOffsetY, eyeRadius, 0, Math.PI * 2, true); // Right eye
52+
ctx.fillStyle = 'black';
53+
ctx.fill();
54+
55+
// Draw smile
56+
ctx.beginPath();
57+
ctx.arc(centerX, centerY + 30, mouthRadius, 0, Math.PI, false); // Mouth (smile)
58+
ctx.lineWidth = 8;
59+
ctx.strokeStyle = 'black';
60+
ctx.stroke();
61+
}
62+
})
1563
</script>
1664
</head>
1765
<body>
1866
<a-scene debug="true">
1967
<a-assets>
68+
<canvas id="canvasTexture" width="512" height="512" />
2069
<a-mixin id="blue" material="color: #4CC3D9"></a-mixin>
2170
<a-mixin id="blueBox" geometry="primitive: box; depth: 2; height: 5; width: 1" material="color: #4CC3D9"></a-mixin>
2271
<a-mixin id="box" geometry="primitive: box; depth: 1; height: 1; width: 1"></a-mixin>
@@ -40,6 +89,7 @@
4089
<a-entity id="yellowSphere" geometry="primitive: sphere" material="color: #ff0; roughness: 1" position="-2 2 -2" models-array="models:one,two"></a-entity>
4190
<a-box src="https://aframe.io/sample-assets/assets/images/bricks/brick_bump.jpg" position="-5 5 -2" width="1" color="#F16745"></a-box>
4291
<a-box id="aBox" position="0 2 0" height="2" color="#FFC65D"></a-box>
92+
<a-plane id="smiley" position="2.5 2 0" width="1" height="1" material="src: #canvasTexture" draw-smiley="canvas: #canvasTexture"></a-plane>
4393

4494
<!-- Models. -->
4595
<a-entity class="boxClass" geometry="primitive: box" material="src: #crateImg" position="3 4 0"></a-entity>

src/components/widgets/TextureWidget.js

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -139,9 +139,12 @@ export default class TextureWidget extends React.Component {
139139
var isAssetHash = value[0] === '#';
140140
var isAssetImg = value instanceof HTMLImageElement;
141141
var isAssetVideo = value instanceof HTMLVideoElement;
142-
var isAssetImgOrVideo = isAssetImg || isAssetVideo;
142+
var isAssetCanvas = value instanceof HTMLCanvasElement;
143+
var isAssetElement = isAssetImg || isAssetVideo || isAssetCanvas;
143144

144-
if (isAssetImgOrVideo) {
145+
if (isAssetCanvas) {
146+
url = null;
147+
} else if (isAssetImg || isAssetVideo) {
145148
url = value.src;
146149
} else if (isAssetHash) {
147150
url = getUrlFromId(value);
@@ -151,7 +154,7 @@ export default class TextureWidget extends React.Component {
151154

152155
var texture = getTextureFromSrc(value);
153156
var valueType = null;
154-
valueType = isAssetImgOrVideo || isAssetHash ? 'asset' : 'url';
157+
valueType = isAssetElement || isAssetHash ? 'asset' : 'url';
155158
if (!isAssetVideo && texture) {
156159
texture.then(paintPreview);
157160
} else if (!isAssetVideo && url) {
@@ -170,7 +173,7 @@ export default class TextureWidget extends React.Component {
170173
}
171174

172175
this.setState({
173-
value: isAssetImgOrVideo ? '#' + value.id : value,
176+
value: isAssetElement ? '#' + value.id : value,
174177
valueType: valueType,
175178
url: url
176179
});
@@ -217,7 +220,10 @@ export default class TextureWidget extends React.Component {
217220
let hint = '';
218221
if (this.state.value) {
219222
if (this.state.valueType === 'asset') {
220-
hint = 'Asset ID: ' + this.state.value + '\nURL: ' + this.state.url;
223+
hint = 'Asset ID: ' + this.state.value;
224+
if (this.state.url !== null) {
225+
hint += '\nURL: ' + this.state.url;
226+
}
221227
} else {
222228
hint = 'URL: ' + this.state.value;
223229
}

0 commit comments

Comments
 (0)