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(); }
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); }
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); }
public VertData Clone() { var vertex = new VertData { X = X, Y = Y, Z = Z, Nx = Nx, Ny = Ny, Nz = Nz }; return(vertex); }
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; } } }
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)); } }
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); }
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); }
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; } } }
/// <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]); } }
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; } } }
/// <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)); }
public abstract Color Fragment(VertData i);