2018년 5월 21일 월요일

Cesium에서 Mouse Move 이벤트 처리시 명시적 렌더링하기

명시적 렌더링을 위해 requestRender()를 호출한다.
명시적으로 호출하지 않아도 자동 렌더링 되는 부분과 그렇지 않은 부분이 있다. 아래처럼 속성이 변경되는 경우는 자동 렌더링 되지 않는다.
이벤트가 트리거 될때마다 requestRender()를 호출 할 수 있지만 아래의 코드에서는 entity의 속성이 변경되지 않는 한 직접 호출할 필요가 없다.
//scene을 업데이트하지 않으면 새 프레임을 렌더링하지 않는 뷰어를 만듦
var viewer = new Cesium.Viewer('cesiumContainer', {
    requestRenderMode : true,
    maximumRenderTimeChange : Infinity
});

//entity를 scene에 추가
var entity = viewer.entities.add({
    position : Cesium.Cartesian3.fromDegrees(-75.59777, 40.03883),
    box : {
        dimensions : new Cesium.Cartesian3(1000000.0, 1000000.0, 30000.0),
        material : Cesium.Color.CORNFLOWERBLUE
    }
});

//마우스가 billboard 위에 있으면 크기와 색상을 변경하고, 그런 다음 새로운 렌더 프레임을 요청함
var lastPicked;
handler = new Cesium.ScreenSpaceEventHandler(scene.canvas);

//마우스 이동 이벤트를 걸어줌
handler.setInputAction(function(movement) {
    //마우스 위치의 entity를 알아냄
    //지형이 없는 경우
    var pickedObject = scene.pick(movement.endPosition);

//알아낸 object가 정의된 것이고 추가한 box가 맞는지 확인
    if (Cesium.defined(pickedObject) && (pickedObject.id === entity)) {
        //직전에 속성을 변경한 box이면 처리를 중단
if (Cesium.defined(lastPicked)) {
            return;
        }
        entity.box.material = Cesium.Color.YELLOW;
        scene.requestRender(); //속성 변경후 수동으로 렌더링 함
        lastPicked = pickedObject;
}
    //이미 속성이 변경되었다면 원래대로 속성 변경
    else if (Cesium.defined(lastPicked)) {
        entity.box.material = Cesium.Color.CORNFLOWERBLUE;
        scene.requestRender();
        lastPicked = undefined;
    }
}, Cesium.ScreenSpaceEventType.MOUSE_MOVE);