Skip to content

Commit

Permalink
commit missing files.
Browse files Browse the repository at this point in the history
  • Loading branch information
hyzmm committed May 17, 2017
1 parent acf6d6f commit 0d74427
Show file tree
Hide file tree
Showing 47 changed files with 7,956 additions and 0 deletions.
262 changes: 262 additions & 0 deletions bin/as/libs/src/laya/ani/bone/MeshTools.as
Original file line number Diff line number Diff line change
@@ -0,0 +1,262 @@
package laya.ani.bone
{
import laya.ani.bone.canvasmesh.MeshData;
import laya.maths.Point;

/**
* @private
* Mesh数据处理工具
* @author ww
* @version 1.0
*
* @created 2017-4-28 下午2:46:23
*/
public class MeshTools
{

/**
* 查找边界索引
* @param verticles 顶点表
* @param offI 0表示x 1表示y
* @param min 是否是最小值
* @return
*
*/
public static function findEdge(verticles:Array, offI:int=0, min:Boolean=true):int
{
var i:int, len:int;
var tIndex:int;
len = verticles.length;
tIndex = -1;
for (i = 0; i < len; i+=2)
{
if (tIndex < 0 || (min==(verticles[tIndex + offI] < verticles[i + offI])))
{
tIndex = i;
}
}
return tIndex;
}

private static var _bestTriangle:Array = [];

/**
* 从顶点列表中选取一个跨度最大的三角形
* @param verticles 顶点列表
* @return 三角形顶点索引数组
*
*/
public static function findBestTriangle(verticles:Array):Array
{
var topI:int;
topI = findEdge(verticles,1,true);
var bottomI:int;
bottomI = findEdge(verticles,1,false);

var leftI:int;
leftI = findEdge(verticles, 0, true);
var rightI:int;
rightI = findEdge(verticles, 0, false);
var rst:Array;
rst = _bestTriangle;
rst.length = 0;

//another type:
//rst.push(topI, bottomI);
//
//if (rst.indexOf(rightI) < 0) rst.push(rightI);
//if (rst.indexOf(leftI) < 0) rst.push(leftI);

rst.push(leftI, rightI);

if (rst.indexOf(topI) < 0) rst.push(topI);
if (rst.indexOf(bottomI) < 0) rst.push(bottomI);
return rst;
}

private static var _absArr:Array=[];
/**
* 根据mesh的多顶点列表生成四顶点列表
* @param mesh mesh数据
* @param rst
* @return
*
*/
public static function solveMesh(mesh:MeshData,rst:Array=null):Array
{
rst=rst||[];
rst.length=0;
var mUv:Array;
mUv = mesh.uvs;
var mVer:Array;
mVer = mesh.vertices;
var uvAbs:Array;
var indexs:Array;
indexs = findBestTriangle(mUv);
var index0:int;
var index1:int;
var index2:int;
index0 = indexs[0];
index1 = indexs[1];
index2 = indexs[2];
_absArr.length=0;
uvAbs = solvePoints(mesh.texture.uv, mUv[index0], mUv[index0+1], mUv[index1]-mUv[index0], mUv[index1+1]-mUv[index0+1], mUv[index2]-mUv[index0], mUv[index2+1]-mUv[index0+1],_absArr);
var newVerticles:Array;
newVerticles = transPoints(uvAbs, mVer[index0], mVer[index0+1], mVer[index1]- mVer[index0], mVer[index1+1]-mVer[index0+1], mVer[index2]- mVer[index0], mVer[index2+1]-mVer[index0+1],rst);

return newVerticles;
}

/**
* 计算ab列表,pointC=point0+a*v1+b*v2
* @param pointList pointC列表
* @param oX point0.x
* @param oY point0.y
* @param v1x v1.x
* @param v1y v1.y
* @param v2x v2.x
* @param v2y v2.y
* @param rst
* @return
*
*/
public static function solvePoints(pointList:Array, oX:Number, oY:Number, v1x:Number, v1y:Number, v2x:Number, v2y:Number,rst:Array=null):Array
{
rst = rst||[];
var i:int, len:int;
len = pointList.length;
var tRst:Array;
for (i = 0; i < len; i+=2)
{
tRst = solve2(pointList[i], pointList[i + 1], oX, oY, v1x, v1y, v2x, v2y);
rst.push(tRst[0],tRst[1]);
}
return rst;
}

/**
* 根据偏移ab列表,生成对应的点,pointC=point0+a*v1+b*v2
* @param abs ab列表
* @param oX point0.x
* @param oY point0.y
* @param v1x v1.x
* @param v1y v1.y
* @param v2x v2.x
* @param v2y v2.y
* @param rst
* @return
*
*/
public static function transPoints(abs:Array, oX:Number, oY:Number, v1x:Number, v1y:Number, v2x:Number, v2y:Number,rst:Array=null):Array
{
rst =rst|| [];
var i:int, len:int;
len = abs.length;
var tRst:Array;
for (i = 0; i < len; i+=2)
{
tRst = transPoint(abs[i], abs[i + 1], oX, oY, v1x, v1y, v2x, v2y,rst);
}
return rst;
}

/**
* 获取 pointC=point0+a*v1+b*v2
* @param a
* @param b
* @param oX point0.x
* @param oY point0.y
* @param v1x v1.x
* @param v1y v1.y
* @param v2x v2.x
* @param v2y v2.y
* @param rst
* @return
*
*/
public static function transPoint(a:Number, b:Number, oX:Number, oY:Number, v1x:Number, v1y:Number, v2x:Number, v2y:Number,rst:Array=null):Array
{
rst =rst|| [];
var nX:Number;
var nY:Number;
nX = oX + v1x * a + v2x * b;
nY = oY + v1y * a + v2y * b;
rst.push(nX, nY)
return rst;
}

/**
* 解方程 求解 pointC=point0+a*v1+b*v2,计算过程要求v1.x!=0
* @param rx pointC.x
* @param ry pointC.y
* @param oX point0.x
* @param oY point0.y
* @param v1x v1.x
* @param v1y v1.y
* @param v2x v2.x
* @param v2y v2.y
* @param rv 是否交换v1,v2
* @param rst
* @return
*
*/
public static function solve2(rx:Number, ry:Number, oX:Number, oY:Number, v1x:Number, v1y:Number, v2x:Number, v2y:Number,rv:Boolean=false,rst:Array=null):Array
{
rst=rst||[];
var a:Number, b:Number;
//pointC.x = point0.x + a * v1.x + b * v2.x;
//pointC.y = point0.y + a * v1.y + b * v2.y;

//pointC.x - point0.x = a * v1.x + b * v2.x;
//pointC.y - point0.y = a * v1.y + b * v2.y;

if (v1x == 0)
{
return solve2(rx, ry, oX, oY, v2x, v2y, v1x, v1y, true,rst);
}

var dX:Number;
var dY:Number;
dX = rx -oX;
dY = ry - oY;

//dX = a * v1.x + b * v2.x;
//dY = a * v1.y + b * v2.y;

//a = (dX - b * v2.x) / v1.x;
//dY = ((dX - b * v2.x) / v1.x) * v1.y + b * v2.y;
//
//dY = dX * v1.y / v1.x - b * v2.x * v1.y / v1.x + b * v2.y;
//dY = dX * v1.y / v1.x + b * (v2.y - v2.x * v1.y / v1.x);
//dY - dX * v1.y / v1.x = b * (v2.y - v2.x * v1.y / v1.x);

b = (dY - dX * v1y / v1x) / (v2y - v2x * v1y / v1x);
a = (dX - b * v2x) / v1x;

//trace("a,b", a, b);
if(rv)
{
rst.push(b,a);
}else
{
rst.push(a,b);
}
return rst;
}

/**
* 求解 pointC=point0+a*v1+b*v2,计算过程要求v1.x!=0
* v1,v2为不平行的向量
* @param pointC 目标点
* @param point0 起点
* @param v1 向量1
* @param v2 向量2
* @return
*
*/
public static function solve(pointC:Point, point0:Point, v1:Point, v2:Point):Array
{
return solve2(pointC.x, pointC.y, point0.x, point0.y, v1.x, v1.y, v2.x, v2.y);
}
}
}
85 changes: 85 additions & 0 deletions bin/as/libs/src/laya/ani/bone/canvasmesh/CacheAbleSkinMesh.as
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
package laya.ani.bone.canvasmesh
{
import laya.maths.Matrix;
import laya.maths.Rectangle;
import laya.renders.RenderContext;
import laya.resource.HTMLCanvas;
import laya.resource.Texture;
/**
* @private
* 将mesh元素缓存到canvas中并进行绘制
* @author ww
*/
public class CacheAbleSkinMesh extends SkinMeshCanvas
{

public function CacheAbleSkinMesh()
{
super();
}
public var isCached:Boolean = false;
public var canvas:HTMLCanvas;
public var tex:Texture;
public var rec:Rectangle;
private static var tempMt:Matrix = new Matrix();
public function getCanvasPic():Texture {
var canvas:HTMLCanvas = new HTMLCanvas("2D");
var ctx:* = canvas.getContext('2d');
rec = mesh.getBounds();
debugger;
canvas.size(rec.width, rec.height);
var preTransform:Matrix;
preTransform = transform;
transform = tempMt;
transform.identity();
transform.translate(-rec.x, -rec.y);
renderToContext(ctx);
transform.translate( +rec.x, +rec.y);
transform = preTransform;
return new Texture(canvas);
}
override public function render(context:*, x:Number, y:Number):void
{
if (!mesh.texture) return;
//canvas = new HTMLCanvas();
if (!isCached)
{
isCached = true;
tex = getCanvasPic();
}
if(!transform)
{
transform=_tempMatrix;
transform.identity();
transform.translate(x, y);
_renderTextureToContext(context);
transform.translate(-x, -y);
transform=null;
}else
{
transform.translate(x, y);
_renderTextureToContext(context);
transform.translate(-x, -y);
}
}
public function _renderTextureToContext(context:*):void
{
this.context = context.ctx || context;
context.save();
var texture:Texture;
texture = tex;
if (transform)
{
var mt:Matrix=transform;
context.transform(mt.a, mt.b, mt.c, mt.d, mt.tx, mt.ty);

}
rec = mesh.getBounds();
context.translate(rec.x, rec.y);
context.drawTexture(texture, 0, 0, texture.width, texture.height,0,0);
context.restore();
}

}

}
Loading

0 comments on commit 0d74427

Please sign in to comment.