mirror of
https://github.com/MapMakersAndProgrammers/Alternativa3D.git
synced 2025-10-26 18:09:14 -07:00
Final refactorings
This commit is contained in:
@@ -302,8 +302,6 @@ package alternativa.engine3d.core {
|
|||||||
*/
|
*/
|
||||||
alternativa3d var culling:int;
|
alternativa3d var culling:int;
|
||||||
|
|
||||||
public var cameras:uint;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @private
|
* @private
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -74,6 +74,8 @@ package alternativa.engine3d.objects {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: Add removeSurface() method
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Adds <code>Surface</code> to <code>Mesh</code> object.
|
* Adds <code>Surface</code> to <code>Mesh</code> object.
|
||||||
* @param material Material of the surface.
|
* @param material Material of the surface.
|
||||||
|
|||||||
@@ -61,6 +61,8 @@ package alternativa.engine3d.shadows {
|
|||||||
*/
|
*/
|
||||||
public var biasMultiplier:Number = 0.99;
|
public var biasMultiplier:Number = 0.99;
|
||||||
|
|
||||||
|
private static const DIFFERENCE_MULTIPLIER:Number = 32768;
|
||||||
|
|
||||||
// TODO: implement property parent
|
// TODO: implement property parent
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -253,6 +255,7 @@ package alternativa.engine3d.shadows {
|
|||||||
override alternativa3d function process(camera:Camera3D):void {
|
override alternativa3d function process(camera:Camera3D):void {
|
||||||
var i:int;
|
var i:int;
|
||||||
var object:Object3D;
|
var object:Object3D;
|
||||||
|
// TODO: realize culling
|
||||||
// Clipping of casters, that have shadows which are invisible.
|
// Clipping of casters, that have shadows which are invisible.
|
||||||
var numActualCasters:int = 0;
|
var numActualCasters:int = 0;
|
||||||
for (i = 0; i < _casters.length; i++) {
|
for (i = 0; i < _casters.length; i++) {
|
||||||
@@ -368,23 +371,21 @@ package alternativa.engine3d.shadows {
|
|||||||
camera.context3D.setRenderToBackBuffer();
|
camera.context3D.setRenderToBackBuffer();
|
||||||
|
|
||||||
if (debug) {
|
if (debug) {
|
||||||
if (numActualCasters > 0) {
|
if (debugPlane == null) {
|
||||||
if (debugPlane == null) {
|
debugPlane = createDebugPlane(debugMaterial, camera.context3D);
|
||||||
debugPlane = createDebugPlane(debugMaterial, camera.context3D);
|
|
||||||
}
|
|
||||||
// Form transformation matrix for debugPlane
|
|
||||||
debugPlane.transform.compose((frustumMinX + frustumMaxX) / 2, (frustumMinY + frustumMaxY) / 2, frustumMinZ, 0, 0, 0, (frustumMaxX - frustumMinX), (frustumMaxY - frustumMinY), 1);
|
|
||||||
debugPlane.localToCameraTransform.combine(_light.localToCameraTransform, debugPlane.transform);
|
|
||||||
|
|
||||||
// Draw
|
|
||||||
var debugSurface:Surface = debugPlane._surfaces[0];
|
|
||||||
debugSurface.material.collectDraws(camera, debugSurface, debugPlane.geometry, emptyLightVector, 0, false, -1);
|
|
||||||
|
|
||||||
// Form transformation matrix for debugPlane
|
|
||||||
debugPlane.transform.compose((frustumMinX + frustumMaxX) / 2, (frustumMinY + frustumMaxY) / 2, frustumMaxZ, 0, 0, 0, (frustumMaxX - frustumMinX), (frustumMaxY - frustumMinY), 1);
|
|
||||||
debugPlane.localToCameraTransform.combine(_light.localToCameraTransform, debugPlane.transform);
|
|
||||||
debugSurface.material.collectDraws(camera, debugSurface, debugPlane.geometry, emptyLightVector, 0, false, -1);
|
|
||||||
}
|
}
|
||||||
|
// Form transformation matrix for debugPlane
|
||||||
|
debugPlane.transform.compose((frustumMinX + frustumMaxX) / 2, (frustumMinY + frustumMaxY) / 2, frustumMinZ, 0, 0, 0, (frustumMaxX - frustumMinX), (frustumMaxY - frustumMinY), 1);
|
||||||
|
debugPlane.localToCameraTransform.combine(_light.localToCameraTransform, debugPlane.transform);
|
||||||
|
|
||||||
|
// Draw
|
||||||
|
var debugSurface:Surface = debugPlane._surfaces[0];
|
||||||
|
debugSurface.material.collectDraws(camera, debugSurface, debugPlane.geometry, emptyLightVector, 0, false, -1);
|
||||||
|
|
||||||
|
// Form transformation matrix for debugPlane
|
||||||
|
debugPlane.transform.compose((frustumMinX + frustumMaxX) / 2, (frustumMinY + frustumMaxY) / 2, frustumMaxZ, 0, 0, 0, (frustumMaxX - frustumMinX), (frustumMaxY - frustumMinY), 1);
|
||||||
|
debugPlane.localToCameraTransform.combine(_light.localToCameraTransform, debugPlane.transform);
|
||||||
|
debugSurface.material.collectDraws(camera, debugSurface, debugPlane.geometry, emptyLightVector, 0, false, -1);
|
||||||
|
|
||||||
tempBounds.minX = frustumMinX;
|
tempBounds.minX = frustumMinX;
|
||||||
tempBounds.maxX = frustumMaxX;
|
tempBounds.maxX = frustumMaxX;
|
||||||
@@ -717,16 +718,15 @@ package alternativa.engine3d.shadows {
|
|||||||
drawUnit.setVertexConstantsFromTransform(vertexLinker.getVariableIndex("cUVProjection"), objectToShadowMapTransform);
|
drawUnit.setVertexConstantsFromTransform(vertexLinker.getVariableIndex("cUVProjection"), objectToShadowMapTransform);
|
||||||
// Устанавливаем шедоумапу
|
// Устанавливаем шедоумапу
|
||||||
drawUnit.setTextureAt(fragmentLinker.getVariableIndex("sShadowMap"), shadowMap);
|
drawUnit.setTextureAt(fragmentLinker.getVariableIndex("sShadowMap"), shadowMap);
|
||||||
// TODO: сделать множитель более корректный. Возможно 65536 (разрешающая способность глубины буфера).
|
|
||||||
// Устанавливаем коеффициенты
|
// Устанавливаем коеффициенты
|
||||||
drawUnit.setFragmentConstantsFromNumbers(fragmentLinker.getVariableIndex("cConstants"), -255*10000, -10000, biasMultiplier*255*10000, 1/16);
|
drawUnit.setFragmentConstantsFromNumbers(fragmentLinker.getVariableIndex("cConstants"), -255*DIFFERENCE_MULTIPLIER, -DIFFERENCE_MULTIPLIER, biasMultiplier*255*DIFFERENCE_MULTIPLIER, 1/16);
|
||||||
if (_pcfOffset > 0) {
|
if (_pcfOffset > 0) {
|
||||||
var offset1:Number = _pcfOffset/_mapSize;
|
var offset1:Number = _pcfOffset/_mapSize;
|
||||||
var offset2:Number = offset1/3;
|
var offset2:Number = offset1/3;
|
||||||
|
|
||||||
drawUnit.setFragmentConstantsFromNumbers(fragmentLinker.getVariableIndex("cPCFOffsets"), -offset1, -offset2, offset2, offset1);
|
drawUnit.setFragmentConstantsFromNumbers(fragmentLinker.getVariableIndex("cPCFOffsets"), -offset1, -offset2, offset2, offset1);
|
||||||
}
|
}
|
||||||
drawUnit.setFragmentConstantsFromNumbers(fragmentLinker.getVariableIndex("cDist"), 0.9999, 10000, 1);
|
drawUnit.setFragmentConstantsFromNumbers(fragmentLinker.getVariableIndex("cDist"), 0.9999, DIFFERENCE_MULTIPLIER, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static function getVShader():Procedure {
|
private static function getVShader():Procedure {
|
||||||
|
|||||||
@@ -46,6 +46,7 @@ package alternativa.engine3d.shadows {
|
|||||||
* Degree of correcting offset of shadow map space. It need for getting rid of self-shadowing artifacts.
|
* Degree of correcting offset of shadow map space. It need for getting rid of self-shadowing artifacts.
|
||||||
*/
|
*/
|
||||||
public var biasMultiplier:Number = 0.99;
|
public var biasMultiplier:Number = 0.99;
|
||||||
|
private static const DIFFERENCE_MULTIPLIER:Number = 32768;
|
||||||
|
|
||||||
private var renderer:Renderer = new Renderer();
|
private var renderer:Renderer = new Renderer();
|
||||||
|
|
||||||
@@ -104,9 +105,7 @@ package alternativa.engine3d.shadows {
|
|||||||
debugMaterial.alpha = 0.3;
|
debugMaterial.alpha = 0.3;
|
||||||
|
|
||||||
for (var i:int = 0; i < 6; i++) {
|
for (var i:int = 0; i < 6; i++) {
|
||||||
// Create cameras
|
var cam:Camera3D = new Camera3D(radius/1000, radius);
|
||||||
// TODO: recalculate nearClipping
|
|
||||||
var cam:Camera3D = new Camera3D(10, radius);
|
|
||||||
cam.fov = 1.910633237;
|
cam.fov = 1.910633237;
|
||||||
cameras[i] = cam;
|
cameras[i] = cam;
|
||||||
}
|
}
|
||||||
@@ -154,14 +153,14 @@ package alternativa.engine3d.shadows {
|
|||||||
geometry.addVertexStream(attributes);
|
geometry.addVertexStream(attributes);
|
||||||
|
|
||||||
geometry.setAttributeValues(VertexAttributes.POSITION, Vector.<Number>([
|
geometry.setAttributeValues(VertexAttributes.POSITION, Vector.<Number>([
|
||||||
-0.5, -0.5, -0.5,
|
-1, -1, -1,
|
||||||
0.5, -0.5, -0.5,
|
1, -1, -1,
|
||||||
0.5, 0.5, -0.5,
|
1, 1, -1,
|
||||||
-0.5, 0.5, -0.5,
|
-1, 1, -1,
|
||||||
-0.5, -0.5, 0.5,
|
-1, -1, 1,
|
||||||
0.5, -0.5, 0.5,
|
1, -1, 1,
|
||||||
0.5, 0.5, 0.5,
|
1, 1, 1,
|
||||||
-0.5, 0.5, 0.5]));
|
-1, 1, 1]));
|
||||||
geometry.indices = Vector.<uint>([
|
geometry.indices = Vector.<uint>([
|
||||||
0, 1, 2, 3, 0, 2, 2, 1, 0, 3, 2, 0,
|
0, 1, 2, 3, 0, 2, 2, 1, 0, 3, 2, 0,
|
||||||
2, 6, 1, 1, 6, 2, 1, 6, 5, 5, 6, 1,
|
2, 6, 1, 1, 6, 2, 1, 6, 5, 5, 6, 1,
|
||||||
@@ -171,7 +170,18 @@ package alternativa.engine3d.shadows {
|
|||||||
0, 5, 1, 1, 5, 0, 0, 4, 5, 5, 4, 0]);
|
0, 5, 1, 1, 5, 0, 0, 4, 5, 5, 4, 0]);
|
||||||
mesh.addSurface(material, 0, 24);
|
mesh.addSurface(material, 0, 24);
|
||||||
} else {
|
} else {
|
||||||
mesh = new GeoSphere(1, 4, false);
|
mesh = new GeoSphere(1, 4, true);
|
||||||
|
// Create two side
|
||||||
|
var triangles:Vector.<uint> = mesh.geometry.indices;
|
||||||
|
var numTriangles:int = triangles.length;
|
||||||
|
for (var i:int = 0; i < numTriangles; i += 3) {
|
||||||
|
var a:uint = triangles[i];
|
||||||
|
var b:uint = triangles[int(i + 1)];
|
||||||
|
var c:uint = triangles[int(i + 2)];
|
||||||
|
triangles.push(c, b, a);
|
||||||
|
}
|
||||||
|
mesh.geometry.indices = triangles;
|
||||||
|
mesh.getSurface(0).numTriangles = triangles.length/3;
|
||||||
mesh.setMaterialToAllSurfaces(material);
|
mesh.setMaterialToAllSurfaces(material);
|
||||||
}
|
}
|
||||||
mesh.geometry.upload(context);
|
mesh.geometry.upload(context);
|
||||||
@@ -203,8 +213,9 @@ package alternativa.engine3d.shadows {
|
|||||||
radius = OmniLight(_light).attenuationEnd;
|
radius = OmniLight(_light).attenuationEnd;
|
||||||
for (i = 0; i < 6; i++) {
|
for (i = 0; i < 6; i++) {
|
||||||
var cam:Camera3D = cameras[i];
|
var cam:Camera3D = cameras[i];
|
||||||
|
cam.nearClipping = radius/1000;
|
||||||
cam.farClipping = radius;
|
cam.farClipping = radius;
|
||||||
cam.calculateProjection(radius, radius);
|
cam.calculateProjection(1, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
var castersCount:int = _casters.length;
|
var castersCount:int = _casters.length;
|
||||||
@@ -220,12 +231,13 @@ package alternativa.engine3d.shadows {
|
|||||||
parent = parent._parent;
|
parent = parent._parent;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: remove Object3D.cameras, use something another
|
|
||||||
if (visible) {
|
if (visible) {
|
||||||
// calculate transform matrices
|
// calculate transform matrices
|
||||||
_light.lightToObjectTransform.combine(caster.cameraToLocalTransform, _light.localToCameraTransform);
|
_light.lightToObjectTransform.combine(caster.cameraToLocalTransform, _light.localToCameraTransform);
|
||||||
caster.localToLightTransform.combine(_light.cameraToLocalTransform, caster.localToCameraTransform);
|
caster.localToLightTransform.combine(_light.cameraToLocalTransform, caster.localToCameraTransform);
|
||||||
|
|
||||||
|
// Pack camera culling
|
||||||
|
caster.culling <<= 16;
|
||||||
// collect actualCasters for light
|
// collect actualCasters for light
|
||||||
if (caster.boundBox == null || OmniLight(_light).checkBound(caster)){
|
if (caster.boundBox == null || OmniLight(_light).checkBound(caster)){
|
||||||
actualCasters[actualCastersCount] = caster;
|
actualCasters[actualCastersCount] = caster;
|
||||||
@@ -235,10 +247,10 @@ package alternativa.engine3d.shadows {
|
|||||||
// 1 - calculate planes in object space
|
// 1 - calculate planes in object space
|
||||||
calculatePlanes(_light.lightToObjectTransform);
|
calculatePlanes(_light.lightToObjectTransform);
|
||||||
// 2 - check object location cameras (sections)
|
// 2 - check object location cameras (sections)
|
||||||
caster.cameras = recognizeObjectCameras(caster.boundBox);
|
caster.culling |= recognizeObjectCameras(caster.boundBox);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
caster.cameras = 63;
|
caster.culling |= 63;
|
||||||
}
|
}
|
||||||
|
|
||||||
// update Skin Joints matrices
|
// update Skin Joints matrices
|
||||||
@@ -277,7 +289,7 @@ package alternativa.engine3d.shadows {
|
|||||||
caster = actualCasters[j];
|
caster = actualCasters[j];
|
||||||
|
|
||||||
// Проверить находится ли кастер в зоне 4-х плоскостей
|
// Проверить находится ли кастер в зоне 4-х плоскостей
|
||||||
if ((caster.cameras & edgeBit)) {
|
if ((caster.culling & edgeBit)) {
|
||||||
// собираем матрицу перевода из кастера в пространство edgeCamera
|
// собираем матрицу перевода из кастера в пространство edgeCamera
|
||||||
casterToEdgedCameraTransform.combine(edgeCamera.inverseTransform, caster.localToLightTransform);
|
casterToEdgedCameraTransform.combine(edgeCamera.inverseTransform, caster.localToLightTransform);
|
||||||
// Собираем драуколлы для кастера и его дочерних объектов
|
// Собираем драуколлы для кастера и его дочерних объектов
|
||||||
@@ -285,6 +297,7 @@ package alternativa.engine3d.shadows {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: remove debug culling rendering
|
||||||
// if (renderer.drawUnits.length == 0) context.clear(0, 0, 0, 0.0);
|
// if (renderer.drawUnits.length == 0) context.clear(0, 0, 0, 0.0);
|
||||||
|
|
||||||
// Отрисовка дроуколов
|
// Отрисовка дроуколов
|
||||||
@@ -304,41 +317,31 @@ package alternativa.engine3d.shadows {
|
|||||||
}
|
}
|
||||||
context.setRenderToBackBuffer();
|
context.setRenderToBackBuffer();
|
||||||
|
|
||||||
// // Пробегаемся по кастерам
|
// Unpack camera culling value
|
||||||
// for (j = 0; j < actualCastersCount; j++) {
|
for (j = 0; j < actualCastersCount; j++) {
|
||||||
// caster = actualCasters[j];
|
caster = actualCasters[j];
|
||||||
// caster.culling &= 0x8000003F;
|
// If there was -1, after shift it will be -1 too
|
||||||
//
|
caster.culling >>= 16;
|
||||||
// // Проверить находится ли кастер в зоне 4-х плоскостей
|
}
|
||||||
// if (caster.culling & (edgeBit << 8)) {
|
|
||||||
// // собираем матрицу перевода из кастера в пространство edgeCamera
|
|
||||||
// casterToEdgedCameraTransform.combine(edgeCamera.inverseTransform, caster.localToLightTransform);
|
|
||||||
// // Собираем драуколлы для кастера и его дочерних объектов
|
|
||||||
// collectDraws(context, caster, edgeCamera);
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
if (debug) {
|
if (debug) {
|
||||||
if (actualCastersCount > 0) {
|
// Create debug object if needed
|
||||||
// TODO: draw debug mesh always (DirectionalLightShadow)
|
if (debugObject == null) {
|
||||||
|
debugObject = createDebugObject(debugMaterial, camera.context3D);
|
||||||
// Create debug object if needed
|
// TODO: select right radius
|
||||||
if (debugObject == null) {
|
|
||||||
debugObject = createDebugObject(debugMaterial, camera.context3D);
|
|
||||||
// TODO: select right radius
|
|
||||||
// debugObject.scaleX = debugObject.scaleY = debugObject.scaleZ = radius/12;
|
|
||||||
debugObject.scaleX = debugObject.scaleY = debugObject.scaleZ = radius;
|
|
||||||
debugObject.composeTransforms();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Формируем матрицу трансформации для debugObject
|
|
||||||
debugObject.localToCameraTransform.combine(_light.localToCameraTransform, debugObject.transform);
|
|
||||||
|
|
||||||
// Отрисовываем
|
|
||||||
var debugSurface:Surface = debugObject._surfaces[0];
|
|
||||||
debugMaterial.collectDraws(camera, debugSurface, debugObject.geometry, null, 0, false, -1);
|
|
||||||
}
|
}
|
||||||
|
// debugObject.scaleX = debugObject.scaleY = debugObject.scaleZ = radius/12;
|
||||||
|
debugObject.scaleX = debugObject.scaleY = debugObject.scaleZ = radius;
|
||||||
|
debugObject.composeTransforms();
|
||||||
|
|
||||||
|
// Формируем матрицу трансформации для debugObject
|
||||||
|
debugObject.localToCameraTransform.combine(_light.localToCameraTransform, debugObject.transform);
|
||||||
|
|
||||||
|
// Отрисовываем
|
||||||
|
var debugSurface:Surface = debugObject._surfaces[0];
|
||||||
|
debugMaterial.collectDraws(camera, debugSurface, debugObject.geometry, null, 0, false, -1);
|
||||||
}
|
}
|
||||||
|
actualCasters.length = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
private var sections:SectionPlane;
|
private var sections:SectionPlane;
|
||||||
@@ -353,10 +356,10 @@ package alternativa.engine3d.shadows {
|
|||||||
var planeRB:SectionPlane = sections.next.next.next.next.next;
|
var planeRB:SectionPlane = sections.next.next.next.next.next;
|
||||||
|
|
||||||
// TODO: reuse points
|
// TODO: reuse points
|
||||||
var ax:Number = transform.c - transform.a + transform.b;
|
var ax:Number = transform.c - transform.a + transform.b; // E
|
||||||
var ay:Number = transform.g - transform.e + transform.f;
|
var ay:Number = transform.g - transform.e + transform.f;
|
||||||
var az:Number = transform.k - transform.i + transform.j;
|
var az:Number = transform.k - transform.i + transform.j;
|
||||||
var bx:Number = transform.c - transform.a - transform.b;
|
var bx:Number = transform.c - transform.a - transform.b; // H
|
||||||
var by:Number = transform.g - transform.e - transform.f;
|
var by:Number = transform.g - transform.e - transform.f;
|
||||||
var bz:Number = transform.k - transform.i - transform.j;
|
var bz:Number = transform.k - transform.i - transform.j;
|
||||||
planeRU.x = bz * ay - by * az;
|
planeRU.x = bz * ay - by * az;
|
||||||
@@ -364,10 +367,10 @@ package alternativa.engine3d.shadows {
|
|||||||
planeRU.z = by * ax - bx * ay;
|
planeRU.z = by * ax - bx * ay;
|
||||||
planeRU.offset = transform.d*planeRU.x + transform.h*planeRU.y + transform.l*planeRU.z;
|
planeRU.offset = transform.d*planeRU.x + transform.h*planeRU.y + transform.l*planeRU.z;
|
||||||
|
|
||||||
ax = transform.c + transform.a - transform.b;
|
ax = transform.c + transform.a - transform.b; // D
|
||||||
ay = transform.g + transform.e - transform.f;
|
ay = transform.g + transform.e - transform.f;
|
||||||
az = transform.k + transform.i - transform.j;
|
az = transform.k + transform.i - transform.j;
|
||||||
bx = transform.c + transform.a + transform.b;
|
bx = transform.c + transform.a + transform.b; // A
|
||||||
by = transform.g + transform.e + transform.f;
|
by = transform.g + transform.e + transform.f;
|
||||||
bz = transform.k + transform.i + transform.j;
|
bz = transform.k + transform.i + transform.j;
|
||||||
planeLU.x = bz * ay - by * az;
|
planeLU.x = bz * ay - by * az;
|
||||||
@@ -375,10 +378,10 @@ package alternativa.engine3d.shadows {
|
|||||||
planeLU.z = by * ax - bx * ay;
|
planeLU.z = by * ax - bx * ay;
|
||||||
planeLU.offset = transform.d*planeLU.x + transform.h*planeLU.y + transform.l*planeLU.z;
|
planeLU.offset = transform.d*planeLU.x + transform.h*planeLU.y + transform.l*planeLU.z;
|
||||||
|
|
||||||
ax = transform.c - transform.a - transform.b;
|
ax = transform.c - transform.a - transform.b; // H
|
||||||
ay = transform.g - transform.e - transform.f;
|
ay = transform.g - transform.e - transform.f;
|
||||||
az = transform.k - transform.i - transform.j;
|
az = transform.k - transform.i - transform.j;
|
||||||
bx = transform.c + transform.a - transform.b;
|
bx = transform.c + transform.a - transform.b; // D
|
||||||
by = transform.g + transform.e - transform.f;
|
by = transform.g + transform.e - transform.f;
|
||||||
bz = transform.k + transform.i - transform.j;
|
bz = transform.k + transform.i - transform.j;
|
||||||
planeFU.x = bz * ay - by * az;
|
planeFU.x = bz * ay - by * az;
|
||||||
@@ -386,10 +389,10 @@ package alternativa.engine3d.shadows {
|
|||||||
planeFU.z = by * ax - bx * ay;
|
planeFU.z = by * ax - bx * ay;
|
||||||
planeFU.offset = transform.d*planeFU.x + transform.h*planeFU.y + transform.l*planeFU.z;
|
planeFU.offset = transform.d*planeFU.x + transform.h*planeFU.y + transform.l*planeFU.z;
|
||||||
|
|
||||||
ax = transform.c + transform.a + transform.b;
|
ax = transform.c + transform.a + transform.b; // A
|
||||||
ay = transform.g + transform.e + transform.f;
|
ay = transform.g + transform.e + transform.f;
|
||||||
az = transform.k + transform.i + transform.j;
|
az = transform.k + transform.i + transform.j;
|
||||||
bx = transform.c - transform.a + transform.b;
|
bx = transform.c - transform.a + transform.b; // E
|
||||||
by = transform.g - transform.e + transform.f;
|
by = transform.g - transform.e + transform.f;
|
||||||
bz = transform.k - transform.i + transform.j;
|
bz = transform.k - transform.i + transform.j;
|
||||||
planeBU.x = bz * ay - by * az;
|
planeBU.x = bz * ay - by * az;
|
||||||
@@ -397,10 +400,10 @@ package alternativa.engine3d.shadows {
|
|||||||
planeBU.z = by * ax - bx * ay;
|
planeBU.z = by * ax - bx * ay;
|
||||||
planeBU.offset = transform.d*planeBU.x + transform.h*planeBU.y + transform.l*planeBU.z;
|
planeBU.offset = transform.d*planeBU.x + transform.h*planeBU.y + transform.l*planeBU.z;
|
||||||
|
|
||||||
ax = transform.a - transform.b + transform.c;
|
ax = transform.a - transform.b + transform.c; // D
|
||||||
ay = transform.e - transform.f + transform.g;
|
ay = transform.e - transform.f + transform.g;
|
||||||
az = transform.i - transform.j + transform.k;
|
az = transform.i - transform.j + transform.k;
|
||||||
bx = transform.a - transform.b - transform.c;
|
bx = transform.a - transform.b - transform.c; // C
|
||||||
by = transform.e - transform.f - transform.g;
|
by = transform.e - transform.f - transform.g;
|
||||||
bz = transform.i - transform.j - transform.k;
|
bz = transform.i - transform.j - transform.k;
|
||||||
planeRF.x = bz * ay - by * az;
|
planeRF.x = bz * ay - by * az;
|
||||||
@@ -408,10 +411,10 @@ package alternativa.engine3d.shadows {
|
|||||||
planeRF.z = by * ax - bx * ay;
|
planeRF.z = by * ax - bx * ay;
|
||||||
planeRF.offset = transform.d*planeRF.x + transform.h*planeRF.y + transform.l*planeRF.z;
|
planeRF.offset = transform.d*planeRF.x + transform.h*planeRF.y + transform.l*planeRF.z;
|
||||||
|
|
||||||
ax = transform.a + transform.b - transform.c;
|
ax = transform.a + transform.b - transform.c; // B
|
||||||
ay = transform.e + transform.f - transform.g;
|
ay = transform.e + transform.f - transform.g;
|
||||||
az = transform.i + transform.j - transform.k;
|
az = transform.i + transform.j - transform.k;
|
||||||
bx = transform.a + transform.b + transform.c;
|
bx = transform.a + transform.b + transform.c; // A
|
||||||
by = transform.e + transform.f + transform.g;
|
by = transform.e + transform.f + transform.g;
|
||||||
bz = transform.i + transform.j + transform.k;
|
bz = transform.i + transform.j + transform.k;
|
||||||
planeRB.x = bz * ay - by * az;
|
planeRB.x = bz * ay - by * az;
|
||||||
@@ -457,7 +460,7 @@ package alternativa.engine3d.shadows {
|
|||||||
if (bb.minX*plane.x + bb.minY*plane.y + bb.minZ*plane.z >= plane.offset) result = plane.frontCameras;
|
if (bb.minX*plane.x + bb.minY*plane.y + bb.minZ*plane.z >= plane.offset) result = plane.frontCameras;
|
||||||
if (bb.maxX*plane.x + bb.maxY*plane.y + bb.maxZ*plane.z < plane.offset) result |= plane.backCameras;
|
if (bb.maxX*plane.x + bb.maxY*plane.y + bb.maxZ*plane.z < plane.offset) result |= plane.backCameras;
|
||||||
}
|
}
|
||||||
culling &= result | plane.unused;
|
culling &= result | plane.unusedBits;
|
||||||
}
|
}
|
||||||
return culling;
|
return culling;
|
||||||
}
|
}
|
||||||
@@ -469,6 +472,8 @@ package alternativa.engine3d.shadows {
|
|||||||
_light.lightToObjectTransform.combine(child.cameraToLocalTransform, _light.localToCameraTransform);
|
_light.lightToObjectTransform.combine(child.cameraToLocalTransform, _light.localToCameraTransform);
|
||||||
child.localToLightTransform.combine(_light.cameraToLocalTransform, child.localToCameraTransform);
|
child.localToLightTransform.combine(_light.cameraToLocalTransform, child.localToCameraTransform);
|
||||||
|
|
||||||
|
// Pack camera culling
|
||||||
|
child.culling <<= 16;
|
||||||
// collect actualCasters for light
|
// collect actualCasters for light
|
||||||
if (child.boundBox == null || OmniLight(_light).checkBound(child)){
|
if (child.boundBox == null || OmniLight(_light).checkBound(child)){
|
||||||
actualCasters[actualCastersCount] = child;
|
actualCasters[actualCastersCount] = child;
|
||||||
@@ -478,10 +483,10 @@ package alternativa.engine3d.shadows {
|
|||||||
// 1 - calculate planes in object space
|
// 1 - calculate planes in object space
|
||||||
calculatePlanes(_light.lightToObjectTransform);
|
calculatePlanes(_light.lightToObjectTransform);
|
||||||
// 2 - check object location cameras (sections)
|
// 2 - check object location cameras (sections)
|
||||||
child.cameras = recognizeObjectCameras(child.boundBox);
|
child.culling |= recognizeObjectCameras(child.boundBox);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
child.cameras = 63;
|
child.culling |= 63;
|
||||||
}
|
}
|
||||||
|
|
||||||
// update Skin Joints matrices
|
// update Skin Joints matrices
|
||||||
@@ -698,17 +703,13 @@ package alternativa.engine3d.shadows {
|
|||||||
drawUnit.setTextureAt(fragmentLinker.getVariableIndex("sCubeMap"), cubeShadowMap);
|
drawUnit.setTextureAt(fragmentLinker.getVariableIndex("sCubeMap"), cubeShadowMap);
|
||||||
|
|
||||||
// Устанавливаем коеффициенты
|
// Устанавливаем коеффициенты
|
||||||
// TODO: сделать множитель более корректный. Возможно 65536 (разрешающая способность глубины буфера).
|
|
||||||
if (_pcfOffset > 0) {
|
if (_pcfOffset > 0) {
|
||||||
var offset:Number = Math.tan(_pcfOffset/180*Math.PI)/3;
|
var offset:Number = Math.tan(_pcfOffset/180*Math.PI)/3;
|
||||||
|
|
||||||
drawUnit.setFragmentConstantsFromNumbers(fragmentLinker.getVariableIndex("cPCFOffsets"), -3/2, 1/16, 0, 0);
|
drawUnit.setFragmentConstantsFromNumbers(fragmentLinker.getVariableIndex("cPCFOffsets"), -3/2, 1/16, 0, 0);
|
||||||
drawUnit.setFragmentConstantsFromNumbers(fragmentLinker.getVariableIndex("cConstants"), -1, 1, 0, offset);
|
drawUnit.setFragmentConstantsFromNumbers(fragmentLinker.getVariableIndex("cConstants"), -1, 1, 0, offset);
|
||||||
drawUnit.setFragmentConstantsFromNumbers(fragmentLinker.getVariableIndex("cDecode"), -10000, -10000/255, biasMultiplier*10000/radius, 10);
|
drawUnit.setFragmentConstantsFromNumbers(fragmentLinker.getVariableIndex("cDecode"), -DIFFERENCE_MULTIPLIER, -DIFFERENCE_MULTIPLIER/255, biasMultiplier*DIFFERENCE_MULTIPLIER/radius, 10);
|
||||||
}
|
} else {
|
||||||
else{
|
drawUnit.setFragmentConstantsFromNumbers(fragmentLinker.getVariableIndex("cConstants"), -DIFFERENCE_MULTIPLIER, -DIFFERENCE_MULTIPLIER/255, biasMultiplier*DIFFERENCE_MULTIPLIER/radius, 1.0);
|
||||||
drawUnit.setFragmentConstantsFromNumbers(fragmentLinker.getVariableIndex("cConstants"), -10000, -10000/255, biasMultiplier*10000/radius, 1.0);
|
|
||||||
// drawUnit.setFragmentConstantsFromNumbers(fragmentLinker.getVariableIndex("cConstants"), -100000, -100000/255, 1/radius, 1);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -930,7 +931,6 @@ import alternativa.engine3d.resources.Geometry;
|
|||||||
import flash.display3D.Context3D;
|
import flash.display3D.Context3D;
|
||||||
import flash.display3D.Context3DBlendFactor;
|
import flash.display3D.Context3DBlendFactor;
|
||||||
import flash.display3D.Context3DProgramType;
|
import flash.display3D.Context3DProgramType;
|
||||||
import flash.display3D.Context3DTriangleFace;
|
|
||||||
import flash.display3D.VertexBuffer3D;
|
import flash.display3D.VertexBuffer3D;
|
||||||
import flash.display3D.textures.CubeTexture;
|
import flash.display3D.textures.CubeTexture;
|
||||||
import flash.utils.Dictionary;
|
import flash.utils.Dictionary;
|
||||||
@@ -985,26 +985,12 @@ class ShadowDebugMaterial extends Material {
|
|||||||
drawUnit.setFragmentConstantsFromNumbers(program.fragmentShader.getVariableIndex("cDecode"), 1, 1/255, 0, alpha);
|
drawUnit.setFragmentConstantsFromNumbers(program.fragmentShader.getVariableIndex("cDecode"), 1, 1/255, 0, alpha);
|
||||||
drawUnit.setTextureAt(program.fragmentShader.getVariableIndex("sCubeMap"), cubeMap);
|
drawUnit.setTextureAt(program.fragmentShader.getVariableIndex("sCubeMap"), cubeMap);
|
||||||
|
|
||||||
// TODO: draw two-sided debug mesh
|
|
||||||
var drawUnit2:DrawUnit = camera.renderer.createDrawUnit(object, program.program, geometry._indexBuffer, surface.indexBegin, surface.numTriangles, program);
|
|
||||||
// Установка стримов
|
|
||||||
drawUnit2.setVertexBufferAt(program.vertexShader.getVariableIndex("aPosition"), positionBuffer, geometry._attributesOffsets[VertexAttributes.POSITION], VertexAttributes.FORMATS[VertexAttributes.POSITION]);
|
|
||||||
// Установка констант
|
|
||||||
drawUnit2.setProjectionConstants(camera, program.vertexShader.getVariableIndex("cProjMatrix"), object.localToCameraTransform);
|
|
||||||
drawUnit2.setFragmentConstantsFromNumbers(program.fragmentShader.getVariableIndex("cDecode"), 1, 1/255, 0, alpha);
|
|
||||||
drawUnit2.setTextureAt(program.fragmentShader.getVariableIndex("sCubeMap"), cubeMap);
|
|
||||||
drawUnit2.culling = Context3DTriangleFace.BACK;
|
|
||||||
|
|
||||||
// Отправка на отрисовку
|
// Отправка на отрисовку
|
||||||
if (alpha < 1) {
|
if (alpha < 1) {
|
||||||
drawUnit.blendSource = Context3DBlendFactor.SOURCE_ALPHA;
|
drawUnit.blendSource = Context3DBlendFactor.SOURCE_ALPHA;
|
||||||
drawUnit.blendDestination = Context3DBlendFactor.ONE_MINUS_SOURCE_ALPHA;
|
drawUnit.blendDestination = Context3DBlendFactor.ONE_MINUS_SOURCE_ALPHA;
|
||||||
drawUnit2.blendSource = Context3DBlendFactor.SOURCE_ALPHA;
|
|
||||||
drawUnit2.blendDestination = Context3DBlendFactor.ONE_MINUS_SOURCE_ALPHA;
|
|
||||||
camera.renderer.addDrawUnit(drawUnit2, objectRenderPriority >= 0 ? objectRenderPriority : Renderer.TRANSPARENT_SORT);
|
|
||||||
camera.renderer.addDrawUnit(drawUnit, objectRenderPriority >= 0 ? objectRenderPriority : Renderer.TRANSPARENT_SORT);
|
camera.renderer.addDrawUnit(drawUnit, objectRenderPriority >= 0 ? objectRenderPriority : Renderer.TRANSPARENT_SORT);
|
||||||
} else {
|
} else {
|
||||||
camera.renderer.addDrawUnit(drawUnit2, objectRenderPriority >= 0 ? objectRenderPriority : Renderer.OPAQUE);
|
|
||||||
camera.renderer.addDrawUnit(drawUnit, objectRenderPriority >= 0 ? objectRenderPriority : Renderer.OPAQUE);
|
camera.renderer.addDrawUnit(drawUnit, objectRenderPriority >= 0 ? objectRenderPriority : Renderer.OPAQUE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1055,12 +1041,12 @@ class SectionPlane {
|
|||||||
|
|
||||||
public var frontCameras:int;
|
public var frontCameras:int;
|
||||||
public var backCameras:int;
|
public var backCameras:int;
|
||||||
public var unused:int = 63;
|
public var unusedBits:int = 63;
|
||||||
|
|
||||||
public function SectionPlane(frontCameras:int, backCameras:int, unused:int) {
|
public function SectionPlane(frontCameras:int, backCameras:int, unused:int) {
|
||||||
this.frontCameras = frontCameras;
|
this.frontCameras = frontCameras;
|
||||||
this.backCameras = backCameras;
|
this.backCameras = backCameras;
|
||||||
this.unused = unused;
|
this.unusedBits = unused;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user