mirror of
https://github.com/openglobus/openglobus.git
synced 2025-12-08 19:25:27 +00:00
889 wip.bb added texOffset parameter
This commit is contained in:
parent
ede48db407
commit
0407f65b46
@ -16,6 +16,7 @@ export interface IRayParams {
|
|||||||
visibility?: boolean;
|
visibility?: boolean;
|
||||||
src?: string;
|
src?: string;
|
||||||
image?: HTMLImageElement;
|
image?: HTMLImageElement;
|
||||||
|
texOffset?: number;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -95,6 +96,8 @@ class Ray {
|
|||||||
*/
|
*/
|
||||||
protected _image: HTMLImageElement & { __nodeIndex?: number } | null;
|
protected _image: HTMLImageElement & { __nodeIndex?: number } | null;
|
||||||
|
|
||||||
|
protected _texOffset: number;
|
||||||
|
|
||||||
constructor(options: IRayParams = {}) {
|
constructor(options: IRayParams = {}) {
|
||||||
|
|
||||||
this.__id = Ray.__counter__++;
|
this.__id = Ray.__counter__++;
|
||||||
@ -129,6 +132,8 @@ class Ray {
|
|||||||
this._image = options.image || null;
|
this._image = options.image || null;
|
||||||
|
|
||||||
this._src = options.src || null;
|
this._src = options.src || null;
|
||||||
|
|
||||||
|
this._texOffset = options.texOffset || 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -307,6 +312,15 @@ class Ray {
|
|||||||
this._handler && this._handler.setRgbaArr(this._handlerIndex, this._startColor, this._endColor);
|
this._handler && this._handler.setRgbaArr(this._handlerIndex, this._startColor, this._endColor);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public get texOffset(): number {
|
||||||
|
return this._texOffset;
|
||||||
|
}
|
||||||
|
|
||||||
|
public set texOffset(value: number) {
|
||||||
|
this._texOffset = value;
|
||||||
|
this._handler && this._handler.setTexOffsetArr(this._handlerIndex, value);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns ray start position.
|
* Returns ray start position.
|
||||||
* @public
|
* @public
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
import * as shaders from "../shaders/ray/ray";
|
import * as shaders from "../shaders/ray/ray";
|
||||||
import {concatArrays, concatTypedArrays, makeArrayTyped, spliceArray} from "../utils/shared";
|
import {concatArrays, concatTypedArrays, makeArrayTyped, spliceArray, spliceTypedArray} from "../utils/shared";
|
||||||
import type {TypedArray} from "../utils/shared";
|
import type {TypedArray} from "../utils/shared";
|
||||||
import {EntityCollection} from "./EntityCollection";
|
import {EntityCollection} from "./EntityCollection";
|
||||||
import {Ray} from "./Ray";
|
import {Ray} from "./Ray";
|
||||||
@ -15,6 +15,7 @@ const RGBA_BUFFER = 3;
|
|||||||
const THICKNESS_BUFFER = 4;
|
const THICKNESS_BUFFER = 4;
|
||||||
const VERTEX_BUFFER = 5;
|
const VERTEX_BUFFER = 5;
|
||||||
const TEXCOORD_BUFFER = 6;
|
const TEXCOORD_BUFFER = 6;
|
||||||
|
const TEXOFFSET_BUFFER = 7;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* og.RayHandler
|
* og.RayHandler
|
||||||
@ -49,6 +50,7 @@ class RayHandler {
|
|||||||
protected _thicknessBuffer: WebGLBufferExt | null;
|
protected _thicknessBuffer: WebGLBufferExt | null;
|
||||||
protected _rgbaBuffer: WebGLBufferExt | null;
|
protected _rgbaBuffer: WebGLBufferExt | null;
|
||||||
protected _pickingColorBuffer: WebGLBufferExt | null;
|
protected _pickingColorBuffer: WebGLBufferExt | null;
|
||||||
|
protected _texOffsetBuffer: WebGLBufferExt | null;
|
||||||
|
|
||||||
protected _vertexArr: TypedArray | number[];
|
protected _vertexArr: TypedArray | number[];
|
||||||
protected _texCoordArr: TypedArray;
|
protected _texCoordArr: TypedArray;
|
||||||
@ -59,6 +61,7 @@ class RayHandler {
|
|||||||
protected _thicknessArr: TypedArray | number[];
|
protected _thicknessArr: TypedArray | number[];
|
||||||
protected _rgbaArr: TypedArray | number[];
|
protected _rgbaArr: TypedArray | number[];
|
||||||
protected _pickingColorArr: TypedArray | number[];
|
protected _pickingColorArr: TypedArray | number[];
|
||||||
|
protected _texOffsetArr: TypedArray;
|
||||||
|
|
||||||
protected _buffersUpdateCallbacks: Function[];
|
protected _buffersUpdateCallbacks: Function[];
|
||||||
protected _changedBuffers: boolean[];
|
protected _changedBuffers: boolean[];
|
||||||
@ -89,6 +92,7 @@ class RayHandler {
|
|||||||
this._thicknessBuffer = null;
|
this._thicknessBuffer = null;
|
||||||
this._rgbaBuffer = null;
|
this._rgbaBuffer = null;
|
||||||
this._pickingColorBuffer = null;
|
this._pickingColorBuffer = null;
|
||||||
|
this._texOffsetBuffer = null;
|
||||||
|
|
||||||
this._vertexArr = [];
|
this._vertexArr = [];
|
||||||
this._texCoordArr = new Float32Array([]);
|
this._texCoordArr = new Float32Array([]);
|
||||||
@ -99,6 +103,7 @@ class RayHandler {
|
|||||||
this._thicknessArr = [];
|
this._thicknessArr = [];
|
||||||
this._rgbaArr = [];
|
this._rgbaArr = [];
|
||||||
this._pickingColorArr = [];
|
this._pickingColorArr = [];
|
||||||
|
this._texOffsetArr = new Float32Array([]);
|
||||||
|
|
||||||
this._buffersUpdateCallbacks = [];
|
this._buffersUpdateCallbacks = [];
|
||||||
this._buffersUpdateCallbacks[VERTEX_BUFFER] = this.createVertexBuffer;
|
this._buffersUpdateCallbacks[VERTEX_BUFFER] = this.createVertexBuffer;
|
||||||
@ -108,6 +113,7 @@ class RayHandler {
|
|||||||
this._buffersUpdateCallbacks[RGBA_BUFFER] = this.createRgbaBuffer;
|
this._buffersUpdateCallbacks[RGBA_BUFFER] = this.createRgbaBuffer;
|
||||||
this._buffersUpdateCallbacks[PICKINGCOLOR_BUFFER] = this.createPickingColorBuffer;
|
this._buffersUpdateCallbacks[PICKINGCOLOR_BUFFER] = this.createPickingColorBuffer;
|
||||||
this._buffersUpdateCallbacks[TEXCOORD_BUFFER] = this.createTexCoordBuffer;
|
this._buffersUpdateCallbacks[TEXCOORD_BUFFER] = this.createTexCoordBuffer;
|
||||||
|
this._buffersUpdateCallbacks[TEXOFFSET_BUFFER] = this.createTexOffsetBuffer;
|
||||||
|
|
||||||
this._changedBuffers = new Array(this._buffersUpdateCallbacks.length);
|
this._changedBuffers = new Array(this._buffersUpdateCallbacks.length);
|
||||||
}
|
}
|
||||||
@ -175,6 +181,8 @@ class RayHandler {
|
|||||||
this._thicknessArr = null;
|
this._thicknessArr = null;
|
||||||
//@ts-ignore
|
//@ts-ignore
|
||||||
this._rgbaArr = null;
|
this._rgbaArr = null;
|
||||||
|
//@ts-ignore
|
||||||
|
this._texOffsetArr = null;
|
||||||
|
|
||||||
this._vertexArr = new Float32Array([]);
|
this._vertexArr = new Float32Array([]);
|
||||||
this._texCoordArr = new Float32Array([]);
|
this._texCoordArr = new Float32Array([]);
|
||||||
@ -184,6 +192,7 @@ class RayHandler {
|
|||||||
this._endPositionLowArr = new Float32Array([]);
|
this._endPositionLowArr = new Float32Array([]);
|
||||||
this._thicknessArr = new Float32Array([]);
|
this._thicknessArr = new Float32Array([]);
|
||||||
this._rgbaArr = new Float32Array([]);
|
this._rgbaArr = new Float32Array([]);
|
||||||
|
this._texOffsetArr = new Float32Array([]);
|
||||||
|
|
||||||
this._removeRays();
|
this._removeRays();
|
||||||
this._deleteBuffers();
|
this._deleteBuffers();
|
||||||
@ -203,6 +212,7 @@ class RayHandler {
|
|||||||
gl.deleteBuffer(this._rgbaBuffer!);
|
gl.deleteBuffer(this._rgbaBuffer!);
|
||||||
gl.deleteBuffer(this._vertexBuffer!);
|
gl.deleteBuffer(this._vertexBuffer!);
|
||||||
gl.deleteBuffer(this._texCoordBuffer!);
|
gl.deleteBuffer(this._texCoordBuffer!);
|
||||||
|
gl.deleteBuffer(this._texOffsetBuffer!);
|
||||||
}
|
}
|
||||||
|
|
||||||
this._startPositionHighBuffer = null;
|
this._startPositionHighBuffer = null;
|
||||||
@ -213,6 +223,7 @@ class RayHandler {
|
|||||||
this._rgbaBuffer = null;
|
this._rgbaBuffer = null;
|
||||||
this._vertexBuffer = null;
|
this._vertexBuffer = null;
|
||||||
this._texCoordBuffer = null;
|
this._texCoordBuffer = null;
|
||||||
|
this._texOffsetBuffer = null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -251,6 +262,8 @@ class RayHandler {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
this._texOffsetArr = concatTypedArrays(this._texOffsetArr, [0, 0, 0, 0, 0, 0]);
|
||||||
|
|
||||||
this._texCoordArr = concatTypedArrays(this._texCoordArr, [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]);
|
this._texCoordArr = concatTypedArrays(this._texCoordArr, [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]);
|
||||||
|
|
||||||
let x = ray._startPositionHigh.x,
|
let x = ray._startPositionHigh.x,
|
||||||
@ -347,9 +360,12 @@ class RayHandler {
|
|||||||
gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer!);
|
gl.bindBuffer(gl.ARRAY_BUFFER, this._vertexBuffer!);
|
||||||
gl.vertexAttribPointer(sha.a_vertices, this._vertexBuffer!.itemSize, gl.FLOAT, false, 0, 0);
|
gl.vertexAttribPointer(sha.a_vertices, this._vertexBuffer!.itemSize, gl.FLOAT, false, 0, 0);
|
||||||
|
|
||||||
gl.bindBuffer(gl.ARRAY_BUFFER, this._texCoordBuffer as WebGLBuffer);
|
gl.bindBuffer(gl.ARRAY_BUFFER, this._texCoordBuffer!);
|
||||||
gl.vertexAttribPointer(sha.a_texCoord, this._texCoordBuffer!.itemSize, gl.FLOAT, false, 0, 0);
|
gl.vertexAttribPointer(sha.a_texCoord, this._texCoordBuffer!.itemSize, gl.FLOAT, false, 0, 0);
|
||||||
|
|
||||||
|
gl.bindBuffer(gl.ARRAY_BUFFER, this._texOffsetBuffer!);
|
||||||
|
gl.vertexAttribPointer(sha.a_texOffset, this._texOffsetBuffer!.itemSize, gl.FLOAT, false, 0, 0);
|
||||||
|
|
||||||
gl.drawArrays(gl.TRIANGLES, 0, this._vertexBuffer!.numItems);
|
gl.drawArrays(gl.TRIANGLES, 0, this._vertexBuffer!.numItems);
|
||||||
|
|
||||||
gl.enable(gl.CULL_FACE);
|
gl.enable(gl.CULL_FACE);
|
||||||
@ -387,6 +403,7 @@ class RayHandler {
|
|||||||
|
|
||||||
let i = ri * 24;
|
let i = ri * 24;
|
||||||
this._rgbaArr = spliceArray(this._rgbaArr, i, 24);
|
this._rgbaArr = spliceArray(this._rgbaArr, i, 24);
|
||||||
|
this._texCoordArr = spliceTypedArray(this._texCoordArr, i, 24);
|
||||||
|
|
||||||
i = ri * 18;
|
i = ri * 18;
|
||||||
this._startPositionHighArr = spliceArray(this._startPositionHighArr, i, 18);
|
this._startPositionHighArr = spliceArray(this._startPositionHighArr, i, 18);
|
||||||
@ -400,6 +417,7 @@ class RayHandler {
|
|||||||
|
|
||||||
i = ri * 6;
|
i = ri * 6;
|
||||||
this._thicknessArr = spliceArray(this._thicknessArr, i, 6);
|
this._thicknessArr = spliceArray(this._thicknessArr, i, 6);
|
||||||
|
this._texOffsetArr = spliceTypedArray(this._texOffsetArr, i, 6);
|
||||||
|
|
||||||
this.reindexRaysArray(ri);
|
this.reindexRaysArray(ri);
|
||||||
this.refresh();
|
this.refresh();
|
||||||
@ -746,10 +764,15 @@ class RayHandler {
|
|||||||
|
|
||||||
public createTexCoordBuffer() {
|
public createTexCoordBuffer() {
|
||||||
let h = this._renderer!.handler;
|
let h = this._renderer!.handler;
|
||||||
h.gl!.deleteBuffer(this._texCoordBuffer as WebGLBuffer);
|
h.gl!.deleteBuffer(this._texCoordBuffer!);
|
||||||
this._texCoordBuffer = h.createArrayBuffer(this._texCoordArr, 4, this._texCoordArr.length / 4);
|
this._texCoordBuffer = h.createArrayBuffer(this._texCoordArr, 4, this._texCoordArr.length / 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public createTexOffsetBuffer() {
|
||||||
|
let h = this._renderer!.handler;
|
||||||
|
h.gl!.deleteBuffer(this._texOffsetBuffer!);
|
||||||
|
this._texOffsetBuffer = h.createArrayBuffer(this._texOffsetArr, 1, this._texOffsetArr.length);
|
||||||
|
}
|
||||||
|
|
||||||
public createPickingColorBuffer() {
|
public createPickingColorBuffer() {
|
||||||
let h = this._renderer!.handler;
|
let h = this._renderer!.handler;
|
||||||
@ -799,6 +822,21 @@ class RayHandler {
|
|||||||
this._changedBuffers[TEXCOORD_BUFFER] = true;
|
this._changedBuffers[TEXCOORD_BUFFER] = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public setTexOffsetArr(index: number, value: number) {
|
||||||
|
let i = index * 6;
|
||||||
|
let a = this._texOffsetArr;
|
||||||
|
|
||||||
|
a[i] = value;
|
||||||
|
a[i + 1] = value;
|
||||||
|
a[i + 2] = value;
|
||||||
|
a[i + 3] = value;
|
||||||
|
a[i + 4] = value;
|
||||||
|
a[i + 5] = value;
|
||||||
|
|
||||||
|
this._changedBuffers[TEXOFFSET_BUFFER] = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
public refreshTexCoordsArr() {
|
public refreshTexCoordsArr() {
|
||||||
let bc = this._entityCollection;
|
let bc = this._entityCollection;
|
||||||
if (bc && this._renderer) {
|
if (bc && this._renderer) {
|
||||||
|
|||||||
@ -4,11 +4,11 @@ uniform sampler2D texAtlas;
|
|||||||
|
|
||||||
varying vec4 v_rgba;
|
varying vec4 v_rgba;
|
||||||
varying vec4 v_texCoord;
|
varying vec4 v_texCoord;
|
||||||
|
varying float v_texOffset;
|
||||||
|
|
||||||
void main() {
|
void main() {
|
||||||
|
|
||||||
float repeat = 10.0;
|
float repeat = 10.0;
|
||||||
float offset = 0.0;
|
|
||||||
|
|
||||||
vec2 uv = v_texCoord.xy;
|
vec2 uv = v_texCoord.xy;
|
||||||
float min = v_texCoord.z;
|
float min = v_texCoord.z;
|
||||||
@ -16,7 +16,7 @@ void main() {
|
|||||||
|
|
||||||
float EPS = 0.5 / 1024.0; //Atlas height
|
float EPS = 0.5 / 1024.0; //Atlas height
|
||||||
|
|
||||||
float localY = fract((uv.y + offset - min) / height * repeat);
|
float localY = fract((uv.y + v_texOffset - min) / height * repeat);
|
||||||
uv.y = clamp(min + localY * height, min + EPS, min + height - EPS);
|
uv.y = clamp(min + localY * height, min + EPS, min + height - EPS);
|
||||||
|
|
||||||
vec4 color = texture2D(texAtlas, uv);
|
vec4 color = texture2D(texAtlas, uv);
|
||||||
|
|||||||
@ -22,7 +22,8 @@ export function rayScreen(): Program {
|
|||||||
a_endPosHigh: "vec3",
|
a_endPosHigh: "vec3",
|
||||||
a_endPosLow: "vec3",
|
a_endPosLow: "vec3",
|
||||||
a_thickness: "float",
|
a_thickness: "float",
|
||||||
a_rgba: "vec4"
|
a_rgba: "vec4",
|
||||||
|
a_texOffset: "float"
|
||||||
},
|
},
|
||||||
vertexShader: ray_vert,
|
vertexShader: ray_vert,
|
||||||
fragmentShader: ray_frag
|
fragmentShader: ray_frag
|
||||||
|
|||||||
@ -8,9 +8,11 @@ attribute vec3 a_endPosLow;
|
|||||||
attribute vec2 a_vertices;
|
attribute vec2 a_vertices;
|
||||||
attribute float a_thickness;
|
attribute float a_thickness;
|
||||||
attribute vec4 a_texCoord;
|
attribute vec4 a_texCoord;
|
||||||
|
attribute float a_texOffset;
|
||||||
|
|
||||||
varying vec4 v_rgba;
|
varying vec4 v_rgba;
|
||||||
varying vec4 v_texCoord;
|
varying vec4 v_texCoord;
|
||||||
|
varying float v_texOffset;
|
||||||
|
|
||||||
uniform mat4 viewMatrix;
|
uniform mat4 viewMatrix;
|
||||||
uniform mat4 projectionMatrix;
|
uniform mat4 projectionMatrix;
|
||||||
@ -21,6 +23,7 @@ uniform float uOpacity;
|
|||||||
|
|
||||||
void main() {
|
void main() {
|
||||||
|
|
||||||
|
v_texOffset = a_texOffset;
|
||||||
v_rgba = vec4(a_rgba.rgb, a_rgba.a * uOpacity);
|
v_rgba = vec4(a_rgba.rgb, a_rgba.a * uOpacity);
|
||||||
v_texCoord = a_texCoord;
|
v_texCoord = a_texCoord;
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user