1- import { HtmlCanvasVisual , IRenderContext , NodeStyleBase , Point , Rect , SvgVisual } from 'yfiles'
2- import { } from '../elements/raytrace/RaytraceFlowNodeViewModel' ;
1+ import { HtmlCanvasVisual , IRenderContext , NodeStyleBase , Rect , SvgVisual } from 'yfiles'
32import * as _ from 'lodash' ;
4- import { Material , RayTracer , roundRect , Scene , Sphere , Vector3 } from './raytracer.js'
5-
6- const margin = {
7- top : 30 ,
8- right : 3 ,
9- bottom : - 20 ,
10- left : 3
11- } ;
3+ import { Material , RayTracer , roundRect , Scene , Sphere , Vector3 } from './raytracer'
4+ import { RaytraceFlowNodeViewModel } from '../elements/raytrace/RaytraceFlowNodeViewModel' ;
125
136export class RaytraceVisual extends HtmlCanvasVisual {
7+ get material ( ) : Material {
8+ return this . _material ;
9+ }
10+
11+ set material ( value : Material ) {
12+ this . _material = value ;
13+ this . sphere . material = value ;
14+ }
15+
16+
1417 private rayTracer : RayTracer ;
1518
19+ private _material : Material ;
20+ private sphere : Sphere ;
21+
1622 private getRendering ( scaling ) {
17- const buffer = this . rayTracer . render ( Math . round ( scaling * ( 105 - 2 ) ) , Math . round ( scaling * ( 150 - 12 ) ) ) ;
23+ const buffer = this . rayTracer . render ( Math . round ( scaling * ( 105 - 2 ) ) , Math . round ( scaling * ( 150 - 12 ) ) ) ;
1824 return new Uint8ClampedArray ( buffer ) ;
1925 }
2026
2127 public layout : Rect ;
2228
2329 constructor ( ) {
2430 super ( ) ;
31+ this . _material = new Material ( new Vector3 ( 0.100 , 0.32 , 0.936 ) , 0.1 , 0.05 , new Vector3 ( 0.8 , 0 , 0 ) ) ;
2532 const scene = new Scene ( ) ;
26-
33+ this . sphere = new Sphere ( new Vector3 ( 0 , - 1 , - 20 ) , 3 , this . _material ) ;
2734 // add background sphere
2835 scene . add (
2936 new Sphere ( new Vector3 ( 10.0 , - 10004 , - 20 ) , 10000 ,
@@ -32,8 +39,7 @@ export class RaytraceVisual extends HtmlCanvasVisual {
3239
3340 // add sphere
3441 scene . add (
35- new Sphere ( new Vector3 ( 0 , - 1 , - 20 ) , 3 ,
36- new Material ( new Vector3 ( 0.100 , 0.32 , 0.936 ) , 0.1 , 0.05 , new Vector3 ( 0.8 , 0 , 0 ) ) )
42+ this . sphere
3743 ) ;
3844
3945 // add lights
@@ -48,7 +54,7 @@ export class RaytraceVisual extends HtmlCanvasVisual {
4854
4955 const backgroundColor = new Vector3 ( 0.7 , 0.8 , 0.9 ) ;
5056
51- // create ray tracer
57+ // create the raytracer
5258 this . rayTracer = new RayTracer ( backgroundColor , scene ) ;
5359 }
5460
@@ -59,8 +65,6 @@ export class RaytraceVisual extends HtmlCanvasVisual {
5965 const l = this . layout ;
6066 const canvas = renderContext . canvasComponent ;
6167 const viewPoint = canvas . viewPoint ;
62- const viewPort = canvas . viewport ;
63- const scaling = 1 / canvas . zoom ;
6468
6569
6670 ctx . save ( ) ;
@@ -73,11 +77,13 @@ export class RaytraceVisual extends HtmlCanvasVisual {
7377
7478 ctx . restore ( ) ;
7579 const factor = canvas . zoom ;
76- const imageData = ctx . getImageData ( l . x , l . y , Math . round ( factor * ( 105 - 2 ) ) , Math . round ( factor * ( 150 - 12 ) ) ) ;
77- imageData . data . set ( this . getRendering ( factor ) ) ;
78- // const p = canvas.toViewCoordinates(l)
79- ctx . putImageData ( imageData , canvas . zoom * ( - viewPoint . x + l . x ) , canvas . zoom * ( - viewPoint . y + l . y ) ) ;
80- // ctx.putImageData(imageData, p.x, p.y);
80+ const im = this . getRendering ( factor ) ;
81+ if ( ! _ . isNil ( im ) ) {
82+ const imageData = ctx . getImageData ( l . x , l . y , Math . round ( factor * ( 105 - 2 ) ) , Math . round ( factor * ( 150 - 12 ) ) ) ;
83+ imageData . data . set ( im ) ;
84+ ctx . putImageData ( imageData , canvas . zoom * ( - viewPoint . x + l . x + 1 ) , canvas . zoom * ( - viewPoint . y + l . y + 1 ) ) ;
85+ }
86+
8187
8288 ctx . save ( ) ;
8389 roundRect ( ctx , l . x , l . y , l . width , l . height , 6 , false ) ;
@@ -97,46 +103,6 @@ export class RaytraceVisual extends HtmlCanvasVisual {
97103 ctx . strokeStyle = '#636363' ;
98104 ctx . lineWidth = 2 ;
99105 ctx . stroke ( ) ;
100- return ;
101-
102-
103- // ctx.translate(this.position.x, this.position.y);
104-
105- ctx . save ( )
106-
107- ctx . translate ( viewPoint . x , viewPoint . y ) ;
108- ctx . scale ( scaling , scaling ) ;
109- // create scene
110-
111-
112- // get canvas
113- const canvasWidth = 105 ;
114- const canvasHeight = 150 ;
115-
116- // save start time
117- const startTime = Date . now ( ) ;
118- // ctx.save();
119- // ctx.rect(1, 1, 104, 147);
120- // ctx.clip();
121- // ctx.fillStyle = '#6A5656';
122- // ctx.fillRect(0, 0, 105, 150);
123-
124-
125- ctx . fillStyle = 'green' ;
126- ctx . fillRect ( 0 , 0 , 110 , 20 ) ;
127-
128- ctx . font = '10px sans-serif' ;
129- ctx . fillStyle = 'white' ;
130- ctx . fillText ( 'Raytrace' , 7 , 13 ) ;
131-
132- // ctx.restore();
133- roundRect ( ctx , 0 , 0 , 105 , 150 , 6 , false ) ;
134- ctx . strokeStyle = '#636363' ;
135- ctx . lineWidth = 2 ;
136- ctx . stroke ( ) ;
137- ctx . restore ( )
138- const totalDuration = ( Date . now ( ) - startTime ) / 1000 ;
139- // console.log(`Raytraced in ${totalDuration}s.`)
140106 }
141107
142108}
@@ -165,6 +131,7 @@ export default class RaytraceNodeStyle extends NodeStyleBase {
165131 updateVisual ( renderContext , oldVisual , node ) {
166132 const visual = oldVisual as RaytraceVisual ;
167133 visual . layout = node . layout ;
134+ visual . material = ( node . tag as RaytraceFlowNodeViewModel ) . material ;
168135
169136 return visual ;
170137 }
0 commit comments