Example #1
0
        //public static void DrawSprite( Vector2 parentOffset, Vector2 orig, Vector2 position, float rotation, Vector2 scale, Vector2 shear, Color color, Sprite spr, bool border, string borderText, Color borderColor)
        //{
        //    if ( spr == null && spr.image == null )
        //        return;

        //    DrawTexture(parentOffset, orig, position, rotation, scale, shear, color, spr.image, spr.pivot, spr.imageRect, border, borderText, borderColor);
        //}


        //public static void DrawTexture(Vector2 parentOffset, Vector2 orig, Vector2 position, float rotation, Vector2 scale, Vector2 shear, Color color, Texture2D tex, Vector2 pivot, Rect imageRect, bool border, string borderText, Color borderColor)
        //{
        //    if (tex == null || !tex)
        //        return;

        //    Matrix4x4 mat = GUI.matrix;
        //    Color oldColor = GUI.color;


        //    //GUI.matrix
        //    Matrix4x4 _mat = Matrix4x4.identity;

        //    Matrix4x4 shearMat = Matrix4x4.identity;

        //    shearMat[1, 0] = shear.x;
        //    shearMat[0, 1] = shear.y;

        //    _mat = shearMat * Matrix4x4.TRS( -new Vector2( pivot.x, pivot.y) - parentOffset, Quaternion.identity, Vector3.one);
        //    _mat = Matrix4x4.TRS(orig + position + parentOffset, Quaternion.Euler(0, 0, -rotation), new Vector3( scale.x, scale.y, 1f) ) * _mat;

        //    GUI.matrix = _mat;// *GUI.matrix;

        //    Rect borderRect = new Rect(0, 0, imageRect.width, imageRect.height);

        //    GUI.color = borderColor;
        //    if (border)
        //        GUI.BeginGroup(borderRect, "", "selectionrect");
        //    else
        //        GUI.BeginGroup(borderRect, "");

        //    GUI.color = color;
        //    GUI.DrawTexture(new Rect(-imageRect.x, -imageRect.y, tex.width, tex.height), tex);

        //    if (border)
        //    {
        //        GUI.Label(new Rect(0, 0, imageRect.width, imageRect.height), borderText, EditorStyles.whiteBoldLabel);
        //    }

        //    GUI.EndGroup();

        //    GUI.color = oldColor;
        //    GUI.matrix = mat;
        //}



        /// <summary>
        /// Draw a EasyMotion2D sprite.
        /// </summary>
        public static void DrawSprite(Vector2 parentOffset, Vector2 orig, Vector2 position, float rotation, Vector2 scale, Vector2 shear, Color color,
                                      Sprite spr, SpriteRenderMode renderMode, bool border, string borderText, Color borderColor, GUIStyle borderStyle)
        {
            if (spr == null && spr.image == null)
            {
                return;
            }

            Vector2 textScale = Vector2.one;

            if (spr.useOrigSize)
            {
                textScale = new Vector2(spr.origTextureSize.x > spr.image.width ? spr.origTextureSize.x / spr.image.width : 1f,
                                        spr.origTextureSize.y > spr.image.height ? spr.origTextureSize.y / spr.image.height : 1f);

                if (spr.imageRect.x == 0f && spr.imageRect.width != spr.image.width)
                {
                    textScale.x = spr.origTextureSize.x / spr.image.width;
                }

                if (spr.imageRect.y == 0f && spr.imageRect.height != spr.image.height)
                {
                    textScale.y = spr.origTextureSize.y / spr.image.height;
                }
            }

            DrawTexture(parentOffset, orig,
                        new Vector2(position.x + spr.position.x, position.y - spr.position.y),
                        rotation + spr.rotation,
                        new Vector2(scale.x * spr.scale.x, scale.y * spr.scale.y),
                        shear, color, spr.image, renderMode, spr.pivot, spr.imageRect, border, borderText, borderColor, borderStyle,
                        textScale
                        );
        }
        static public System.WeakReference GetMaterial(SpriteRenderMode rm, Texture tex)
        {
            int idx = rm == SpriteRenderMode.None ? 0 : (int)rm;
            SpriteRenderModeGroup group = renderModeGroup[idx];

            System.WeakReference ret = null;

            int id = tex == null ? 0 : tex.GetInstanceID();

            if (group != null)
            {
                if (group.setting.IsAlive)
                {
                    ret = group.materials[id] as System.WeakReference;
                    if (ret == null)
                    {
                        SpriteRenderModeSetting setting = group.setting.Target as SpriteRenderModeSetting;

                        Material mat = new Material(setting.shader);
                        mat.mainTexture = tex;

                        ret = new System.WeakReference(mat);
                        group.materials[id] = ret;
                        setting.materials.Add(ret);
                    }
                    else
                    {
                        if (!ret.IsAlive)
                        {
                            SpriteRenderModeSetting setting = group.setting.Target as SpriteRenderModeSetting;

                            Material mat = new Material(setting.shader);
                            mat.mainTexture = tex;

                            ret = new System.WeakReference(mat);
                            group.materials[id] = ret;
                            setting.materials.Add(ret);
                        }
                    }
                }
                else
                {
                    renderModeGroup[idx] = null;
                }
            }
            else
            {
                Debug.LogError("unknown RenderMode " + rm);
            }
            return(ret);
        }
        static public Material GetMaterial(SpriteRenderMode rm, Texture tex)
        {
            int idx = rm == SpriteRenderMode.None ? 0 : (int)rm;
            SpriteRenderModeGroup group = renderModeGroup[idx];
            Material ret = null;

            if (group != null)
            {
                if ((ret = group.materials[tex] as Material) == null)
                {
                    ret                  = new Material(group.setting.shader);
                    ret.mainTexture      = tex;
                    group.materials[tex] = ret;
                    group.setting.materials.Add(ret);
                }
            }
            else
            {
                Debug.LogError("unknown RenderMode " + rm);
            }
            return(ret);
        }
 static public bool IsShaderTransparent(SpriteRenderMode rm)
 {
     return(transArray[(int)rm]);
 }
        /// <summary>
        /// Apply the Transform's data to renderer.
        /// </summary>
        public void Apply()
        {
            if (renderMode != null)
                _renderMode = renderMode.renderMode;
            else
                return;


            primitiveGroup.visible = _visible && behaviourEnabled;

            if (!_visible || !behaviourEnabled)
                return;


            if (applyDepthToTransform)
            {
                int _layer = 0;
                int _depth = 0;
                float d = 0;

                if (plane == SpritePlane.PlaneXY)
                {
                    d = _transform.position.z;
                }
                else if (plane == SpritePlane.PlaneXZ)
                {
                    d = _transform.position.y;
                }
                else if (plane == SpritePlane.PlaneZY)
                {
                    d = _transform.position.x;
                }

                _layer = (int)(d / 64);
                _depth = (int)((d % 64f) / 0.125f);
                
                gameObject.layer = _layer;
                depth = _depth;
            }



            //isColorChange = lastColor != color;


            depth = Mathf.Clamp(depth, 0, 511);

            int layer = gameObject.layer; ;
            gameObjectLayer = (uint)layer;
            Vector3 tranPos = _transform.position;


            {
                preCalcKey = precalcKey(gameObjectLayer, (uint)depth, renderMode, applyLayerToZ);
            }


            {
                Vector3 parentScale = _transform.localScale;
                Transform p = _transform.parent;

                while (p != null)
                {
                    parentScale.x *= p.localScale.x;
                    parentScale.y *= p.localScale.y;
                    parentScale.z *= p.localScale.z;

                    p = p.parent;
                }

                Vector2 scale = commitToSceneManager ? new Vector2(parentScale.x, parentScale.y) : Vector2.one;
                scale.x *= scaleFactor;
                scale.y *= scaleFactor;
                scale.x *= localScale.x;
                scale.y *= localScale.y;

                bool firstTransform = true;

                if (plane == SpritePlane.PlaneXY)
                {
                    boundingAABB.position_maxx = boundingAABB.position_minx = tranPos.x;
                    boundingAABB.position_maxy = boundingAABB.position_miny = tranPos.y;

                    Vector2 targetOrig = commitToSceneManager ? new Vector2(tranPos.x, tranPos.y) : Vector2.zero;



                    float rz = commitToSceneManager ? _transform.eulerAngles.z : 0f;
                    rz += localRotation;

                    for (int i = 0; i < activePrimitiveCount; i++)
                    {
                        spriteTransforms[i].id = i;
                        firstTransform = SetupSpritePrimitiveXY(primitives[i], spriteTransforms[i], targetOrig, rz, scale, layer, firstTransform);
                    }

                    if (applyDepthToTransform)
                    {
                        _transform.position = new Vector3(tranPos.x, tranPos.y, layer * 64f + depth * 0.125f);
                    }
                }
                else if (plane == SpritePlane.PlaneZY)
                {
                    boundingAABB.position_maxx = boundingAABB.position_minx = tranPos.z;
                    boundingAABB.position_maxy = boundingAABB.position_miny = tranPos.y;

                    Vector2 targetOrig = commitToSceneManager ? new Vector2(tranPos.z, tranPos.y) : Vector2.zero;



                    float rx = commitToSceneManager ? _transform.eulerAngles.x : 0f;
                    rx += localRotation;

                    for (int i = 0; i < activePrimitiveCount; i++)
                    {
                        spriteTransforms[i].id = i;
                        firstTransform = SetupSpritePrimitiveZY(primitives[i], spriteTransforms[i], targetOrig, -rx, scale, layer, firstTransform);
                    }

                    if (applyDepthToTransform)
                    {
                        _transform.position = new Vector3(-layer * 64f + depth * 0.125f, tranPos.y, tranPos.z);
                    }
                }
                else
                {
                    boundingAABB.position_maxx = boundingAABB.position_minx = tranPos.x;
                    boundingAABB.position_maxy = boundingAABB.position_miny = tranPos.z;

                    Vector2 targetOrig = commitToSceneManager ? new Vector2(tranPos.x, tranPos.z) : Vector2.zero;



                    float ry = commitToSceneManager ? _transform.eulerAngles.y : 0f;
                    ry += localRotation;

                    for (int i = 0; i < activePrimitiveCount; i++)
                    {
                        spriteTransforms[i].id = i;
                        firstTransform = SetupSpritePrimitiveXZ(primitives[i], spriteTransforms[i], targetOrig, -ry, scale, layer, firstTransform);
                    }

                    if (applyDepthToTransform)
                    {
                        _transform.position = new Vector3(tranPos.x, -layer * 64f + depth * 0.125f, tranPos.z);
                    }
                }
            }




            if (anchor != SpriteRendererAnchor.None)
            {
                Vector2 _pos = vecOne;

                switch (anchor)
                {
                    case SpriteRendererAnchor.Custom:
                        _pos.x = boundingAABB.position_minx + pivot.x;
                        _pos.y = boundingAABB.position_maxy + pivot.y;
                        break;

                    case SpriteRendererAnchor.TopLeft:
                        _pos.x = boundingAABB.position_minx;
                        _pos.y = boundingAABB.position_maxy;
                        break;
                    case SpriteRendererAnchor.TopCenter:
                        _pos.x = (boundingAABB.position_maxx + boundingAABB.position_minx) * 0.5f;
                        _pos.y = boundingAABB.position_maxy;
                        break;
                    case SpriteRendererAnchor.TopRight:
                        _pos.x = boundingAABB.position_maxx;
                        _pos.y = boundingAABB.position_maxy;
                        break;

                    case SpriteRendererAnchor.MiddleLeft:
                        _pos.x = boundingAABB.position_minx;
                        _pos.y = (boundingAABB.position_maxy + boundingAABB.position_miny) * 0.5f;
                        break;
                    case SpriteRendererAnchor.MiddleCenter:
                        _pos.x = (boundingAABB.position_maxx + boundingAABB.position_minx) * 0.5f;
                        _pos.y = (boundingAABB.position_maxy + boundingAABB.position_miny) * 0.5f;
                        break;
                    case SpriteRendererAnchor.MiddleRight:
                        _pos.x = boundingAABB.position_maxx;
                        _pos.y = (boundingAABB.position_maxy + boundingAABB.position_miny) * 0.5f;
                        break;

                    case SpriteRendererAnchor.BottomLeft:
                        _pos.x = boundingAABB.position_minx;
                        _pos.y = boundingAABB.position_miny;
                        break;
                    case SpriteRendererAnchor.BottomCenter:
                        _pos.x = (boundingAABB.position_maxx + boundingAABB.position_minx) * 0.5f;
                        _pos.y = boundingAABB.position_miny;
                        break;
                    case SpriteRendererAnchor.BottomRight:
                        _pos.x = boundingAABB.position_maxx;
                        _pos.y = boundingAABB.position_miny;
                        break;
                }

                if (plane == SpritePlane.PlaneXY)
                {
                    anchorOffset.x = tranPos.x - _pos.x;
                    anchorOffset.y = tranPos.y - _pos.y;
                    anchorOffset.z = 0f;
                }
                else if (plane == SpritePlane.PlaneXZ)
                {
                    anchorOffset.x = tranPos.x - _pos.x;
                    anchorOffset.y = 0f;
                    anchorOffset.z = tranPos.y - _pos.y;
                }
                else if (plane == SpritePlane.PlaneZY)
                {
                    anchorOffset.x = 0f;
                    anchorOffset.y = tranPos.y - _pos.y;
                    anchorOffset.z = tranPos.x - _pos.x;
                }

                boundingAABB.position_minx += (tranPos.x - _pos.x);
                boundingAABB.position_maxx += (tranPos.x - _pos.x);
                boundingAABB.position_miny += (tranPos.y - _pos.y);
                boundingAABB.position_maxy += (tranPos.y - _pos.y);

                ApplyAnchor(anchorOffset);
            }



            //recalc bounding
            {
                float w = (boundingAABB.position_maxx - boundingAABB.position_minx) * 0.5f;
                float h = (boundingAABB.position_maxy - boundingAABB.position_miny) * 0.5f;

                radius = Mathf.Sqrt(w * w + h * h);
                boundingAABB.center.x = (boundingAABB.position_maxx + boundingAABB.position_minx) * 0.5f;
                boundingAABB.center.y = (boundingAABB.position_maxy + boundingAABB.position_miny) * 0.5f;
            }


            lastColor = color;


            isUpdated = true;
            isApply = true;

            applyHandler(this);
        }
        private int groupPrimitive(int priCount, ref int visTriangles)
        {
            subMeshCount = 0;

            int              vertexIdx   = 0;
            Texture          lastTex     = null;
            uint             lastTexId   = 0;
            int              triangleCnt = 0;
            int              startIdx    = 0;
            SpriteRenderMode lastSRM     = SpriteRenderMode.None;


            SpritePrimitive primitive   = null;
            int             visPriCount = 0;

            for (int pi = 0; pi < priCount; pi++)
            {
                primitive = _primitives[pi];
                if (lastSRM != primitive.renderMode || lastTexId != primitive.texId)
                {
                    if (lastTexId != 0)
                    {
                        SubMeshInfo info = subMeshs[subMeshCount];

                        info.indexBase   = startIdx;
                        info.triangleCnt = triangleCnt;
                        info.mat         = SpriteMaterialManager.GetMaterial(lastSRM, lastTex);

                        subMeshCount++;

                        startIdx      = (vertexIdx >> 2) * 6;
                        visTriangles += triangleCnt;
                        triangleCnt   = 0;
                    }

                    lastTexId = primitive.texId;
                    lastTex   = primitive.texture;
                    lastSRM   = primitive.renderMode;
                }

                int c = primitive.size << 2;
                for (int i = 0; i < c; i++)
                {
                    int idx = vertexIdx + i;
                    vertices[idx] = primitive.position[i];
                    UVs[idx]      = primitive.uv[i];
                    colors[idx]   = primitive.color[i];
                }

                vertexIdx   += c;
                triangleCnt += (c >> 1);
                visPriCount++;
            }

            {
                SubMeshInfo _info = subMeshs[subMeshCount];

                _info.indexBase   = startIdx;
                _info.triangleCnt = triangleCnt;
                _info.mat         = SpriteMaterialManager.GetMaterial(lastSRM, lastTex);

                visTriangles += triangleCnt;
            }

            subMeshCount++;
            return(visPriCount);
        }
        internal static bool IsSemiTransparent(SpriteRenderMode rm)
        {
            SpriteRenderModeGroup group = renderModeGroup[(int)rm];

            return(group != null ? group.setting.sortByDepth : false);
        }
        /// <summary>
        /// Apply the Transform's data to renderer.
        /// </summary>
        public void Apply()
        {
            if (renderMode != null)
                _renderMode = renderMode.renderMode;
            else
                return;


            //Vector3 tmp = transform.TransformPoint(vecOne);
            //if (tmp == transformedVec && _renderMode == lastRM)
            //    return;

            //transformedVec = tmp;
            //lastRM = _renderMode;

            primitiveGroup.visible = _visible && behaviourEnabled;

            if (!_visible || !behaviourEnabled)
                return;


            depth = Mathf.Clamp(depth, 0, 511);

            int layer = gameObject.layer; ;
            gameObjectLayer = (uint)layer;
            Vector3 tranPos = _transform.position;


            {
                Vector3 parentScale = Vector3.one;
                Transform p = _transform.parent;

                while (p != null)
                {
                    parentScale = Vector3.Scale( parentScale, p.localScale);
                    p = p.parent;
                }

                Vector2 scale = commitToSceneManager ? Vector2.Scale(parentScale, _transform.localScale) : Vector2.one;

                //
                scale *= scaleFactor;
                scale = Vector3.Scale(scale, localScale);


                bool firstTransform = true;

                if (plane == SpritePlane.PlaneXY)
                {
                    boundingAABB.position_maxx = boundingAABB.position_minx = tranPos.x;
                    boundingAABB.position_maxy = boundingAABB.position_miny = tranPos.y;

                    Vector2 targetOrig = commitToSceneManager ? new Vector2(tranPos.x, tranPos.y) : Vector2.zero;



                    float rz = commitToSceneManager ? _transform.eulerAngles.z : 0f;

                    for (int i = 0; i < activePrimitiveCount; i++)
                    {
                        spriteTransforms[i].id = i;
                        firstTransform = SetupSpritePrimitiveXY(primitives[i], spriteTransforms[i], targetOrig, rz, scale, layer, firstTransform);
                    }

                    if (applyDepthToTransform)
                    {
                        _transform.position = new Vector3(tranPos.x, tranPos.y, layer * 64f + depth * 0.125f);
                    }
                }
                else if (plane == SpritePlane.PlaneZY)
                {
                    boundingAABB.position_maxx = boundingAABB.position_minx = tranPos.z;
                    boundingAABB.position_maxy = boundingAABB.position_miny = tranPos.y;

                    Vector2 targetOrig = commitToSceneManager ? new Vector2(tranPos.z, tranPos.y) : Vector2.zero;
                    


                    float rx = commitToSceneManager ? _transform.eulerAngles.x : 0f;


                    for (int i = 0; i < activePrimitiveCount; i++)
                    {
                        spriteTransforms[i].id = i;
                        firstTransform = SetupSpritePrimitiveZY(primitives[i], spriteTransforms[i], targetOrig, rx, scale, layer, firstTransform);
                    }

                    if (applyDepthToTransform)
                    {
                        _transform.position = new Vector3(-layer * 64f + depth * 0.125f, tranPos.y, tranPos.z);
                    }
                }
                else
                {
                    boundingAABB.position_maxx = boundingAABB.position_minx = tranPos.x;
                    boundingAABB.position_maxy = boundingAABB.position_miny = tranPos.z;

                    Vector2 targetOrig = commitToSceneManager ? new Vector2(tranPos.x, tranPos.z) : Vector2.zero;
                    


                    float ry = commitToSceneManager ? _transform.eulerAngles.y : 0f;


                    for (int i = 0; i < activePrimitiveCount; i++)
                    {
                        spriteTransforms[i].id = i;
                        firstTransform = SetupSpritePrimitiveXZ(primitives[i], spriteTransforms[i], targetOrig, ry, scale, layer, firstTransform);
                    }

                    if (applyDepthToTransform)
                    {
                        _transform.position = new Vector3(tranPos.x, -layer * 64f + depth * 0.125f, tranPos.z);
                    }
                }
            }




            if (anchor != SpriteRendererAnchor.None)
            {
                Vector2 _pos = vecOne;

                switch (anchor)
                {
                    case SpriteRendererAnchor.Custom:
                        _pos.x = boundingAABB.position_minx + pivot.x;
                        _pos.y = boundingAABB.position_maxy + pivot.y;
                        break;

                    case SpriteRendererAnchor.TopLeft:
                        _pos.x = boundingAABB.position_minx;
                        _pos.y = boundingAABB.position_maxy;
                        break;
                    case SpriteRendererAnchor.TopCenter:
                        _pos.x = (boundingAABB.position_maxx + boundingAABB.position_minx) * 0.5f;
                        _pos.y = boundingAABB.position_maxy;
                        break;
                    case SpriteRendererAnchor.TopRight:
                        _pos.x = boundingAABB.position_maxx;
                        _pos.y = boundingAABB.position_maxy;
                        break;

                    case SpriteRendererAnchor.MiddleLeft:
                        _pos.x = boundingAABB.position_minx;
                        _pos.y = (boundingAABB.position_maxy + boundingAABB.position_miny) * 0.5f;
                        break;
                    case SpriteRendererAnchor.MiddleCenter:
                        _pos.x = (boundingAABB.position_maxx + boundingAABB.position_minx) * 0.5f;
                        _pos.y = (boundingAABB.position_maxy + boundingAABB.position_miny) * 0.5f;
                        break;
                    case SpriteRendererAnchor.MiddleRight:
                        _pos.x = boundingAABB.position_maxx;
                        _pos.y = (boundingAABB.position_maxy + boundingAABB.position_miny) * 0.5f;
                        break;

                    case SpriteRendererAnchor.BottomLeft:
                        _pos.x = boundingAABB.position_minx;
                        _pos.y = boundingAABB.position_miny;
                        break;
                    case SpriteRendererAnchor.BottomCenter:
                        _pos.x = (boundingAABB.position_maxx + boundingAABB.position_minx) * 0.5f;
                        _pos.y = boundingAABB.position_miny;
                        break;
                    case SpriteRendererAnchor.BottomRight:
                        _pos.x = boundingAABB.position_maxx;
                        _pos.y = boundingAABB.position_miny;
                        break;
                }

                if (plane == SpritePlane.PlaneXY)
                {
                    anchorOffset.x = tranPos.x - _pos.x;
                    anchorOffset.y = tranPos.y - _pos.y;
                    anchorOffset.z = 0f;
                }
                else if (plane == SpritePlane.PlaneXZ)
                {
                    anchorOffset.x = tranPos.x - _pos.x;
                    anchorOffset.y = 0f;
                    anchorOffset.z = tranPos.y - _pos.y;
                }
                else if (plane == SpritePlane.PlaneZY)
                {
                    anchorOffset.x = 0f;
                    anchorOffset.y = tranPos.y - _pos.y;
                    anchorOffset.z = tranPos.x - _pos.x;
                }

                boundingAABB.position_minx += (tranPos.x - _pos.x);
                boundingAABB.position_maxx += (tranPos.x - _pos.x);
                boundingAABB.position_miny += (tranPos.y - _pos.y);
                boundingAABB.position_maxy += (tranPos.y - _pos.y);

                ApplyAnchor(anchorOffset);
            }



            float w = (boundingAABB.position_maxx - boundingAABB.position_minx) * 0.5f;
            float h = (boundingAABB.position_maxy - boundingAABB.position_miny) * 0.5f;

            radius = Mathf.Sqrt(w * w + h * h);
            boundingAABB.center.x = (boundingAABB.position_maxx + boundingAABB.position_minx) * 0.5f;
            boundingAABB.center.y = (boundingAABB.position_maxy + boundingAABB.position_miny) * 0.5f;


            isUpdated = true;
            isApply = true;
        }
 static public bool IsShaderTransparent(SpriteRenderMode rm)
 {
     return transArray[(int)rm];
 }
 internal static bool IsSemiTransparent(SpriteRenderMode rm)
 {
     SpriteRenderModeGroup group = renderModeGroup[(int)rm];
     return group != null ? group.setting.sortByDepth : false;
 }
        static public Material GetMaterial(SpriteRenderMode rm, Texture tex)
        {
            int idx = rm == SpriteRenderMode.None ? 0 : (int)rm;
            SpriteRenderModeGroup group = renderModeGroup[idx];
            Material ret = null;

            if (group != null)
            {
                if ((ret = group.materials[tex] as Material) == null)
                {
                    ret = new Material(group.setting.shader);
                    ret.mainTexture = tex;
                    group.materials[tex] = ret;
                    group.setting.materials.Add(ret);
                }
            }
            else
            {
                Debug.LogError("unknown RenderMode " + rm);
            }
            return ret;
        }
        static public System.WeakReference GetMaterial(SpriteRenderMode rm, Texture tex)
        {
            int idx = rm == SpriteRenderMode.None ? 0 : (int)rm;
            SpriteRenderModeGroup group = renderModeGroup[idx];
            System.WeakReference ret = null;

            int id = tex == null ? 0 : tex.GetInstanceID();

            if (group != null)
            {
                if (group.setting.IsAlive)
                {
                    ret = group.materials[id] as System.WeakReference;
                    if ( ret == null)
                    {
                        SpriteRenderModeSetting setting = group.setting.Target as SpriteRenderModeSetting;

                        Material mat = new Material(setting.shader);
                        mat.mainTexture = tex;

                        ret = new System.WeakReference(mat);
                        group.materials[id] = ret;
                        setting.materials.Add(ret);
                    }
                    else
                    {
                        if (!ret.IsAlive)
                        {
                            SpriteRenderModeSetting setting = group.setting.Target as SpriteRenderModeSetting;

                            Material mat = new Material(setting.shader);
                            mat.mainTexture = tex;

                            ret = new System.WeakReference(mat);
                            group.materials[id] = ret;
                            setting.materials.Add(ret);
                        }
                    }
                }
                else
                {
                    renderModeGroup[idx] = null;
                }
            }
            else
            {
                Debug.LogError("unknown RenderMode " + rm);
            }
            return ret;
        }
Example #13
0
        /// <summary>
        /// Draw a texture with transform.
        /// This function can not make Texture clipping properly.
        /// </summary>
        public static void DrawTexture(Vector2 parentOffset, Vector2 orig, Vector2 position, float rotation, Vector2 scale, Vector2 shear, Color color,
                                       Texture2D tex, SpriteRenderMode renderMode, Vector2 pivot, Rect imageRect, bool border, string borderText, Color borderColor, GUIStyle borderStyle, Vector2 texScale)
        {
            if (tex == null || !tex)
            {
                return;
            }

            if (scale.x == 0f || scale.y == 0f)
            {
                return;
            }

            Matrix4x4 mat = GUI.matrix;

            GUIUtility.RotateAroundPivot(90, Vector2.zero);
            parentOffset.y = GUI.matrix.m03;

            Color oldColor = GUI.color;


            //GUI.matrix
            Matrix4x4 _mat = Matrix4x4.identity;

            Matrix4x4 shearMat = Matrix4x4.identity;

            shearMat[1, 0] = shear.x;
            shearMat[0, 1] = shear.y;

            _mat = Matrix4x4.TRS(-new Vector2(pivot.x, pivot.y) - parentOffset
                                 , Quaternion.identity, Vector3.one);
            _mat = shearMat * _mat;
            _mat = Matrix4x4.TRS(orig + position + parentOffset
                                 , Quaternion.Euler(0, 0, -rotation)
                                 , new Vector3(scale.x, scale.y, 1f)) * _mat;

            GUI.matrix = _mat;// *GUI.matrix;

            GUI.color = borderColor;
            Rect borderRect = new Rect(0, 0, imageRect.width, imageRect.height);

            if (border)
            {
                GUI.BeginGroup(borderRect, "", "selectionrect");
            }
            else
            {
                GUI.BeginGroup(borderRect, "");
            }

            GUI.color = color;
            GUI.DrawTexture(new Rect(-imageRect.x, -imageRect.y, tex.width * texScale.x, tex.height * texScale.y), tex);

            if (border)
            {
                GUI.Label(new Rect(0, 0, imageRect.width, imageRect.height), borderText, borderStyle);
            }

            GUI.EndGroup();

            GUI.color  = oldColor;
            GUI.matrix = mat;
        }
Example #14
0
        /// <summary>
        /// Apply the Transform's data to renderer.
        /// </summary>
        public void Apply()
        {
            if (renderMode != null)
            {
                _renderMode = renderMode.renderMode;
            }
            else
            {
                return;
            }


            //Vector3 tmp = transform.TransformPoint(vecOne);
            //if (tmp == transformedVec && _renderMode == lastRM)
            //    return;

            //transformedVec = tmp;
            //lastRM = _renderMode;

            primitiveGroup.visible = _visible && behaviourEnabled;

            if (!_visible || !behaviourEnabled)
            {
                return;
            }


            depth = Mathf.Clamp(depth, 0, 511);

            int layer = gameObject.layer;;

            gameObjectLayer = (uint)layer;

            {
                Vector3   parentScale = Vector3.one;
                Transform p           = _transform.parent;

                while (p != null)
                {
                    parentScale = Vector3.Scale(parentScale, p.localScale);
                    p           = p.parent;
                }

                Vector2 scale = commitToSceneManager ? Vector2.Scale(parentScale, _transform.localScale) : Vector2.one;

                bool firstTransform = true;

                if (plane == SpritePlane.PlaneXY)
                {
                    Vector2 pos = _transform.position;

                    boundingAABB.position_maxx = boundingAABB.position_minx = pos.x;
                    boundingAABB.position_maxy = boundingAABB.position_miny = pos.y;

                    Vector2 targetOrig = commitToSceneManager ? pos : Vector2.zero;
                    float   rz         = commitToSceneManager ? _transform.eulerAngles.z : 0f;

                    for (int i = 0; i < activePrimitiveCount; i++)
                    {
                        //spriteTransforms[i].id = i;
                        SetupSpritePrimitiveXY(primitives[i], spriteTransforms[i], targetOrig, rz, scale, layer, ref firstTransform);
                    }

                    if (applyDepthToTransform)
                    {
                        _transform.position = new Vector3(pos.x, pos.y, layer * 64f + depth * 0.125f);
                    }
                }
                else if (plane == SpritePlane.PlaneZY)
                {
                    Vector3 pos = _transform.position;

                    boundingAABB.position_maxx = boundingAABB.position_minx = pos.z;
                    boundingAABB.position_maxy = boundingAABB.position_miny = pos.y;

                    Vector2 targetOrig = commitToSceneManager ? new Vector2(pos.z, pos.y) : Vector2.zero;

                    float rx = commitToSceneManager ? _transform.eulerAngles.x : 0f;


                    for (int i = 0; i < activePrimitiveCount; i++)
                    {
                        spriteTransforms[i].id = i;
                        SetupSpritePrimitiveZY(primitives[i], spriteTransforms[i], targetOrig, rx, scale, layer, ref firstTransform);
                    }

                    if (applyDepthToTransform)
                    {
                        _transform.position = new Vector3(-layer * 64f + depth * 0.125f, pos.y, pos.z);
                    }
                }
                else
                {
                    Vector3 pos = _transform.position;

                    boundingAABB.position_maxx = boundingAABB.position_minx = pos.x;
                    boundingAABB.position_maxy = boundingAABB.position_miny = pos.z;

                    Vector2 targetOrig = commitToSceneManager ?  new Vector2(pos.x, pos.z) :Vector2.zero;

                    float ry = commitToSceneManager ? _transform.eulerAngles.y : 0f;

                    for (int i = 0; i < activePrimitiveCount; i++)
                    {
                        spriteTransforms[i].id = i;
                        SetupSpritePrimitiveXZ(primitives[i], spriteTransforms[i], targetOrig, ry, scale, layer, ref firstTransform);
                    }

                    if (applyDepthToTransform)
                    {
                        _transform.position = new Vector3(pos.x, -layer * 64f + depth * 0.125f, pos.z);
                    }
                }
            }


            float w = (boundingAABB.position_maxx - boundingAABB.position_minx) * 0.5f;
            float h = (boundingAABB.position_maxy - boundingAABB.position_miny) * 0.5f;

            radius = Mathf.Sqrt(w * w + h * h);
            boundingAABB.center.x = (boundingAABB.position_maxx + boundingAABB.position_minx) * 0.5f;
            boundingAABB.center.y = (boundingAABB.position_maxy + boundingAABB.position_miny) * 0.5f;

            isUpdated = true;

            isApply = true;
        }