Пример #1
0
    public void CreateSurroundings(ConfigSurroundings configSurroundings)
    {
        if (configSurroundings.surroundingMaterial >= 0)
        {
            float SURROUNDING_PLANE_SIZE  = 1000.0f;
            float SURROUNDING_PLANE_SCALE = 10.0f;

            float surroundingLevel = configSurroundings.surroundingLevel.EvaluateInt(gameManagerUnity.world);
            surroundingLevel += configSurroundings.surroundingOffsetY;

            CubeWorld.World.CubeWorld world = gameManagerUnity.world;

            goContainer      = new GameObject();
            goContainer.name = "Surroundings";
            goContainer.transform.position   = new Vector3(0, 0, 0);
            goContainer.transform.rotation   = Quaternion.identity;
            goContainer.transform.localScale = new Vector3(1, 1, 1);

            GameObject goPlane1 = GameObject.CreatePrimitive(PrimitiveType.Plane);
            goPlane1.name             = "A1";
            goPlane1.transform.parent = goContainer.transform;
            GameObject goPlane2 = GameObject.CreatePrimitive(PrimitiveType.Plane);
            goPlane2.name             = "A2";
            goPlane2.transform.parent = goContainer.transform;
            GameObject goPlane3 = GameObject.CreatePrimitive(PrimitiveType.Plane);
            goPlane3.name             = "A3";
            goPlane3.transform.parent = goContainer.transform;
            GameObject goPlane4 = GameObject.CreatePrimitive(PrimitiveType.Plane);
            goPlane4.name             = "A4";
            goPlane4.transform.parent = goContainer.transform;

            goPlane1.renderer.material = new Material(materialSurrounding);
            goPlane2.renderer.material = new Material(materialSurrounding);
            goPlane3.renderer.material = new Material(materialSurrounding);
            goPlane4.renderer.material = new Material(materialSurrounding);

            Texture2D surroundingTexture = GraphicsUnity.GetTilesetTexture((Texture2D)gameManagerUnity.materialTransparent.mainTexture, configSurroundings.surroundingMaterial);
            surroundingTexture.wrapMode = TextureWrapMode.Repeat;

            goPlane1.renderer.material.mainTexture = surroundingTexture;
            goPlane2.renderer.material.mainTexture = surroundingTexture;
            goPlane3.renderer.material.mainTexture = surroundingTexture;
            goPlane4.renderer.material.mainTexture = surroundingTexture;

            goPlane1.transform.localScale = new Vector3(world.sizeX / SURROUNDING_PLANE_SCALE, 0, SURROUNDING_PLANE_SIZE / SURROUNDING_PLANE_SCALE);
            goPlane1.transform.position   = new Vector3(world.sizeX / 2.0f - 0.5f, surroundingLevel - 0.5f, -SURROUNDING_PLANE_SIZE / 2.0f - 0.5f);
            goPlane1.renderer.material.mainTextureScale = new Vector2(goPlane1.transform.localScale.x * SURROUNDING_PLANE_SCALE, goPlane1.transform.localScale.z * SURROUNDING_PLANE_SCALE);

            goPlane2.transform.localScale = new Vector3(world.sizeX / SURROUNDING_PLANE_SCALE, 0, SURROUNDING_PLANE_SIZE / SURROUNDING_PLANE_SCALE);
            goPlane2.transform.position   = new Vector3(world.sizeX / 2.0f - 0.5f, surroundingLevel - 0.5f, world.sizeZ - 0.5f + SURROUNDING_PLANE_SIZE / 2.0f);
            goPlane2.renderer.material.mainTextureScale = new Vector2(goPlane2.transform.localScale.x * SURROUNDING_PLANE_SCALE, goPlane2.transform.localScale.z * SURROUNDING_PLANE_SCALE);

            goPlane3.transform.localScale = new Vector3(SURROUNDING_PLANE_SIZE / SURROUNDING_PLANE_SCALE, 0, SURROUNDING_PLANE_SIZE / SURROUNDING_PLANE_SCALE * 2.0f + world.sizeX / SURROUNDING_PLANE_SCALE);
            goPlane3.transform.position   = new Vector3(world.sizeX + SURROUNDING_PLANE_SIZE / 2.0f - 0.5f, surroundingLevel - 0.5f, world.sizeZ / 2.0f - 0.5f);
            goPlane3.renderer.material.mainTextureScale = new Vector2(goPlane3.transform.localScale.x * SURROUNDING_PLANE_SCALE, goPlane3.transform.localScale.z * SURROUNDING_PLANE_SCALE);

            goPlane4.transform.localScale = new Vector3(SURROUNDING_PLANE_SIZE / SURROUNDING_PLANE_SCALE, 0, SURROUNDING_PLANE_SIZE / SURROUNDING_PLANE_SCALE * 2.0f + world.sizeX / SURROUNDING_PLANE_SCALE);
            goPlane4.transform.position   = new Vector3(-SURROUNDING_PLANE_SIZE / 2.0f - 0.5f, surroundingLevel - 0.5f, world.sizeZ / 2.0f - 0.5f);
            goPlane4.renderer.material.mainTextureScale = new Vector2(goPlane4.transform.localScale.x * SURROUNDING_PLANE_SCALE, goPlane4.transform.localScale.z * SURROUNDING_PLANE_SCALE);

            goSurroundings.Add(goPlane1);
            goSurroundings.Add(goPlane2);
            goSurroundings.Add(goPlane3);
            goSurroundings.Add(goPlane4);
        }
    }
Пример #2
0
    public void UpdateMesh()
    {
        if (visibleByPlayer == false)
        {
            willRequireMeshUpdate = true;
            return;
        }

        mesh.Clear();

        CubeWorld.World.CubeWorld world = gameManagerUnity.world;
        TileManager tileManager         = world.tileManager;

        colors.Clear();
        vertices.Clear();
        uvs.Clear();
        uvs2.Clear();
        normals.Clear();
        trianglesNormal.Clear();
        trianglesTransparent.Clear();
        trianglesTranslucid.Clear();
        trianglesDamage.Clear();
        trianglesAnimated.Clear();

        int   index   = 0;
        float uvdelta = 1.0f / GraphicsUnity.TILE_PER_MATERIAL_ROW;

        int tileOffsetX = sector.tileOffset.x;
        int tileOffsetY = sector.tileOffset.y;
        int tileOffsetZ = sector.tileOffset.z;

        float ambientLightIntensity = MeshUtils.luminanceMapper[world.dayCycleManager.ambientLightLuminance];

        totalAmbientLuminance = 0;

        for (int z = tileOffsetZ; z < SectorManager.SECTOR_SIZE + tileOffsetZ; z++)
        {
            for (int y = tileOffsetY; y < SectorManager.SECTOR_SIZE + tileOffsetY; y++)
            {
                for (int x = tileOffsetX; x < SectorManager.SECTOR_SIZE + tileOffsetX; x++)
                {
                    TilePosition pos = new TilePosition(x, y, z);

                    Tile tile = tileManager.GetTile(pos);

                    totalAmbientLuminance += tile.AmbientLuminance;

                    if (tile.tileType == TileDefinition.EMPTY_TILE_TYPE || tile.Dynamic)
                    {
                        continue;
                    }

                    Vector3 offset = GraphicsUnity.TilePositionToVector3(x - tileOffsetX, y - tileOffsetY, z - tileOffsetZ);

                    TileDefinition tileDefinition = tileManager.GetTileDefinition(tile.tileType);

                    List <int> triangles;
                    Vector3[]  faceVectors = MeshUtils.faceVectorsNormal;

                    TileDefinition.DrawMode drawMode = tileDefinition.drawMode;

                    if (drawMode == TileDefinition.DrawMode.SOLID ||
                        drawMode == TileDefinition.DrawMode.LIQUID && tileDefinition.solid)
                    {
                        if (tile.Energy == tileDefinition.energy)
                        {
                            triangles = trianglesNormal;
                        }
                        else
                        {
                            triangles = trianglesDamage;
                        }
                    }
                    else if (drawMode == TileDefinition.DrawMode.SOLID_ALPHA)
                    {
                        triangles = trianglesTranslucid;
                    }
                    else
                    {
                        triangles = trianglesTransparent;
                    }

                    if (tileDefinition.animated)
                    {
                        triangles = trianglesAnimated;
                    }

                    bool drawingLiquidSurface = false;

                    if (drawMode == TileDefinition.DrawMode.LIQUID &&
                        tileManager.IsValidTile(pos + new TilePosition(0, 1, 0)) &&
                        tileManager.GetTileType(pos + new TilePosition(0, 1, 0)) != tile.tileType)
                    {
                        drawingLiquidSurface = true;
                    }

                    float[] liquidVertexHeights = null;

                    for (int face = 0; face < 6; face++)
                    {
                        int material = tileDefinition.materials[face];

                        if (material < 0)
                        {
                            continue;
                        }

                        TileDefinition.DrawMode nearTileDrawMode = TileDefinition.DrawMode.NONE;
                        TilePosition            normalInt        = MeshUtils.faceNormalsTile[face];
                        TilePosition            near             = pos + normalInt;

                        if (tileManager.IsValidTile(near))
                        {
                            nearTileDrawMode = tileManager.GetTileDrawMode(near);
                            bool nearDynamic = tileManager.GetTileDynamic(near);

                            TilePosition nearAbove = near + new TilePosition(0, 1, 0);

                            bool drawingLiquidSurfaceBorder = (drawMode == nearTileDrawMode &&
                                                               drawMode == TileDefinition.DrawMode.LIQUID &&
                                                               drawingLiquidSurface == false &&
                                                               tileManager.IsValidTile(nearAbove) &&
                                                               tileManager.GetTileType(nearAbove) != tile.tileType &&
                                                               face != (int)CubeWorld.Utils.Graphics.Faces.Top &&
                                                               face != (int)CubeWorld.Utils.Graphics.Faces.Bottom);

                            if (drawMode != nearTileDrawMode ||
                                drawMode == TileDefinition.DrawMode.SOLID_ALPHA ||
                                nearDynamic ||
                                drawingLiquidSurfaceBorder)
                            {
                                float lightIntensity = ambientLightIntensity *
                                                       MeshUtils.luminanceMapper[tileManager.GetTileAmbientLuminance(near)] +
                                                       MeshUtils.luminanceMapper[tileManager.GetTileLightSourceLuminance(near)];

                                if (lightIntensity > 1.0f)
                                {
                                    lightIntensity = 1.0f;
                                }

                                Color faceColor = new Color(lightIntensity * MeshUtils.faceBright[face],
                                                            lightIntensity * MeshUtils.faceBright[face],
                                                            lightIntensity * MeshUtils.faceBright[face]);
                                Vector3 faceNormal = MeshUtils.faceNormals[face];

                                if (tile.OnFire && MeshUtils.faceVectorsFireAvailable[face])
                                {
                                    for (int i = 0; i < 4; i++)
                                    {
                                        vertices.Add(MeshUtils.faceVectorsFire[(face << 2) + i] + offset);
                                        normals.Add(faceNormal);
                                        colors.Add(faceColor);
                                    }

                                    trianglesTranslucid.Add(index + 0);
                                    trianglesTranslucid.Add(index + 1);
                                    trianglesTranslucid.Add(index + 2);

                                    trianglesTranslucid.Add(index + 2);
                                    trianglesTranslucid.Add(index + 3);
                                    trianglesTranslucid.Add(index + 0);

                                    int fireMaterial = gameManagerUnity.extraMaterials.fireMaterials[(x + y + z) % gameManagerUnity.extraMaterials.fireMaterials.Length];

                                    float uvxFire = uvdelta * (fireMaterial % GraphicsUnity.TILE_PER_MATERIAL_ROW);
                                    float uvyFire = 1.0f - uvdelta * (fireMaterial / GraphicsUnity.TILE_PER_MATERIAL_ROW);

                                    uvs.Add(new Vector2(uvxFire, uvyFire - uvdelta));
                                    uvs.Add(new Vector2(uvxFire, uvyFire));
                                    uvs.Add(new Vector2(uvxFire + uvdelta, uvyFire));
                                    uvs.Add(new Vector2(uvxFire + uvdelta, uvyFire - uvdelta));

                                    uvs2.Add(Vector2.zero);
                                    uvs2.Add(Vector2.zero);
                                    uvs2.Add(Vector2.zero);
                                    uvs2.Add(Vector2.zero);

                                    index += 4;
                                }

                                if ((drawingLiquidSurface || drawingLiquidSurfaceBorder) && liquidVertexHeights == null)
                                {
                                    liquidVertexHeights = GetLiquidVertexHeights(tileManager, pos, tile);
                                }

                                for (int i = 0; i < 4; i++)
                                {
                                    if (drawingLiquidSurface || drawingLiquidSurfaceBorder)
                                    {
                                        Vector3 liquidVertex = faceVectors[(face << 2) + i];

                                        if (drawingLiquidSurface && liquidVertex.y == CubeWorld.Utils.Graphics.HALF_TILE_SIZE ||
                                            drawingLiquidSurfaceBorder && liquidVertex.y == -CubeWorld.Utils.Graphics.HALF_TILE_SIZE)
                                        {
                                            if (liquidVertex.x == CubeWorld.Utils.Graphics.HALF_TILE_SIZE)
                                            {
                                                //x = 1
                                                if (liquidVertex.z == CubeWorld.Utils.Graphics.HALF_TILE_SIZE)
                                                {
                                                    //z = 1
                                                    liquidVertex.y = liquidVertexHeights[0];
                                                }
                                                else
                                                {
                                                    //z = -1
                                                    liquidVertex.y = liquidVertexHeights[1];
                                                }
                                            }
                                            else
                                            {
                                                //x = -1
                                                if (liquidVertex.z == CubeWorld.Utils.Graphics.HALF_TILE_SIZE)
                                                {
                                                    //z = 1
                                                    liquidVertex.y = liquidVertexHeights[3];
                                                }
                                                else
                                                {
                                                    //z = -1
                                                    liquidVertex.y = liquidVertexHeights[2];
                                                }
                                            }
                                        }

                                        vertices.Add(liquidVertex + offset);
                                    }
                                    else
                                    {
                                        vertices.Add(faceVectors[(face << 2) + i] + offset);
                                    }

                                    normals.Add(faceNormal);
                                    colors.Add(faceColor);
                                }

                                triangles.Add(index + 0);
                                triangles.Add(index + 1);
                                triangles.Add(index + 2);

                                triangles.Add(index + 2);
                                triangles.Add(index + 3);
                                triangles.Add(index + 0);

                                float uvx = uvdelta * (material % GraphicsUnity.TILE_PER_MATERIAL_ROW);
                                float uvy = 1.0f - uvdelta * (material / GraphicsUnity.TILE_PER_MATERIAL_ROW);

                                uvs.Add(new Vector2(uvx, uvy - uvdelta));
                                uvs.Add(new Vector2(uvx, uvy));
                                uvs.Add(new Vector2(uvx + uvdelta, uvy));
                                uvs.Add(new Vector2(uvx + uvdelta, uvy - uvdelta));

                                if (drawMode == TileDefinition.DrawMode.SOLID && tile.Energy < tileDefinition.energy)
                                {
                                    int materialDamageIndex = ((tileDefinition.energy - tile.Energy) * gameManagerUnity.extraMaterials.damageMaterials.Length) / tileDefinition.energy;
                                    if (materialDamageIndex >= gameManagerUnity.extraMaterials.damageMaterials.Length)
                                    {
                                        materialDamageIndex = gameManagerUnity.extraMaterials.damageMaterials.Length - 1;
                                    }

                                    int materialDamage = gameManagerUnity.extraMaterials.damageMaterials[materialDamageIndex];

                                    uvx = uvdelta * (materialDamage % GraphicsUnity.TILE_PER_MATERIAL_ROW);
                                    uvy = 1.0f - uvdelta * (materialDamage / GraphicsUnity.TILE_PER_MATERIAL_ROW);

                                    uvs2.Add(new Vector2(uvx, uvy - uvdelta));
                                    uvs2.Add(new Vector2(uvx, uvy));
                                    uvs2.Add(new Vector2(uvx + uvdelta, uvy));
                                    uvs2.Add(new Vector2(uvx + uvdelta, uvy - uvdelta));
                                }
                                else
                                {
                                    uvs2.Add(Vector2.zero);
                                    uvs2.Add(Vector2.zero);
                                    uvs2.Add(Vector2.zero);
                                    uvs2.Add(Vector2.zero);
                                }

                                index += 4;
                            }
                        }
                    }
                }
            }
        }

        mesh.vertices     = vertices.ToArray();
        mesh.colors       = colors.ToArray();
        mesh.normals      = normals.ToArray();
        mesh.uv           = uvs.ToArray();
        mesh.uv2          = uvs2.ToArray();
        mesh.subMeshCount = 4;

        mesh.bounds = new Bounds(new Vector3(SectorManager.SECTOR_SIZE / 2, SectorManager.SECTOR_SIZE / 2, SectorManager.SECTOR_SIZE / 2), new Vector3(SectorManager.SECTOR_SIZE + 1, SectorManager.SECTOR_SIZE + 1, SectorManager.SECTOR_SIZE + 1));

        List <Material> materials = new List <Material>();

        if (trianglesNormal.Count > 0)
        {
            materials.Add(gameManagerUnity.material);
        }

        if (trianglesTranslucid.Count > 0)
        {
            materials.Add(gameManagerUnity.materialTranslucid);
        }

        if (trianglesTransparent.Count > 0)
        {
            materials.Add(gameManagerUnity.materialTransparent);
        }

        if (trianglesDamage.Count > 0)
        {
            materials.Add(gameManagerUnity.materialDamaged);
        }

        if (trianglesAnimated.Count > 0)
        {
            materials.Add(gameManagerUnity.materialLiquidAnimated);
        }

        meshRenderer.sharedMaterials = materials.ToArray();

        int trianglesGroupIndex = 0;

        if (trianglesNormal.Count > 0)
        {
            mesh.SetTriangles(trianglesNormal.ToArray(), trianglesGroupIndex++);
        }
        if (trianglesTranslucid.Count > 0)
        {
            mesh.SetTriangles(trianglesTranslucid.ToArray(), trianglesGroupIndex++);
        }
        if (trianglesTransparent.Count > 0)
        {
            mesh.SetTriangles(trianglesTransparent.ToArray(), trianglesGroupIndex++);
        }
        if (trianglesDamage.Count > 0)
        {
            mesh.SetTriangles(trianglesDamage.ToArray(), trianglesGroupIndex++);
        }
        if (trianglesAnimated.Count > 0)
        {
            mesh.SetTriangles(trianglesAnimated.ToArray(), trianglesGroupIndex++);
        }

        willRequireMeshUpdate  = false;
        willRequireLightUpdate = false;
    }
Пример #3
0
    public virtual void Start()
    {
        Vector3 sizeInTiles = GraphicsUnity.TilePositionToVector3(((AvatarDefinition)avatar.definition).sizeInTiles);

        //float halfX = sizeInTiles.x / 2.0f;
        float halfY = sizeInTiles.y / 2.0f;

        //float halfZ = sizeInTiles.z / 2.0f;

        body                         = new GameObject();
        body.name                    = "Body";
        body.transform.parent        = transform;
        body.transform.localPosition = new Vector3(
            0,
            halfY - CubeWorld.Utils.Graphics.HALF_TILE_SIZE,
            0);

        body.transform.localRotation = Quaternion.identity;
        body.transform.localScale    = new Vector3(1, 1, 1);

        foreach (AvatarPartDefinition avatarPart in ((AvatarDefinition)avatar.definition).parts)
        {
            Vector3 offset = new Vector3(
                avatarPart.offset.x,
                avatarPart.offset.y,
                avatarPart.offset.z);

            Vector3 rotation = GraphicsUnity.CubeWorldVector3ToVector3(avatarPart.rotation);

            GameObject goPart = new GameObject();
            goPart.name                    = avatarPart.id;
            goPart.transform.parent        = body.transform;
            goPart.transform.localPosition = offset;
            goPart.transform.localRotation = Quaternion.Euler(rotation);
            goPart.transform.localScale    = new Vector3(1, 1, 1);

            VisualDefinitionRenderUnity visualDefinitionRenderer = goPart.AddComponent <VisualDefinitionRenderUnity>();
            visualDefinitionRenderer.world            = gameManagerUnity.world;
            visualDefinitionRenderer.material         = gameManagerUnity.materialItems;
            visualDefinitionRenderer.visualDefinition = avatarPart.visualDefinition;

            switch (avatarPart.id)
            {
            case "head":
                heads.Add(goPart);
                break;

            case "arm":
                arms.Add(goPart);
                break;

            case "leg":
                legs.Add(goPart);
                break;
            }

            goPart.GetComponent <Renderer>().enabled = bodyRenderEnabled;

            parts.Add(goPart);
        }
    }
Пример #4
0
    private void UpdateUserActions()
    {
        if (playerUnity.gameManagerUnity.State == GameManagerUnity.GameManagerUnityState.GAME ||
            playerUnity.gameManagerUnity.State == GameManagerUnity.GameManagerUnityState.PAUSE)
        {
            Vector3 cameraPos = playerUnity.transform.position + playerUnity.GetLocalHeadPosition();
            Vector3 cameraFwd = playerUnity.mainCamera.transform.forward;

            CubeWorld.Utils.Graphics.RaycastTileResult raycastResult = CubeWorld.Utils.Graphics.RaycastTile(
                playerUnity.player.world,
                GraphicsUnity.Vector3ToCubeWorldVector3(cameraPos),
                GraphicsUnity.Vector3ToCubeWorldVector3(cameraFwd),
                10.0f,
                true, false);

            if (userActionCooldown > 0.0f)
            {
                userActionCooldown -= Time.deltaTime;
            }

            if (userActionCooldown <= 0.0f)
            {
                if (Input.GetMouseButton(0) || Input.GetMouseButton(1))
                {
                    ExecuteHandUseAnimation();

                    userActionCooldown = 0.2f;
                }

                if (raycastResult.hit)
                {
                    if (Input.GetMouseButton(0))
                    {
                        if (raycastResult.position.x > 0 && raycastResult.position.x < playerUnity.player.world.tileManager.sizeX - 1 &&
                            raycastResult.position.z > 0 && raycastResult.position.z < playerUnity.player.world.tileManager.sizeZ - 1 &&
                            raycastResult.position.y > 0)
                        {
                            if (playerUnity.player.world.tileManager.HasTileActions(
                                    raycastResult.position,
                                    TileActionRule.ActionType.CLICKED))
                            {
                                playerUnity.player.world.gameplay.TileClicked(raycastResult.position);
                            }
                            else
                            {
                                if (playerUnity.objectInHand != null)
                                {
                                    switch (playerUnity.objectInHand.definition.type)
                                    {
                                    case CWDefinition.DefinitionType.Item:
                                    {
                                        playerUnity.gameManagerUnity.fxManagerUnity.PlaySound("hitmetal", playerUnity.player.position);
                                        playerUnity.player.world.gameplay.TileHit(raycastResult.position, ((Item)playerUnity.objectInHand).itemDefinition);
                                        break;
                                    }

                                    default:
                                        playerUnity.gameManagerUnity.fxManagerUnity.PlaySound("hit", playerUnity.player.position);
                                        playerUnity.player.world.tileManager.DamageTile(raycastResult.position, 1);
                                        break;
                                    }
                                }
                            }
                        }
                    }
                    else if (Input.GetMouseButton(1))
                    {
                        if (playerUnity.objectInHand != null && playerUnity.objectInHand.definition.type == CWDefinition.DefinitionType.Tile)
                        {
                            TileDefinition tileDefinition     = (TileDefinition)playerUnity.objectInHand.definition;
                            TilePosition   tileCreatePosition = raycastResult.position + CubeWorld.Utils.Graphics.GetFaceNormal(raycastResult.face);

                            //Don't create tile on top of the world, because no triangles are drawn on the border!
                            if (tileCreatePosition.y < playerUnity.player.world.tileManager.sizeY - 1 &&
                                playerUnity.player.world.tileManager.IsValidTile(tileCreatePosition) &&
                                playerUnity.player.world.tileManager.GetTileSolid(tileCreatePosition) == false)
                            {
                                if (playerUnity.player.world.avatarManager.IsTileBlockedByAnyAvatar(tileCreatePosition) == false)
                                {
                                    playerUnity.player.world.gameplay.CreateTile(tileCreatePosition, tileDefinition.tileType);

                                    playerUnity.player.inventory.RemoveFromDefinition(tileDefinition, 1);

                                    if (playerUnity.player.inventory.HasMoreOfDefinition(tileDefinition) == false)
                                    {
                                        playerUnity.objectInHand = null;
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }