예제 #1
0
    private void MakeDroppedBlockMesh()
    {
        ClearMeshData();
        BlockData voxel = GameAssets.Instance.items[item.id].blockTypeInfo;

        for (int i = 0; i < 6; i++)
        {
            int faceVertCount = 0;

            for (int j = 0; j < structureData.faces[i].vertData.Length; j++)
            {
                VertData vertData = structureData.faces[i].vertData[j];
                vertices.Add(vertData.vertex);
                normals.Add(structureData.faces[i].normal);
                AddTextures(voxel.GetVoxelFace(i), structureData.faces[i].vertData[j].uv);
                faceVertCount++;
            }
            for (int j = 0; j < structureData.faces[i].triangles.Length; j++)
            {
                transparentTriangles.Add(vertexIndex + structureData.faces[i].triangles[j]);
            }
            vertexIndex += faceVertCount;
        }
        CreateMesh();
    }
예제 #2
0
    public void DrawTriangles(int offset, int count)
    {
        APIVertexBuffer vertexBuffer = APIContext.dataBuffer.vertexBuffer;

        for (int i = offset; i < count;)
        {
            AppData appData = new AppData();

            appData.pos    = vertexBuffer.positions[i];
            appData.pos.w  = 1f;
            appData.color  = vertexBuffer.colors[i];
            appData.uv     = vertexBuffer.uvs[i];
            appData.normal = vertexBuffer.normals[i];
            _VertData0     = _Shader.Vertex(appData);
            i++;

            appData.pos    = vertexBuffer.positions[i];
            appData.pos.w  = 1f;
            appData.color  = vertexBuffer.colors[i];
            appData.uv     = vertexBuffer.uvs[i];
            appData.normal = vertexBuffer.normals[i];
            _VertData1     = _Shader.Vertex(appData);
            i++;

            appData.pos    = vertexBuffer.positions[i];
            appData.pos.w  = 1f;
            appData.color  = vertexBuffer.colors[i];
            appData.uv     = vertexBuffer.uvs[i];
            appData.normal = vertexBuffer.normals[i];
            _VertData2     = _Shader.Vertex(appData);
            i++;

            DrawTriangle();
        }
    }
    public override VertData Vertex(AppData i)
    {
        VertData o = new VertData();

        o.pos    = Matrix4x4.TRS(Vector3.zero, Quaternion.Euler(0, Time.time * 10, 0), Vector3.one).MultiplyVector(i.pos);
        o.uv     = i.uv;
        o.color  = i.color;
        o.normal = i.normal;

        return(o);
    }
예제 #4
0
        public override bool Load(object targetObj)
        {
            apAnimKeyframe keyframe = targetObj as apAnimKeyframe;

            if (keyframe == null)
            {
                return(false);
            }

            keyframe._curveKey      = new apAnimCurve(_animCurve, keyframe._frameIndex);
            keyframe._isKeyValueSet = _isKeyValueSet;

            //keyframe._conSyncValue_Bool = _conSyncValue_Bool;
            keyframe._conSyncValue_Int     = _conSyncValue_Int;
            keyframe._conSyncValue_Float   = _conSyncValue_Float;
            keyframe._conSyncValue_Vector2 = _conSyncValue_Vector2;
            //keyframe._conSyncValue_Vector3 = _conSyncValue_Vector3;
            //keyframe._conSyncValue_Color = _conSyncValue_Color;


            if (keyframe._linkedModMesh_Editor != null)
            {
                apModifiedMesh modMesh = keyframe._linkedModMesh_Editor;

                VertData         vertData = null;
                apModifiedVertex modVert  = null;
                int nVert = _vertices.Count;
                for (int i = 0; i < nVert; i++)
                {
                    vertData = _vertices[i];
                    modVert  = modMesh._vertices.Find(delegate(apModifiedVertex a)
                    {
                        return(a._vertex == vertData._key_Vert);
                    });

                    if (modVert != null)
                    {
                        modVert._deltaPos = vertData._deltaPos;
                    }
                }

                modMesh._transformMatrix.SetMatrix(_transformMatrix);
                modMesh._meshColor = _meshColor;
                modMesh._isVisible = _isVisible;
            }
            else if (keyframe._linkedModBone_Editor != null)
            {
                apModifiedBone modBone = keyframe._linkedModBone_Editor;
                modBone._transformMatrix.SetMatrix(_transformMatrix);
            }

            return(true);
        }
예제 #5
0
            public VertData Clone()
            {
                var vertex = new VertData
                {
                    X  = X,
                    Y  = Y,
                    Z  = Z,
                    Nx = Nx,
                    Ny = Ny,
                    Nz = Nz
                };

                return(vertex);
            }
예제 #6
0
    public void UpdateVoxelMeshData(Vector3 pos)
    {
        int x = Mathf.FloorToInt(pos.x);
        int y = Mathf.FloorToInt(pos.y);
        int z = Mathf.FloorToInt(pos.z);

        VoxelData voxel = chunkData.GetVoxelData(x, y, z);

        for (int i = 0; i < 6; i++)
        {
            VoxelData neighbour = voxel.neighbours[i];

            if (neighbour != null && neighbour.Properties.GetNeighborRendering())
            {
                float lightLevel = neighbour.LightAsFloat;

                int faceVertCount = 0;

                for (int j = 0; j < voxel.Properties.GetVoxelStructure().faces[i].vertData.Length; j++)
                {
                    VertData vertData = voxel.Properties.GetVoxelStructure().faces[i].vertData[j];
                    vertices.Add(pos + vertData.vertex);
                    normals.Add(voxel.Properties.GetVoxelStructure().faces[i].normal);
                    colors.Add(new Color(0, 0, 0, lightLevel));
                    AddTextures(voxel.Properties.GetVoxelFace(i), voxel.Properties.GetVoxelStructure().faces[i].vertData[j].uv);
                    faceVertCount++;
                }

                if (!voxel.Properties.GetNeighborRendering())
                {
                    for (int j = 0; j < voxel.Properties.GetVoxelStructure().faces[i].triangles.Length; j++)
                    {
                        triangles.Add(vertexIndex + voxel.Properties.GetVoxelStructure().faces[i].triangles[j]);
                    }
                }
                else
                {
                    for (int j = 0; j < voxel.Properties.GetVoxelStructure().faces[i].triangles.Length; j++)
                    {
                        transparentTriangles.Add(vertexIndex + voxel.Properties.GetVoxelStructure().faces[i].triangles[j]);
                    }
                }

                vertexIndex += faceVertCount;
            }
        }
    }
예제 #7
0
    private void RasterizeFragment(Vector2 point, int x, int y)
    {
        VertData o = new VertData();

        o.pos   = point;
        o.pos.z = _VertData0.pos.z * _Area1 + _VertData1.pos.z * _Area2 + _VertData2.pos.z * _Area0;

        if (DepthTest(o.pos, x, y))
        {
            APITextureBuffer colorBuffer = APIContext.frameBufferManager.frameBufferTarget.colorBuffer;
            Color            bColor      = colorBuffer.GetPixel(x, y);

            o.uv     = _VertData0.uv * _Area1 + _VertData1.uv * _Area2 + _VertData2.uv * _Area0;
            o.normal = _VertData0.normal * _Area0 + _VertData1.normal * _Area1 + _VertData2.normal * _Area2;
            o.color  = _VertData0.color * _Area1 + _VertData1.color * _Area2 + _VertData2.color * _Area0;

            Color color = _Shader.Fragment(o);

            colorBuffer.SetPixel(x + APIContext.viewport.x, y + APIContext.viewport.y, Color.Lerp(bColor, color, _Alpha));
        }
    }
예제 #8
0
        public override bool Load(object targetObj)
        {
            apModifiedMesh modMesh = targetObj as apModifiedMesh;

            if (modMesh == null)
            {
                return(false);
            }

            int  nVert           = _vertices.Count;
            bool isDifferentVert = false;

            //만약 하나라도 Vert가 변경된게 있으면 좀 오래 걸리는 로직으로 바뀌어야 한다.
            //미리 체크해주자
            if (modMesh._vertices.Count != nVert)
            {
                isDifferentVert = true;
            }
            else
            {
                for (int i = 0; i < nVert; i++)
                {
                    if (_vertices[i]._key_Vert != modMesh._vertices[i]._vertex)
                    {
                        isDifferentVert = true;
                        break;
                    }
                }
            }

            if (isDifferentVert)
            {
                //1. 만약 Vertex 구성이 다르면
                //매번 Find로 찾아서 매칭해야한다.
                VertData         vertData = null;
                apModifiedVertex modVert  = null;
                for (int i = 0; i < nVert; i++)
                {
                    vertData = _vertices[i];
                    modVert  = modMesh._vertices.Find(delegate(apModifiedVertex a)
                    {
                        return(a._vertex == vertData._key_Vert);
                    });

                    if (modVert != null)
                    {
                        modVert._deltaPos = vertData._deltaPos;
                    }
                }
            }
            else
            {
                //2. Vertex 구성이 같으면
                // 그냥 For 돌면서 넣어주자
                VertData         vertData = null;
                apModifiedVertex modVert  = null;
                for (int i = 0; i < nVert; i++)
                {
                    vertData = _vertices[i];
                    modVert  = modMesh._vertices[i];

                    modVert._deltaPos = vertData._deltaPos;
                }
            }

            modMesh._transformMatrix = new apMatrix(_transformMatrix);
            modMesh._meshColor       = _meshColor;
            modMesh._isVisible       = _isVisible;


            //추가 3.29 : ExtraProperty도 복사
            modMesh._isExtraValueEnabled = _isExtraValueEnabled;
            if (modMesh._extraValue == null)
            {
                modMesh._extraValue = new apModifiedMesh.ExtraValue();
                modMesh._extraValue.Init();
            }
            if (_isExtraValueEnabled)
            {
                if (_extraValue != null)
                {
                    modMesh._extraValue._isDepthChanged        = _extraValue._isDepthChanged;
                    modMesh._extraValue._deltaDepth            = _extraValue._deltaDepth;
                    modMesh._extraValue._isTextureChanged      = _extraValue._isTextureChanged;
                    modMesh._extraValue._linkedTextureData     = _extraValue._linkedTextureData;
                    modMesh._extraValue._textureDataID         = _extraValue._textureDataID;
                    modMesh._extraValue._weightCutout          = _extraValue._weightCutout;
                    modMesh._extraValue._weightCutout_AnimPrev = _extraValue._weightCutout_AnimPrev;
                    modMesh._extraValue._weightCutout_AnimNext = _extraValue._weightCutout_AnimNext;
                }
            }
            else
            {
                modMesh._extraValue.Init();
            }


            return(true);
        }
예제 #9
0
        public override bool Load(object targetObj)
        {
            apModifiedMesh modMesh = targetObj as apModifiedMesh;

            if (modMesh == null)
            {
                return(false);
            }

            int  nVert           = _vertices.Count;
            bool isDifferentVert = false;

            //만약 하나라도 Vert가 변경된게 있으면 좀 오래 걸리는 로직으로 바뀌어야 한다.
            //미리 체크해주자
            if (modMesh._vertices.Count != nVert)
            {
                isDifferentVert = true;
            }
            else
            {
                for (int i = 0; i < nVert; i++)
                {
                    if (_vertices[i]._key_Vert != modMesh._vertices[i]._vertex)
                    {
                        isDifferentVert = true;
                        break;
                    }
                }
            }

            if (isDifferentVert)
            {
                //1. 만약 Vertex 구성이 다르면
                //매번 Find로 찾아서 매칭해야한다.
                VertData         vertData = null;
                apModifiedVertex modVert  = null;
                for (int i = 0; i < nVert; i++)
                {
                    vertData = _vertices[i];
                    modVert  = modMesh._vertices.Find(delegate(apModifiedVertex a)
                    {
                        return(a._vertex == vertData._key_Vert);
                    });

                    if (modVert != null)
                    {
                        modVert._deltaPos = vertData._deltaPos;
                    }
                }
            }
            else
            {
                //2. Vertex 구성이 같으면
                // 그냥 For 돌면서 넣어주자
                VertData         vertData = null;
                apModifiedVertex modVert  = null;
                for (int i = 0; i < nVert; i++)
                {
                    vertData = _vertices[i];
                    modVert  = modMesh._vertices[i];

                    modVert._deltaPos = vertData._deltaPos;
                }
            }

            modMesh._transformMatrix = new apMatrix(_transformMatrix);
            modMesh._meshColor       = _meshColor;
            modMesh._isVisible       = _isVisible;

            return(true);
        }
예제 #10
0
        public override bool Load(object targetObj)
        {
            apAnimKeyframe keyframe = targetObj as apAnimKeyframe;

            if (keyframe == null)
            {
                return(false);
            }

            keyframe._curveKey      = new apAnimCurve(_animCurve, keyframe._frameIndex);
            keyframe._isKeyValueSet = _isKeyValueSet;

            //keyframe._conSyncValue_Bool = _conSyncValue_Bool;
            keyframe._conSyncValue_Int     = _conSyncValue_Int;
            keyframe._conSyncValue_Float   = _conSyncValue_Float;
            keyframe._conSyncValue_Vector2 = _conSyncValue_Vector2;
            //keyframe._conSyncValue_Vector3 = _conSyncValue_Vector3;
            //keyframe._conSyncValue_Color = _conSyncValue_Color;


            if (keyframe._linkedModMesh_Editor != null)
            {
                apModifiedMesh modMesh = keyframe._linkedModMesh_Editor;

                VertData         vertData = null;
                apModifiedVertex modVert  = null;
                int nVert = _vertices.Count;
                for (int i = 0; i < nVert; i++)
                {
                    vertData = _vertices[i];
                    modVert  = modMesh._vertices.Find(delegate(apModifiedVertex a)
                    {
                        return(a._vertex == vertData._key_Vert);
                    });

                    if (modVert != null)
                    {
                        modVert._deltaPos = vertData._deltaPos;
                    }
                }

                modMesh._transformMatrix.SetMatrix(_transformMatrix);
                modMesh._meshColor = _meshColor;
                modMesh._isVisible = _isVisible;

                //추가 3.29 : ExtraProperty도 복사
                modMesh._isExtraValueEnabled = _isExtraValueEnabled;
                if (modMesh._extraValue == null)
                {
                    modMesh._extraValue = new apModifiedMesh.ExtraValue();
                    modMesh._extraValue.Init();
                }

                if (_isExtraValueEnabled)
                {
                    if (_extraValue != null)
                    {
                        modMesh._extraValue._isDepthChanged        = _extraValue._isDepthChanged;
                        modMesh._extraValue._deltaDepth            = _extraValue._deltaDepth;
                        modMesh._extraValue._isTextureChanged      = _extraValue._isTextureChanged;
                        modMesh._extraValue._linkedTextureData     = _extraValue._linkedTextureData;
                        modMesh._extraValue._textureDataID         = _extraValue._textureDataID;
                        modMesh._extraValue._weightCutout          = _extraValue._weightCutout;
                        modMesh._extraValue._weightCutout_AnimPrev = _extraValue._weightCutout_AnimPrev;
                        modMesh._extraValue._weightCutout_AnimNext = _extraValue._weightCutout_AnimNext;
                    }
                }
                else
                {
                    modMesh._extraValue.Init();
                }
            }
            else if (keyframe._linkedModBone_Editor != null)
            {
                apModifiedBone modBone = keyframe._linkedModBone_Editor;
                modBone._transformMatrix.SetMatrix(_transformMatrix);
            }


            return(true);
        }
    void UpdateMeshData(Vector3 pos)
    {
        int x = Mathf.FloorToInt(pos.x);
        int y = Mathf.FloorToInt(pos.y);
        int z = Mathf.FloorToInt(pos.z);

        VoxelState voxel = chunkData.map[x, y, z];

        float rot = 0f;

        switch (voxel.orientation)
        {
        case 0:
            rot = 180f;
            break;

        case 5:
            rot = 270f;
            break;

        case 1:
            rot = 0f;
            break;

        default:
            rot = 90f;
            break;
        }

        for (int p = 0; p < 6; p++)
        {
            int translatedP = p;

            if (voxel.orientation != 1)
            {
                if (voxel.orientation == 0)
                {
                    if (p == 0)
                    {
                        translatedP = 1;
                    }
                    else if (p == 1)
                    {
                        translatedP = 0;
                    }
                    else if (p == 4)
                    {
                        translatedP = 5;
                    }
                    else if (p == 5)
                    {
                        translatedP = 4;
                    }
                }
                else if (voxel.orientation == 5)
                {
                    if (p == 0)
                    {
                        translatedP = 5;
                    }
                    else if (p == 1)
                    {
                        translatedP = 4;
                    }
                    else if (p == 4)
                    {
                        translatedP = 0;
                    }
                    else if (p == 5)
                    {
                        translatedP = 1;
                    }
                }
                else if (voxel.orientation == 4)
                {
                    if (p == 0)
                    {
                        translatedP = 4;
                    }
                    else if (p == 1)
                    {
                        translatedP = 5;
                    }
                    else if (p == 4)
                    {
                        translatedP = 1;
                    }
                    else if (p == 5)
                    {
                        translatedP = 0;
                    }
                }
            }

            VoxelState neighbour = chunkData.map[x, y, z].neighbours[translatedP];

            if (neighbour != null && neighbour.properties.renderNeighborFaces && !(voxel.properties.isWater && chunkData.map[x, y + 1, z].properties.isWater))
            {
                float lightLevel    = neighbour.lightAsFloat;
                int   faceVertCount = 0;

                for (int i = 0; i < voxel.properties.meshData.faces[p].vertData.Length; i++)
                {
                    VertData vertData = voxel.properties.meshData.faces[p].GetVertData(i);
                    vertices.Add(pos + vertData.GetRotatedPosition(new Vector3(0, rot, 0)));
                    normals.Add(VoxelData.faceChecks[p]);
                    colors.Add(new Color(0, 0, 0, lightLevel));
                    if (voxel.properties.isWater)
                    {
                        uvs.Add(voxel.properties.meshData.faces[p].vertData[i].uv);
                    }
                    else
                    {
                        AddTexture(voxel.properties.GetTextureID(p), vertData.uv);
                    }
                    faceVertCount++;
                }

                if (!voxel.properties.renderNeighborFaces)
                {
                    for (int i = 0; i < voxel.properties.meshData.faces[p].triangles.Length; i++)
                    {
                        triangles.Add(vertexIndex + voxel.properties.meshData.faces[p].triangles[i]);
                    }
                }
                else
                {
                    if (voxel.properties.isWater)
                    {
                        for (int i = 0; i < voxel.properties.meshData.faces[p].triangles.Length; i++)
                        {
                            waterTriangles.Add(vertexIndex + voxel.properties.meshData.faces[p].triangles[i]);
                        }
                    }
                    else
                    {
                        for (int i = 0; i < voxel.properties.meshData.faces[p].triangles.Length; i++)
                        {
                            transparentTriangles.Add(vertexIndex + voxel.properties.meshData.faces[p].triangles[i]);
                        }
                    }
                }

                vertexIndex += faceVertCount;
            }
        }
    }
예제 #12
0
 /// <summary>
 /// Gets a specific index when given a vertex number and the index type
 /// </summary>
 /// <param name="vert">Vertex number (0, 1, or 2)</param>
 /// <param name="type">Type of the index to get</param>
 /// <returns></returns>
 public int this[int vert, VertData type]
 {
     get { return(_indices[vert, (int)type]); }
 }
예제 #13
0
    void UpdateMeshData(Vector3 pos)
    {
        int x = Mathf.FloorToInt(pos.x);
        int y = Mathf.FloorToInt(pos.y);
        int z = Mathf.FloorToInt(pos.z);

        byte       blockID = chunkData.map[x, y, z].id;
        VoxelState voxel   = chunkData.map[x, y, z];

        float rotation = 0;

        switch (chunkData.map[x, y, z].orientation)
        {
        case 0:
            rotation = 180f;
            break;

        case 5:
            rotation = 270f;
            break;

        case 1:
            rotation = 0f;
            break;

        default:
            rotation = 90f;
            break;
        }

        for (int p = 0; p < 6; p++)
        {
            int translatedP = p;
            if (voxel.orientation != 1)
            {
                if (voxel.orientation == 0)
                {
                    if (p == 0)
                    {
                        translatedP = 1;
                    }
                    else if (p == 1)
                    {
                        translatedP = 0;
                    }
                    else if (p == 4)
                    {
                        translatedP = 5;
                    }
                    else if (p == 5)
                    {
                        translatedP = 4;
                    }
                }
                else if (voxel.orientation == 5)
                {
                    if (p == 0)
                    {
                        translatedP = 5;
                    }
                    else if (p == 1)
                    {
                        translatedP = 4;
                    }
                    else if (p == 4)
                    {
                        translatedP = 0;
                    }
                    else if (p == 5)
                    {
                        translatedP = 1;
                    }
                }
                else if (voxel.orientation == 4)
                {
                    if (p == 0)
                    {
                        translatedP = 4;
                    }
                    else if (p == 1)
                    {
                        translatedP = 5;
                    }
                    else if (p == 4)
                    {
                        translatedP = 1;
                    }
                    else if (p == 5)
                    {
                        translatedP = 0;
                    }
                }
            }

            VoxelState neighbor = CheckVoxel(pos + VoxelData.faceChecks[translatedP]);

            if (neighbor != null && World.Instance.blocktypes[neighbor.id].renderNeighborFaces)
            {
                int faceVertCount = 0;

                for (int i = 0; i < World.Instance.blocktypes[blockID].meshData.faces[p].vertData.Length; i++)
                {
                    VertData vertData = World.Instance.blocktypes[blockID].meshData.faces[p].GetVertData(i);
                    vertices.Add(pos + vertData.GetRotatedPosition(new Vector3(0, rotation, 0)));
                    normals.Add(VoxelData.faceChecks[p]);
                    colors.Add(new Color(0, 0, 0, 255));
                    AddTexture(World.Instance.blocktypes[blockID].GetTextureID(p), vertData.uv);
                    faceVertCount++;
                }

                if (!World.Instance.blocktypes[blockID].renderNeighborFaces)
                {
                    for (int i = 0; i < World.Instance.blocktypes[blockID].meshData.faces[p].triangles.Length; i++)
                    {
                        triangles.Add(vertexIndex + World.Instance.blocktypes[blockID].meshData.faces[p].triangles[i]);
                    }
                }
                else
                {
                    for (int i = 0; i < World.Instance.blocktypes[blockID].meshData.faces[p].triangles.Length; i++)
                    {
                        transparentTriangles.Add(vertexIndex + World.Instance.blocktypes[blockID].meshData.faces[p].triangles[i]);
                    }
                }

                vertexIndex += faceVertCount;
            }
        }
    }
예제 #14
0
파일: Model.cs 프로젝트: alexturpin/Zombles
 /// <summary>
 /// Gets a specific index when given a vertex number and the index type
 /// </summary>
 /// <param name="vert">Vertex number (0, 1, or 2)</param>
 /// <param name="type">Type of the index to get</param>
 /// <returns></returns>
 public int this[int vert, VertData type]
 {
     get { return _indices[vert, (int) type]; }
 }
    public override Color Fragment(VertData i)
    {
        float att = Vector3.Dot(i.normal, new Vector3(0, -1f, 0));

        return(att * APIMath.Tex2D(mainTexture, i.uv));
    }
예제 #16
0
 public abstract Color Fragment(VertData i);