private static void ApplyTransformFix(FMDL fmdl, FSHP m, SF.Shader shader) { Matrix4 idenity = Matrix4.Identity; shader.SetInt("NoSkinning", 0); shader.SetInt("RigidSkinning", 0); shader.SetInt("SingleBoneIndex", m.BoneIndex); shader.SetMatrix4x4("SingleBoneBindTransform", ref idenity); //Some objects will have no weights or indices. These will weigh to the bone index in the shape section. if (m.VertexSkinCount == 1) { shader.SetInt("RigidSkinning", 1); } if (m.VertexSkinCount == 0) { if (fmdl.Skeleton.bones.Count > 0) { Matrix4 transform = fmdl.Skeleton.bones[m.BoneIndex].invert * fmdl.Skeleton.bones[m.BoneIndex].Transform; shader.SetMatrix4x4("SingleBoneBindTransform", ref transform); shader.SetInt("NoSkinning", 1); } } }
public override void Draw(GL_ControlModern control, Pass pass, EditorSceneBase editorScene) { CheckBuffers(); if (!Runtime.OpenTKInitialized || !Runtime.renderBones || !Visible) { return; } SF.Shader shader = OpenTKSharedResources.shaders["BONE"]; shader.UseProgram(); GL.Disable(EnableCap.CullFace); if (Runtime.boneXrayDisplay) { GL.Disable(EnableCap.DepthTest); } if (Runtime.renderBoundingBoxes) { DrawBoundingBoxes(); } control.UpdateModelMatrix( Matrix4.CreateScale(Runtime.previewScale * PreviewScale) * Matrix4.CreateTranslation(Selected ? editorScene.CurrentAction.NewPos(position) : position)); shader.EnableVertexAttributes(); shader.SetMatrix4x4("rotation", ref prismRotation); Matrix4 camMat = control.CameraMatrix; Matrix4 mdlMat = control.ModelMatrix; Matrix4 projMat = control.ProjectionMatrix; Matrix4 computedCamMtx = camMat * projMat; shader.SetMatrix4x4("mtxCam", ref computedCamMtx); shader.SetMatrix4x4("mtxMdl", ref mdlMat); foreach (STBone bn in bones) { if (!bn.Checked) { continue; } shader.SetVector4("boneColor", ColorUtility.ToVector4(boneColor)); shader.SetFloat("scale", Runtime.bonePointSize * BonePointScale); shader.SetMatrix4x4("ModelMatrix", ref bn.ModelMatrix); Matrix4 transform = bn.Transform; shader.SetMatrix4x4("bone", ref transform); shader.SetInt("hasParent", bn.parentIndex != -1 ? 1 : 0); if (bn.parentIndex != -1) { var transformParent = ((STBone)bn.Parent).Transform; shader.SetMatrix4x4("parent", ref transformParent); } Draw(shader); if (Runtime.SelectedBoneIndex == bn.GetIndex()) { shader.SetVector4("boneColor", ColorUtility.ToVector4(selectedBoneColor)); } shader.SetInt("hasParent", 0); Draw(shader); } shader.DisableVertexAttributes(); GL.UseProgram(0); GL.Enable(EnableCap.CullFace); GL.Enable(EnableCap.DepthTest); }
private void DrawBfres(GL_ControlModern control, Pass pass) { if (!Runtime.OpenTKInitialized || pass == Pass.TRANSPARENT || Disposing) { return; } bool buffersWereInitialized = ibo_elements != 0 && vbo_position != 0; if (!buffersWereInitialized) { GenerateBuffers(); } if (Hovered == true) { throw new Exception("model selected"); } //Temporarily revert to using this shader system as it is easy to port back //This is much quicker. Will change after shaders are handled faster SF.Shader shader = OpenTKSharedResources.shaders["BFRES"]; if (Runtime.EnablePBR) { shader = OpenTKSharedResources.shaders["BFRES_PBR"]; } if (models.Count > 0) { if (models[0].shapes.Count > 0) { if (models[0].shapes[0].GetFMAT().shaderassign.ShaderModel == "uking_mat") { shader = OpenTKSharedResources.shaders["BFRES_Botw"]; //Botw uses small models so lower the bone size Runtime.bonePointSize = 0.040f; } } } if (Runtime.viewportShading != Runtime.ViewportShading.Default) { shader = OpenTKSharedResources.shaders["BFRES_Debug"]; } if (Runtime.viewportShading == Runtime.ViewportShading.Lighting && Runtime.EnablePBR) { shader = OpenTKSharedResources.shaders["BFRES_PBR"]; } shader.UseProgram(); control.UpdateModelMatrix(ModelTransform * Matrix4.CreateScale(Runtime.previewScale)); Matrix4 camMat = control.CameraMatrix; Matrix4 mdlMat = control.ModelMatrix; Matrix4 projMat = control.ProjectionMatrix; Matrix4 computedCamMtx = camMat * projMat; Matrix4 mvpMat = control.ModelMatrix * control.CameraMatrix * control.ProjectionMatrix; Matrix4 sphereMatrix = mvpMat; Matrix4 invertedCamera = Matrix4.Identity; // invertedCamera = mvpMat.Inverted(); // if (invertedCamera.Determinant == 0) // invertedCamera = Matrix4.Identity; sphereMatrix = invertedCamera; sphereMatrix.Transpose(); invertedCamera = mvpMat.Inverted(); Vector3 lightDirection = new Vector3(0f, 0f, -1f); shader.SetVector3("specLightDirection", Vector3.TransformNormal(lightDirection, invertedCamera).Normalized()); shader.SetVector3("difLightDirection", Vector3.TransformNormal(lightDirection, invertedCamera).Normalized()); shader.SetMatrix4x4("sphereMatrix", ref sphereMatrix); shader.SetMatrix4x4("mtxCam", ref computedCamMtx); shader.SetMatrix4x4("mtxMdl", ref mdlMat); shader.SetVector3("cameraPosition", control.CameraPosition); Vector4 pickingColor = control.NextPickingColor(); shader.SetVector3("difLightColor", new Vector3(1)); shader.SetVector3("ambLightColor", new Vector3(1)); GL.Enable(EnableCap.AlphaTest); GL.AlphaFunc(AlphaFunction.Gequal, 0.1f); DrawModels(shader, control); if (Runtime.renderNormalsPoints) { shader = OpenTKSharedResources.shaders["BFRES_Normals"]; shader.UseProgram(); shader.SetMatrix4x4("camMtx", ref camMat); shader.SetMatrix4x4("mtxProj", ref projMat); shader.SetMatrix4x4("mtxCam", ref computedCamMtx); shader.SetMatrix4x4("mtxMdl", ref mdlMat); shader.SetFloat("normalsLength", Runtime.normalsLineLength); DrawModels(shader, control); } GL.UseProgram(0); GL.Disable(EnableCap.DepthTest); GL.Enable(EnableCap.DepthTest); GL.Enable(EnableCap.CullFace); }